以伊莎贝尔自然数不等式的以下定义为例:
inductive unequal :: "nat ⇒ nat ⇒ bool" where
zero_suc: "unequal 0 (Suc _)" |
suc_zero: "unequal (Suc _) 0" |
suc_suc: "unequal n m ⟹ unequal (Suc n) (Suc m)"
我想证明unequal
的反身性,即¬ unequal n n
。为了便于说明,让我首先证明人为的引理¬ unequal (n + m) (n + m)
:
lemma "¬ unequal (n + m) (n + m)"
proof
assume "unequal (n + m) (n + m)"
then show False
proof (induction "n + m" "n + m" arbitrary: n m)
case zero_suc
then show False by simp
next
case suc_zero
then show False by simp
next
case suc_suc
then show False by presburger
qed
qed
在前两种情况下,False
必须从假设0 = n + m
和Suc _ = n + m
中推断出来,这是微不足道的。
我希望¬ unequal n n
的证明可以用类似的方式完成,也就是说,按照以下模式:
lemma "¬ unequal n n"
proof
assume "unequal n n"
then show False
proof (induction n n arbitrary: n)
case zero_suc
then show False sorry
next
case suc_zero
then show False sorry
next
case suc_suc
then show False sorry
qed
qed
特别是,我希望在前两种情况下,我得到假设0 = n
和Suc _ = n
。但是,我根本没有任何假设,这意味着我被要求从零开始证明False
。为什么会这样,我怎样才能进行不平等的证明?
答案 0 :(得分:1)
你引导unequal
。相反,你应该导入n
,如下所示:
lemma "¬ (unequal n n)"
proof (induct n)
case 0
then show ?case sorry
next
case (Suc n)
then show ?case sorry
qed
然后我们可以在标有sorry
的每个子目标上使用Sledgehammer。 Sledgehammer(CVC4)建议我们完成以下证明:
lemma "¬ (unequal n n)"
proof (induct n)
case 0
then show ?case using unequal.cases by blast
next
case (Suc n)
then show ?case using unequal.cases by blast
qed
答案 1 :(得分:1)
induction
方法以不同方式处理变量实例化和非变量实例化。非变量实例化t
是x ≡ t
的简写,其中x
是一个新变量。因此,归纳在x
上完成,上下文还包含定义x ≡ t
。
因此,第一次证明中的(induction "n + m" "n + m" arbitrary: n m)
相当于具有上述效果的(induction k ≡ "n + m" l ≡ "n + m" arbitrary: n m)
。要为第二个证明获得此效果,您必须将(induction n n arbitrary: n)
替换为(induction k ≡ n l ≡ n arbitrary: n)
。这些假设实际上变得如此简单,以至于由induction
方法运行的预简化器可以从它们派生False
。因此,没有任何案例需要证明,您可以用proof
替换整个内部qed
- by (induction k ≡ n l ≡ n arbitrary: n)
块。