我想证明一些关于datatype_new
和codatatype
的基本事实:第一个没有无限元素,而后者确实有一个。
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包证明的事实中推导出这个定理。
我如何证明这些?
答案 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
你基本上在导入中得到了两个案例:
Zero = Successor Zero ⟹ False
⋀x. (x = Successor x ⟹ False) ⟹
Successor x = Successor (Successor x) ⟹ False
第一个子目标是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或新的数据类型包。