归纳两个变量?
Induct on two variables?
给定一个生成相同项目列表的函数,我希望证明生成的列表在所有位置都包含给定的自然数,与列表长度无关。
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 似乎也是一个归纳变量候选。对于如何继续进行此证明的任何帮助,我将不胜感激。
函数pattern_n
等价于标准库中的函数replicate
(理论List
)。标准库还包含函数 replicate
的定理 nth_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
伊莎贝尔版本:伊莎贝尔2020
给定一个生成相同项目列表的函数,我希望证明生成的列表在所有位置都包含给定的自然数,与列表长度无关。
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 似乎也是一个归纳变量候选。对于如何继续进行此证明的任何帮助,我将不胜感激。
函数pattern_n
等价于标准库中的函数replicate
(理论List
)。标准库还包含函数 replicate
的定理 nth_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
伊莎贝尔版本:伊莎贝尔2020