我有这两个定义。他们为什么展开的方式不同?我怎样才能证明" oops" -ed lemmas? (总的来说,Isabelle中这两个定义在内部有什么区别?)
(请不要将我引导到外部链接,因为我通常会被那里的信息所淹没。)
definition "f x y = x+y"
definition "g ≡ λx y. x+y"
value "f 1 2" (* "1 + (1 + 1)" :: "'a" *)
value "g 1 2" (* "1 + (1 + 1)" :: "'a" *)
value "f 1" (* "op + 1" :: "'a ⇒ 'a" *)
value "g 1" (* "op + 1" :: "'a ⇒ 'a" *)
value "f" (* "op +" :: "'a ⇒ 'a ⇒ 'a" *)
value "g" (* "op +" :: "'a ⇒ 'a ⇒ 'a" *)
lemma "f x y≡g x y"
apply (simp add:f_def g_def)
done
lemma "f x ≡g x"
apply (simp add:f_def g_def)
(* f x ≡ op + x *)
oops
lemma "f ≡ g"
apply (simp add:f_def g_def)
(* f ≡ op + *)
oops
答案 0 :(得分:1)
左边的显式参数定义(如f x y = x + y
)和右边的lambdas定义(如g = (%x y. x + y)
)之间的区别是你得到的定义方程式。< / p>
前者是
f_def: "f ?x ?y = ?x + ?y"
(即,如果f
的所有参数都存在,则该等式仅适用于,因此它既不适用于f
,也不适用于部分应用{{1例如)和后者
f x
(其中g_def: "g = op +"
只是op +
的语法糖;请注意,与前者相比,此等式适用于 %x y. x + y
的每个次出现无论如何)。
有两种常用技术可用于处理部分应用的函数与具有显式参数列表的函数。
属性g
将带有参数的等式转换为带有lambdas的等式。例如,[abs_def]
会产生f_def [abs_def]
。
引理f = op +
(对于扩展性)显式地为函数之间的方程式添加了参数。
ext
对于你的lemmas,这种技术中的任何一种都足够了。在您的校对尝试中每次出现ext: "(!!x. ?f x = ?g x) ⟹ ?f = ?g"
时都要添加[abs_def]
或执行以下操作。
f_def
lemma "f x = g x"
apply (intro ext)
apply (simp add: f_def g_def)
done
lemma "f = g"
apply (intro ext)
apply (simp add: f_def g_def)
done
尽可能多地应用intro
(由函数类型决定)。
注意我在上述证明中使用了HOL等式(ext
)而不是纯等式(op =
)。虽然两者在逻辑上是等价的,但引理op ≡
仅适用于前者。作为一般规则:Isabelle / HOL尽可能坚持ext
。