我对伊莎贝尔非常陌生,所以请怜悯。如何用这个函数证明最大的交换性?
fun max :: "nat => nat => nat" where
"max 0 0 = 0" |
"max (Suc x) 0 = Suc x" |
"max 0 (Suc x) = Suc x" |
"max (Suc x) (Suc y) = Suc (max x y)"
lemma "max x y = max y x"
? ? ?
我知道
可以很容易地证明这一点definition max :: "nat ⇒ nat ⇒ nat" where
"max x y = (if x ≥ y then x else y)"
lemma "max x y = max y x"
apply(simp add:max_def)
done
这不是家庭作业。我真的很好奇,并且想尽可能多地了解伊莎贝尔和数学证明。谢谢你的时间。
答案 0 :(得分:2)
证明关于递归定义函数的一些事实的典型方法是通过归纳,其中归纳的结构遵循递归定义的结构。
在Isabelle中,您可以使用induct
方法进行归纳。如果您为自然数induct n
写n
,则会遇到两种情况:n = 0
的情况和n
是某事物的继承者的情况。
在这种情况下,您应该使用函数包为max
提供的归纳规则,该规则称为max.induct
。所以,只需对你的目标apply (induction x y rule: max.induct)
,然后看看你剩下的是什么。这足以满足您的要求。
但是,您已经提到了替代定义if x ≥ y then x else y
。对于该定义,一些证明(如max
的关联性)可能更容易。在这种情况下,您可以简单地将此替代定义证明为
lemma max_altdef: "max x y = (if x ≥ y then x else y)"
然后在任何情况下使用哪种定义更方便。 max_altdef
的证明也是一种简单的归纳。