inductive_set S🪙1 and A🪙1 and B🪙1 where "[] ∈ S🪙1"
| "w ∈ A🪙1 ==> b # w ∈ S🪙1"
| "w ∈ B🪙1 ==> a # w ∈ S🪙1"
| "w ∈ S🪙1 ==> a # w ∈ A🪙1"
| "w ∈ S🪙1 ==> b # w ∈ S🪙1"
| "[v ∈ B🪙1; v ∈ B🪙1]==> a # v @ w ∈ B🪙1"
inductive_set S🪙2 and A🪙2 and B🪙2 where "[] ∈ S🪙2"
| "w ∈ A🪙2 ==> b # w ∈ S🪙2"
| "w ∈ B🪙2 ==> a # w ∈ S🪙2"
| "w ∈ S🪙2 ==> a # w ∈ A🪙2"
| "w ∈ S🪙2 ==> b # w ∈ B🪙2"
| "[v ∈ B🪙2; v ∈ B🪙2]==> a # v @ w ∈ B🪙2"
inductive_set S🪙3 and A🪙3 and B🪙3 where "[] ∈ S🪙3"
| "w ∈ A🪙3 ==> b # w ∈ S🪙3"
| "w ∈ B🪙3 ==> a # w ∈ S🪙3"
| "w ∈ S🪙3 ==> a # w ∈ A🪙3"
| "w ∈ S🪙3 ==> b # w ∈ B🪙3"
| "[v ∈ B🪙3; w ∈ B🪙3]==> a # v @ w ∈ B🪙3"
inductive_set S🪙4 and A🪙4 and B🪙4 where "[] ∈ S🪙4"
| "w ∈ A🪙4 ==> b # w ∈ S🪙4"
| "w ∈ B🪙4 ==> a # w ∈ S🪙4"
| "w ∈ S🪙4 ==> a # w ∈ A🪙4"
| "[v ∈ A🪙4; w ∈ A🪙4]==> b # v @ w ∈ A🪙4"
| "w ∈ S🪙4 ==> b # w ∈ B🪙4"
| "[v ∈ B🪙4; w ∈ B🪙4]==> a # v @ w ∈ B🪙4"
code_pred (expected_modes: o => bool, i => bool) S🪙4p .
hide_const a b
section‹Semantics of programming languages›
subsection‹IMP›
type_synonym var = nat type_synonym state = "int list"
datatype com =
Skip |
Ass var "state => int" |
Seq com com | IF"state => bool" com com |
While "state => bool" com
inductive exec :: "com => state => state => bool"where "exec Skip s s" | "exec (Ass x e) s (s[x := e(s)])" | "exec c1 s1 s2 ==> exec c2 s2 s3 ==> exec (Seq c1 c2) s1 s3" | "b s ==> exec c1 s t ==> exec (IF b c1 c2) s t" | "~b s ==> exec c2 s t ==> exec (IF b c1 c2) s t" | "~b s ==> exec (While b c) s s" | "b s1 ==> exec c s1 s2 ==> exec (While b c) s2 s3 ==> exec (While b c) s1 s3"
datatype type =
Atom nat
| Fun type type (infixr‹==>› 200)
datatype dB =
Var nat
| App dB dB (infixl‹🍋› 200)
| Abs type dB
primrec
nth_el :: "'a list ==> nat ==> 'a option" (‹_⟨_⟩› [90, 0] 91) where "[]⟨i⟩ = None"
| "(x # xs)⟨i⟩ = (case i of 0 ==> Some x | Suc j ==> xs ⟨j⟩)"
inductive nth_el' :: "'a list ==> nat ==> 'a ==> bool" where "nth_el' (x # xs) 0 x"
| "nth_el' xs i y ==> nth_el' (x # xs) (Suc i) y"
inductive typing :: "type list ==> dB ==> type ==> bool" (‹_ ⊨ _ : _› [50, 50, 50] 50) where
Var [intro!]: "nth_el' env x T ==> env ⊨ Var x : T"
| Abs [intro!]: "T # env ⊨ t : U ==> env ⊨ Abs T t : (T ==> U)"
| App [intro!]: "env ⊨ s : T ==> U ==> env ⊨ t : T ==> env ⊨ (s 🍋 t) : U"
primrec
lift :: "[dB, nat] => dB" where "lift (Var i) k = (if i < k then Var i else Var (i + 1))"
| "lift (s 🍋 t) k = lift s k 🍋 lift t k"
| "lift (Abs T s) k = Abs T (lift s (k + 1))"
primrec
subst :: "[dB, dB, nat] => dB" (‹_[_'/_]› [300, 0, 0] 300) where
subst_Var: "(Var i)[s/k] = (if k < i then Var (i - 1) else if i = k then s else Var i)"
| subst_App: "(t 🍋 u)[s/k] = t[s/k] 🍋 u[s/k]"
| subst_Abs: "(Abs T t)[s/k] = Abs T (t[lift s 0 / k+1])"
inductive beta :: "[dB, dB] => bool" (infixl‹→🪙β› 50) where
beta [simp, intro!]: "Abs T s 🍋 t →🪙β s[t/0]"
| appL [simp, intro!]: "s →🪙β t ==> s 🍋 u →🪙β t 🍋 u"
| appR [simp, intro!]: "s →🪙β t ==> u 🍋 s →🪙β u 🍋 t"
| abs [simp, intro!]: "s →🪙β t ==> Abs T s →🪙β Abs T t"
code_pred (expected_modes: i => i => o => bool, i => i => i => bool) typing . thm typing.equation
code_pred (modes: i => i => bool, i => o => bool as reduce') beta . thm beta.equation
| IfTrue: "bval b s ==> (c🪙1,s) ==> t ==> (IF b THEN c🪙1 ELSE c🪙2, s) ==> t"
| IfFalse: "¬bval b s ==> (c🪙2,s) ==> t ==> (IF b THEN c🪙1 ELSE c🪙2, s) ==> t"
| WhileFalse: "¬bval b s ==> (WHILE b DO c,s) ==> s"
| WhileTrue: "bval b s🪙1 ==> (c,s🪙1) ==> s🪙2 ==> (WHILE b DO c, s🪙2) ==> s🪙3 ==> (WHILE b DO c, s🪙1) ==> s🪙3"
code_pred big_step .
thm big_step.equation
definition list :: "(nat ==> 'a) ==> nat ==> 'a list"where "list s n = map s [0 ..< n]"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.