簡體   English   中英

這個伊莎貝爾證明有什么問題?

[英]What is wrong with this Isabelle proof?

此模式生成器在給定 position 處生成具有給定數字的列表,所有其他值為零。

fun pattern_one_value :: "nat ⇒ nat ⇒ nat ⇒ nat ⇒ nat list" where
"pattern_one_value _   _    _   0   = []" |
"pattern_one_value pos pos1 val lng = 
    (if pos = pos1 then val else 0) # (pattern_one_value pos (pos1 + 1) val (lng - 1))"

以下引理旨在證明生成的列表在給定的 position 處包含正確的值。

lemma pattern_one_value_check [simp]: "∀pos val. pos < lng ⟹ pattern_one_value pos 0 val lng ! pos = val"
    proof(induct lng)
        case 0         then show ?case by simp
    next
        case (Suc lng) then show ?case by auto
    qed

這似乎是一個正確的證明; 但是,將生成器 function 的 cons 表達式中的val更改為任意數字,例如(if pos = pos1 then 7 else 0) #... ,證明仍然成立,因為基礎假設和歸納假設都是錯誤的。 我哪里錯了? 謝謝你的幫助。

這似乎是一個正確的證明; 但是,將生成器 function 的 cons 表達式中的 val 更改為任意數字,例如(if pos = pos1 then 7 else 0) #... ,證明仍然成立,因為基礎假設和歸納假設都是錯誤的。 我哪里錯了?

我相信這個問題與試圖將 HOL 的全稱量詞視為等同於 Pure 的全稱量詞的嘗試有關。 實際上,如您的問題所述,可以從定理pattern_one_value_check的前提證明任何事情。 的確:

lemma pattern_one_value_check'[simp]:
  "(∀pos val::nat. pos < (lng::nat)) = False"
  by auto

lemma pattern_one_value_check''[simp]: 
  "(∀pos val::nat. pos < (lng::nat)) ⟹ P"
  by auto

我相信你的意思是在定理的陳述中使用Pure的全稱量化,例如

lemma pattern_one_value_check [simp]: 
  "⋀pos val. pos < lng ⟹ pattern_one_value pos 0 val lng ! pos = val"
proof(induct lng)
  case 0 then show ?case by simp
next
  case (Suc lng) then show ?case sorry
qed

事實上,即使這樣也沒有必要。 以下定理一旦被證明,將在上下文中與上述定理相同:

lemma pattern_one_value_check' [simp]: 
  "pos < lng ⟹ pattern_one_value pos 0 val lng ! pos = val"
proof(induct lng)
  case 0 then show ?case by simp
next
  case (Suc lng) then show ?case sorry
qed

如果您尋求更詳細的解釋,請參閱 Isar-ref 中的第 2.1 節和文檔“Isabelle/HOL 中的編程和證明”,兩者都是官方文檔的一部分。


作為旁注,我不得不提一下,也許有一種更簡單的方法來定義pattern_one_value 在這種情況下, pattern_one_value_check的證明似乎也更容易:

definition pattern_one_value :: "nat ⇒ nat ⇒ nat ⇒ nat list"
  where "pattern_one_value val pos len = list_update (replicate len 0) pos val"

lemma pattern_one_value_check:
  assumes "pos < len" 
  shows "pattern_one_value val pos len ! pos = val"  
  using assms unfolding pattern_one_value_def
  apply(induct len)
  subgoal by auto
  subgoal by (metis length_replicate nth_list_update)
  done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM