2015-07-27 2 views
3

Я пытаюсь ввести и доказать спецификации Z в Isabelle.Z в Isabelle

Скажет, у меня есть спецификация торгового автомата написано в формате LaTeX:

\begin{zed} 
    price:\nat 
    \end{zed} 

\begin{schema}{VMSTATE} 
    stock, takings: \nat 
    \end{schema} 

\begin{schema}{VM\_operation} 
    \Delta VMSTATE \\ 
    cash\_tendered?, cash\_refunded!: \nat \\ 
    bars\_delivered! : \nat 
    \end{schema} 

\begin{schema}{exact\_cash} 
    cash\_tendered?: \nat 
    \where 
    cash\_tendered? = price 
    \end{schema} 

Я не знаю, если я должен поставить схему в качестве чешуй или функций?

Это то, что я до сих пор:

theory vendingmachine 
imports 
Main Fact "~~/src/HOL/Hoare/Hoare_Logic" 

begin 
type_synonym price = nat 

type_synonym stock = nat 

type_synonym takings = nat 

type_synonym cash_tendered = nat 

function exact_cash "(cash_tendered:nat)" 
where 
cash_tendered ≡ price; 
end 

Тип синонимы отлично работают, однако, когда я к точной кассовой схеме, которую я перевел в качестве exact_cash функции я получаю ошибки.

Итак, я хотел бы просто знать, как вводить схему в isabelle.

+0

Я думаю, что не так много людей здесь, говорящих как Изабеллу и Z. Таким образом, может быть, вы можете объяснить семантику вашего Z спецификация? –

+0

Также кажется, что вы объединяете типы и термины: 'type_synonym price = nat' определяет тип, позже на вас (попытайтесь) определить термин' cash_tendered' равным значению 'price' (которое вы нигде не определили). –

ответ

2

Некоторые люди разработали frameworks for Z-specifications in Isabelle/HOL (other link) десять лет назад. (Насколько я знаю, они больше не поддерживаются, но, возможно, они могут помочь вам.)

Обычно спецификации Z могут быть легко переписаны в спецификации TLA. Таким образом, вы также можете попытаться использовать активно поддерживаемый HOL-TLA-session Isabelle.

Но давайте сначала придерживаться общей Изабель/HOL.

Кодирование ваш фрагмент Z-спецификации в виде простого Isabelle/HOL будет выглядеть примерно так:

theory VendingMachine 
imports 
    Main 
begin 

--"record datatype for the state variables" 
record VMSTATE = 
    stock :: nat 
    takings :: nat 

--"a vending machine is parameterized over a price constant" 
locale VendingMachine = 
fixes price :: nat 
begin 

definition VM_operation :: 
    "VMSTATE ⇒ VMSTATE ⇒ nat ⇒ nat ⇒ nat ⇒ bool" 
where "VM_operation vmstate vmstate' cash_tendered cash_refunded bars_delivered ≡ 
    True" --"TODO: specify predicate" 

definition exact_cash :: 
    "nat ⇒ bool" 
where "exact_cash cash_tendered ≡ 
    cash_tendered = price" 

end 

end 

Обратите внимание, что я уронил различие между входом и выходными переменными. Дельта-переменная VMSTATE в VM_operation разделена на vmstate и vmstate'.

Чтобы действительно работать с такой спецификацией, вам понадобится еще несколько вспомогательных определений. Так, например, пространство состояний спецификации, то можно было бы определить как индуктивный предикат, как, например:

inductive_set state_space :: "VMSTATE set" 
where 
    Init: "⦇ stock = 10, takings = 0 ⦈ ∈ state_space" 
    --"some initial state for the sake of a meaningful definition...." 
| Step: "vmstate ∈ state_space 
∧ (∃ cash_tendered cash_refunded bars_delivered . 
    VM_operation vmstate vmstate' cash_tendered cash_refunded bars_delivered) 
⟹ vmstate' ∈ state_space" 
+1

Вау, спасибо за этот ответ очень подробно и точно, что мне нужно! – lburski

+0

им пытаются добавить определение схемы определения some_stock :: «нац ⇒ BOOL» где «some_stock запас = (запас> 0)» но получаю сообщение об ошибке «Тип объединения не удалось: Clash типов„_ _ ⇒“ и «nat» «каково будет типизация этого определения? – lburski

+1

Вам нужно прочитать полный намек, который включает в себя: «Операнд: запас :: ??» VMSTATE_scheme ⇒ nat »... Проблема в том, что имя« запас »уже используется для селектора записей - поэтому вы должны переименовать ваша переменная в определении. –