为了学习目的,我试图重新创建自然数的简化版本(因为它涉及归纳定义、递归函数等......)。然而,在那个过程中,我陷入了一些我认为非常微不足道的事情。
基本上,我有一个自然数的natt
定义 ' ' 和一个 ' <
' 关系的定义:
datatype natt = Zero | Succ natt
primrec natt_less :: "natt ⇒ natt ⇒ bool" (infixl "<" 75) where
"natt_less n Zero = False"
| "natt_less n (Succ m') = (case n of Zero ⇒ True | Succ n' ⇒ natt_less n' m')"
从这些,我试图证明<
关系的 3 个基本属性:
- 非反身性:
~ (a < a)
- 非对称:
a < b ⟹ ~ (b < a)
- 传递性:
a < b ⟹ b < c ⟹ a < c
我能够证明第一个,但不能证明其他。更让我吃惊的是,有一些子引理可以帮助解决这些问题,例如Succ a < b ⟹ a < b
或a < b ⟹ a < Succ b
,这似乎更加微不足道,但即使经过多次尝试a < b ∨ a = b ∨ b < a
,我也无法证明。似乎只有其中一个(包括and )足以证明其余部分,但我无法证明其中任何一个。2.
3.
我主要是尝试使用归纳法。加上我自己做出定义的事实,有两种可能性 - 我的定义是错误的,并且没有所需的属性,或者我缺少一些方法/参数。所以,我有两个问题:
- 我的定义是否错误(即它不能准确表示
<
并且缺少所需的属性)?如果是这样,我该如何解决? - 如果不是,我如何证明这些看似微不足道的性质?
就上下文而言,我目前的尝试是通过归纳,我可以证明基本情况,但总是陷入归纳情况,不知道在哪里进行假设,例如在这个例子中:
lemma less_Succ_1: "Succ a < b ⟹ a < b"
proof (induction b)
case Zero
assume "Succ a < Zero"
then have "False" by simp
then show ?case by simp
next
case (Succ b)
assume "(Succ a < b ⟹ a < b)" "Succ a < Succ b"
then show "a < Succ b" oops