因此,这种模式基本上是在单独的函数中定义和证明函数的困难子类,然后将它们组合成主函数。这当然会使证明更容易。
fun plus :: "aexp â aexp â aexp" where
"plus (N i1) (N i2) = N(i1+i2)" |
"plus (N i) a = (if i = 0 then a else Plus (N i) a)" |
"plus a (N i) = (if i = 0 then a else Plus a (N i))" |
"plus a1 a2 = Plus a1 a2"
lemma aval_plus [simp]:
"aval (plus a1 a2) s = aval a1 s + aval a2 s"
apply(induction a1 a2 rule: plus.induct)
apply auto
done
这些事实的结合体现在:
fun asimp :: "aexp â aexp" where
"asimp (N n) = N n" |
"asimp (V x) = V x" |
"asimp (Plus a1 a2) = plus (asimp a1) (asimp a2)"
最后的证明更简单:
theorem aval_asimp[simp]:
"aval (asimp a) s = aval a s"
apply(induction a)
apply (auto)
done