如何证明有关数据类型和编码类型的基本事实?

时间:2014-07-12 11:13:31

标签: isabelle

我想证明一些关于datatype_newcodatatype的基本事实:第一个没有无限元素,而后者确实有一个。

theory Co 
imports BNF 

begin 

datatype_new natural = Zero | Successor natural   

lemma "¬ (∃ x. x = Successor x)" 
oops 

codatatype conat = CoZero | CoSucc conat 

lemma "∃ x. x = CoSucc x" 
oops 

问题在于我无法提出纸笔证明,更不用说证明脚本了。

第一个想法是使用size函数,它有一个定理

size (Successor ?natural) = size ?natural + Suc 0

以某种方式使用size是一个函数,将其应用于原始等式的两边,不能有一个等于其后继的自然数。但我不知道如何将其正式化。

对于后者,我甚至不知道如何从codatatype包证明的事​​实中推导出这个定理。

我如何证明这些?

1 个答案:

答案 0 :(得分:3)

就个人而言,我不知道有关编码类型的第一件事。但是,让我尽力帮助你。

您发布的第一个引理可以由sledgehammer自动验证。它使用size函数找到证据,有效地将natural上的问题减少到nat上的同一问题:

by (metis Scratch.natural.size(2) n_not_Suc_n nat.size(4) size_nat)

如果你想要这个证明的一个非常基本的,逐步的版本,你可以这样写:

lemma "¬(∃x. x = Successor x)" 
proof clarify
  fix x assume "x = Successor x"
  hence "size x = size (Successor x)" by (rule subst) (rule refl)
  also have "... = size x + Suc 0" by (rule natural.size)
  finally have "0 = Suc 0"  by (subst (asm) add_0_iff) (rule sym)
  moreover have "0 ≠ Suc 0" by (rule nat.distinct(1))
  ultimately show False by contradiction
qed

如果你想要一个更“基本”的证据,不使用HOL自然数,你可以使用natural上的归纳法通过矛盾来证明:

lemma "¬(∃x. x = Successor x)" 
proof clarify
  fix x assume "x = Successor x"
  thus False by (induction x) simp_all
qed

你基本上在导入中得到了两个案例:

  1. Zero = Successor Zero ⟹ False
  2. ⋀x. (x = Successor x ⟹ False) ⟹ Successor x = Successor (Successor x) ⟹ False
  3. 第一个子目标是natural.distinct(1)的直接结果,第二个子目标可以使用natural.inject简化为归纳假设。由于这些规则在simpset中,simp_all可以自动解决。

    关于第二个引理,我能想到的唯一解决方案是使用primcorec显式构造无限元素:

    primcorec infinity :: conat where
      "infinity = CoSucc infinity"
    

    然后你可以通过展开定义来证明你的第二个引理:

    lemma "∃x. x = CoSucc x" 
    proof
      show "infinity = CoSucc infinity" by (rule infinity.ctr)
    qed
    
    警告:这些证明有效,但我不确定它们是否是解决此问题的最简单和/或最优雅的解决方案。我几乎不知道codatatypes或新的数据类型包。