我有一个相当大的术语foo
。当我输入
value "foo"
然后Isabelle将foo
评估为一个值,比如说foo_value
。我现在想证明以下引理。
lemma "foo = foo_value"
我应该使用哪种证明方法?我试过了try
,但那时已经过了。我想我可以通过展开foo
中出现的各种定义来手动进行,但我当然应该能够使用value
命令正在使用的任何机制,对吗?
答案 0 :(得分:4)
有三种证明方法与value
的不同评估机制相对应:
eval
使用代码生成器;它对应value [code]
。如果生成的ML代码评估为True
,则证明成功。normalization
将语句编译为ML中的符号规范化引擎。它模仿value [nbe]
。code_simp
使用Isabelle的简化程序作为评估程序。它对应value [simp]
。 tutorial on code generation更详细地描述了这些证明方法。 eval
和normalization
就像oracles一样,即他们绕过了Isabelle的内核,而code_simp
的每个评估步骤都通过内核。通常,eval
比normalization
快,normalization
比code_simp
快。
答案 1 :(得分:1)
我不确定它是否适用于所有情况,但您可以尝试:
lemma "foo = foo_value"
by eval
在许多情况下,by simp
也应该有效,我猜eval
是一种神谕(在某种意义上它没有被内核完全验证;如果我错了,请有人纠正我)。