给出一个生成相同项目列表的函数,我希望证明所生成的列表在所有位置上均具有给定的自然数,而与列表长度无关。
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也似乎是归纳变量的候选者。感谢您提供有关如何继续进行此证明的帮助。
答案 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