Isabelle “递归”基本性质的证明;少于;伊莎贝尔对自然的定义

Isabelle “递归”基本性质的证明;少于;伊莎贝尔对自然的定义,isabelle,proof,isar,Isabelle,Proof,Isar,为了便于学习,我试图重新创建自然数的简化版本(因为它涉及归纳定义、递归函数等)。然而,在这个过程中,我陷入了一些我认为非常琐碎的事情 基本上,我对自然数“natt”和“有一个定义。在用户9716869提供了一些提示之后,很明显,我的主要问题是对归纳法中的任意选项缺乏了解。使用(归纳法)和(案例)(详细信息请参见),证明非常直接 由于这些都是为了教育目的而做的,下面的证明不是为了简洁,而是为了让每一步都非常清楚。如果需要更多的自动化,其中大部分可以大大减少,有些可以在一行中完成(我在引理下面留下了

为了便于学习,我试图重新创建自然数的简化版本(因为它涉及归纳定义、递归函数等)。然而,在这个过程中,我陷入了一些我认为非常琐碎的事情

基本上,我对自然数“
natt
”和“
有一个定义。在用户9716869提供了一些提示之后,很明显,我的主要问题是对
归纳法
中的
任意
选项缺乏了解。使用
(归纳法)
(案例)
(详细信息请参见),证明非常直接

由于这些都是为了教育目的而做的,下面的证明不是为了简洁,而是为了让每一步都非常清楚。如果需要更多的自动化,其中大部分可以大大减少,有些可以在一行中完成(我在引理下面留下了一条评论)


注:在这些证明中,我们使用了一个关于归纳类型的隐式引理,它们的内射性(这意味着
(succa=succb)≡ (a=b)
零≠ 成功
)。此外,
(成功a<成功b)≡ (a
根据定义

首先,我们证明了两个有用的引理:

  • a
  • b≠ 零⟷ (∃ b'.b=succb')
更大的引理不是零引理[simp]:“a
有了这些,我们可以证明3个主要陈述:

  • 非自反性:
    ~(a
  • 不对称:
    a
  • 及物性:
    a
lemmaless\u not\u refl[simp]:“-a
我现在几乎没有时间写答案。然而,这些定义乍一看很好,而且,按照惯例,归纳法的证明应该是有效的(有时用
案例证明就足够了)。考虑<代码>感应的接口有附加的特性(见ISAR REF)。例如,您可以编写
(归纳a任意:b)
(这已经通过
大锤
证明了非对称性)。也可以考虑通过代码< >实例< /COD>和归纳和/或执行多次归纳,而不是<代码>案例< /代码>,可以使用<代码>自动分割:NATT。有了独断的建议和大锤,你会成功的。哦,你不必重复Isar证明中的假设,就像你所做的那样:它们已经在称为
Zero
Succ
的理论中了。@MathiasFleury事实上,我只是添加假设,以使证明更具可读性。关于sledgehammer,它确实给了我一个证明,但我不太明白
metis
是如何做到这一点的,所以我希望创建一个更容易理解的逐步证明。谢谢你的提示,我将尝试一下——你的和@user9716869的——看看我是否能创建一个长格式的证明。好吧,你不需要添加
案例
。。。。只需通过
假设
进行假设。它的可维护性较差,但如果您发现更具可读性…@MathiasFleury我对
假设的观点不是再次“假设”,而是明确地陈述并更清楚地说明假设了什么。我可以看出
case uu假设u
让我看起来像是在假设额外的东西,但我不知道更好的方法。今天我学习了
note
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')"
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
lemma greater_not_Zero [simp]: "a < b ⟹ b ≠ Zero"
  (*by clarsimp*)
proof
  assume "a < b" "b = Zero"
  then have "a < Zero" by simp
  then show "False" by simp
qed

lemma not_Zero_is_Succ: "b ≠ Zero ⟷ (∃ b'. b = Succ b')"
  (*by (standard, cases b) auto*)
proof
  show "b ≠ Zero ⟹ ∃ b'. b = Succ b'"
  proof (cases b)
    case Zero
    assume ‹b ≠ Zero› 
    moreover note ‹b = Zero›
    ultimately show "∃b'. b = Succ b'" by contradiction
  next
    case (Succ b')
    assume ‹b ≠ Zero› 
    note ‹b = Succ b'› 
    then show "∃b'. b = Succ b'" by simp
  qed
next
  assume "∃ b'. b = Succ b'"
  then obtain b'::natt where "b = Succ b'" by clarsimp
  then show "b ≠ Zero" by simp
qed
lemma less_not_refl [simp]: "¬ a < a"
  (*by (induction a) auto*)
proof (induction a)
  case Zero
  show "¬ Zero < Zero" by simp
next
  case (Succ a)
  note IH = ‹¬ a < a›
  show "¬ Succ a < Succ a" 
  proof
    assume "Succ a < Succ a"
    then have "a < a" by simp
    then show "False" using IH by contradiction
  qed
qed

lemma less_not_sym: "a < b ⟹ ¬ b < a"
proof (induction a arbitrary: b)
  case Zero
  then show "¬ b < Zero" by simp
next
  case (Succ a)
  note IH = ‹⋀b. a < b ⟹ ¬ b < a› 
    and IH_prems = ‹Succ a < b›
  show "¬ b < Succ a"
  proof
    assume asm:"b < Succ a"

    have "b ≠ Zero" using IH_prems by simp
    then obtain b'::natt where eq: "b = Succ (b')" 
      using not_Zero_is_Succ by clarsimp
    then have "b' < a" using asm by simp
    then have "¬ a < b'" using IH by clarsimp
    moreover have "a < b'" using IH_prems eq by simp
    ultimately show "False" by contradiction
  qed
qed

lemma less_trans [trans]: "a < b ⟹ b < c ⟹ a < c"
proof (induction c arbitrary: a b)
  case Zero
  note ‹b < Zero›
  then have "False" by simp
  then show ?case by simp
next 
  case (Succ c)
  note IH = ‹⋀a b. a < b ⟹ b < c ⟹ a < c› 
    and IH_prems = ‹a < b› ‹b < Succ c›
  show "a < Succ c"
  proof (cases a)
    case Zero
    note ‹a = Zero›
    then show "a < Succ c" by simp 
  next 
    case (Succ a')
    note cs_prem = ‹a = Succ a'›

    have "b ≠ Zero" using IH_prems by simp
    then obtain b' where b_eq: "b = Succ b'" 
      using not_Zero_is_Succ by clarsimp
    then have "a' < b'" using IH_prems cs_prem b_eq by simp
    moreover have "b' < c" using IH_prems b_eq by simp
    ultimately have "a' < c" using IH by simp
    then show "a < Succ c" using cs_prem by simp
  qed
qed