引入两个变量?

时间:2019-03-02 18:14:43

标签: isabelle induction

给出一个生成相同项目列表的函数,我希望证明所生成的列表在所有位置上均具有给定的自然数,而与列表长度无关。

fun pattern_n :: "nat ⇒ nat ⇒ nat list" where
"pattern_n _ 0  = []" |
"pattern_n n lng = n # (pattern_n n (lng - 1))"

lemma pattern_n_1: "lng > 0 ∧ pos ≥ 0 ∧ pos < lng ∧ n ≥ 0 ⟹ (pattern_n n lng ! pos) = n"

显然,证明应基于对所生成列表的长度的归纳,但pos也似乎是归纳变量的候选者。感谢您提供有关如何继续进行此证明的帮助。

1 个答案:

答案 0 :(得分:1)

函数pattern_n等同于标准库(理论replicate)中的函数List。标准库还包含函数nth_replicate的定理replicate,该定理与您要证明的定理几乎相同:

fun pattern_n :: "nat ⇒ nat ⇒ nat list" where
  "pattern_n _ 0  = []" |
  "pattern_n n lng = n # (pattern_n n (lng - 1))"

lemma "pattern_n n k = replicate k n"
  by (induction k) auto

thm nth_replicate

更新

或者,您可以使用归纳法来证明结果。通常,以下面的函数pattern_n'提供的形式使用定义会更方便,因为在定义函数时自动生成的定理与该形式更加一致。

fun pattern_n :: "nat ⇒ nat ⇒ nat list" where
  "pattern_n _ 0  = []" |
  "pattern_n n lng = n # (pattern_n n (lng - 1))"

fun pattern_n' :: "nat ⇒ nat ⇒ nat list" where
  "pattern_n' n 0  = []" |
  "pattern_n' n (Suc lng) = n # (pattern_n' n lng)"

lemma "pattern_n n lng = pattern_n' n lng"
  by (induct lng) auto

lemma pattern_n_1_via_replicate: 
  "pos < lng ⟹ (pattern_n val lng) ! pos = val"
proof(induct lng arbitrary: pos)
  case 0 then show ?case by simp
next
  case (Suc lng) then show ?case by (fastforce simp: less_Suc_eq_0_disj)
qed