这是一种非常简单的语言:
type_synonym vname = "string"
type_synonym bool3 = "bool option"
type_synonym env = "vname ⇒ bool3"
datatype exp = Let vname bool exp | Var vname | And exp exp
primrec val :: "exp ⇒ env ⇒ bool3" where
"val (Let var init body) e = val body (e(var ↦ init))"
| "val (Var var) e = e var"
| "val (And a b) e = (case (val a e, val b e) of
(Some x, Some y) ⇒ Some (x ∧ y) | _ ⇒ None)"
我试图证明如果表达式没有任何自由变量,那么我可以在表达式的开头声明任何新变量。我已经尝试了3种方法来证明它。
1)defined
函数检查表达式的值是否定义良好(=声明了所有使用的变量):
primrec defined :: "exp ⇒ env ⇒ bool" where
"defined (Let var init body) e = defined body (e(var ↦ init))"
| "defined (Var var) e = (var : dom e)"
| "defined (And a b) e = (defined a e ∧ defined b e)"
lemma var_intro: "defined exp env ⟹ defined exp (env(x ↦ init))"
apply (induct exp)
apply (simp_all split: if_splits)
2)另一种方法是从表达式中收集所有自由变量。如果表达式不包含任何表达式,那么我们可以向环境中添加一个新变量:
primrec freeVars :: "exp ⇒ vname set ⇒ vname set" where
"freeVars (Let var init body) e = freeVars body (insert var e)"
| "freeVars (Var var) e = (if var ∈ e then {} else {var})"
| "freeVars (And a b) e = freeVars a e ∪ freeVars b e"
lemma var_intro2: "freeVars exp {} = {} ⟹ freeVars exp {x} = {}"
apply (induct exp)
apply (simp_all split: if_splits)
3)最后一种方法是从环境中消除所有有界变量:
primrec isFree :: "vname ⇒ exp ⇒ bool" where
"isFree x (Let var init body) = (if var = x then False else isFree x body)"
| "isFree x (Var var) = (var = x)"
| "isFree x (And a b) = (isFree x a ∨ isFree x b)"
lemma var_elim: "¬ isFree x exp ⟹ val exp (env(x ↦ init)) = val exp (env)"
apply (induct exp)
apply (simp_all split: if_splits)
我无法证明任何一个引理。你能建议一个解决方案吗?
答案 0 :(得分:1)
您的证明可能会要求您在导游中将env
设置为arbitrary
,否则证明将无效。有了这个,你可能会证明你所说的属性,但我认为它会有点难看,因为你的定义和引理语句都是不必要的具体,这可能会使证明更加痛苦。
特别是你的'自由变量w.r.t.的概念一个环境'对我来说似乎有点不必要的复杂。我认为使用以下内容更容易:
primrec freeVars :: "exp ⇒ vname set" where
"freeVars (Let var init body) = freeVars body - {var}"
| "freeVars (Var var) = {var}"
| "freeVars (And a b) = freeVars a ∪ freeVars b"
声明'表达式exp
定义明确w.r.t.然后,环境env
'只是freeVars exp ⊆ dom env
。
然后很明显,任何明确定义的表达式都是w.r.t.在任何更大的环境中,某些环境也是明确定义的。
答案 1 :(得分:1)
1)你必须将集合上元素插入的通信属性提升到你的引理所基于的地图上的状态更新的属性。
lemma defined_dom: "defined exp env ⟹ dom env = dom env' ⟹ defined exp env'"
by (induction exp arbitrary: env env'; auto)
lemma defined_comm: "defined exp (env(x↦a, y↦b)) ⟹ defined exp (env(y↦b, x↦a))"
by (auto elim!: defined_dom)
lemma var_intro: "defined exp env ⟹ defined exp (env(x ↦ init))"
by (induction exp arbitrary: env; simp add: defined_comm)
2)如果您的引理基于集合,您还需要已经在库中的交际引理:
lemma var_intro2': "freeVars exp s = {} ⟹ freeVars exp (insert x s) = {}"
by (induction exp arbitrary: s x; force simp: insert_commute)
lemma var_intro2: "freeVars exp {} = {} ⟹ freeVars exp {x} = {}"
using var_intro2' .
3)同样:
lemma var_elim: "¬ isFree x exp ⟹ val exp (env(x ↦ init)) = val exp (env)"
by (induction exp arbitrary: env; simp add: fun_upd_twist split: if_splits)