这个问题是对以下问题isabelle proving commutativity for add的跟进,我的跟进时间太长,无法发表评论。如上所述的问题是显示定义如下的 add 函数的交换性:
fun add :: "nat ⇒ nat ⇒ nat" where
"add 0 n = n" |
"add (Suc m) n = Suc(add m n)"
试
theorem "add m n = add n m"
apply(induct_tac m)
apply(auto)
由于缺少引理而被卡住(在归纳情况下)。我对这个问题感到好奇,并正在探索证明它的替代方法(尽管效率较低)。假设我们定义了引理
lemma Lemma1 [simp]: "add n (Suc 0) = Suc n
哪个Isabelle可以通过归纳自动证明那么归纳步骤就是证明
Suc (add k m) = add m (Suc k)
我们可以手动完成如下
Suc (add k m)
= Suc (add m k) by the IH
= add (add m k) (Suc 0) by Lemma1 <--
= add m (add k (Suc 0)) by associativity (already proved)
= add m (Suc k) by the Lemma1 -->
但是,Isabelle 无法证明这一点,并且简化器似乎停留在第二行。但是,使用更明显的
lemma Lemma2 [simp]: "add m (Suc n) = Suc (add m n)"
而不是引理1,证明成功。它似乎能够在两个方向上使用 Lemma2,但不能使用我上面定义的 Lemma1。有谁知道为什么?我觉得我在某个地方忽略了一些明显的东西..
备注:我意识到简化器实际上只在一个方向上应用定义等,但使用启发式方法尝试将等式的两边简化为同一个术语