Isabelle 伊莎贝尔不评价引理

Isabelle 伊莎贝尔不评价引理,isabelle,Isabelle,我正在阅读简介“”并尝试做练习2.2 目前我有以下几点: theory Scratch imports Main begin fun add:: "nat ⇒ nat ⇒ nat" where "add 0 n = n" | "add (Suc m) n = Suc(add m n)" lemma add_02 [simp]: "add m 0 = m" apply(induction m) appl

我正在阅读简介“”并尝试做练习2.2

目前我有以下几点:

theory Scratch
  imports Main
begin

fun add:: "nat ⇒ nat ⇒ nat" where
"add 0 n = n" |
"add (Suc m) n = Suc(add m n)"

lemma add_02 [simp]: "add m 0 = m"
  apply(induction m)
  apply(auto)
  done

lemma succ [simp]: "Suc (add m n) = add m (Suc n)"
  apply(induction m)
  apply(auto)
  done

lemma commutativity [simp]: "add n m = add m n"
  apply(induction n)
  apply(auto)
  done

lemma add1 [simp]: "Suc m = add m (Suc 0)"
  apply(induction m)
  apply(auto)
  done
  
lemma add1_commutativ [simp]: "add n (Suc m) = add m (Suc n) "
  apply(induction n)
  apply(auto)
  done

lemma associativity [simp]: "add n (add m t) = add (add n m) t"
  apply(induction n)
  apply(auto)
  done

end
在引理中,应用(自动)有一个红色的背景色,下面的关键字
apply
done
都是蓝色而不是标准的红色

我没有收到任何错误消息。无论是在悬停时还是在输出控制台中


我做错了什么?

红色背景表示当前正在处理该行。由于
add1
引理,简化程序似乎陷入了一个无休止的循环。 如果使用
apply(subst add1)
手动重复应用引理,您可以看到这一点:

第一步<代码>添加0(Suc m)=添加m(Suc 0)

第二步<代码>添加0(添加m(Suc 0))=添加m(Suc 0)

第三步<代码>添加0(添加m(添加0(Suc 0))=添加m(Suc 0)

正如你所看到的,这个术语在每一步都会变得更大,这个过程永远不会终止

通常,您应该尝试编写公式,使右侧小于左侧,因为简化器将使用公式从左到右重写项

因此,对于您的示例,您可以将引理
add1
更改为
addm(suc0)=sucm
,证明将成功