证明生成列表的属性

时间:2018-10-11 14:09:22

标签: isabelle

我的目的是证明包含生成模式的列表的属性。 在第一个示例中,模式只是一个0的序列,引理pattern_0_len证明生成的列表的长度确实等于生成器函数的长度参数。

theory pattern_0
imports Main
begin

fun pattern_0 :: "nat ⇒ nat list" where
"pattern_0 0 = []" |
"pattern_0 len =  (pattern_0 (len - 1)) @ [0]"

lemma pattern_0_len [simp]: "length (pattern_0 lng) = lng"
apply(induction lng)
apply(simp)
apply(auto)
done

end

在第二个示例中,生成器生成的序列为0、1。

theory pattern_0_1
imports Main
begin

fun pattern_0_1 :: "nat ⇒ nat ⇒ nat list" where
"pattern_0_1 0 item  = []" |
"pattern_0_1 len item =  (pattern_0_1 (len - 1) (if item = 0 then 1 else 0)) @ [item]"

lemma pattern_0_1_len [simp]: "length (pattern_0_1 lng item) = lng"
apply(induction lng)
apply(simp)
apply(auto)
done

end

不幸的是,pattern_0_1_len不能证明(简单地说,目标就是诱导步骤),我想了解为什么不这样做。是否存在item参数会“混淆” Isabelle?在这种情况下可以做些什么,最好不要声明任何有关模式生成方式的信息?

1 个答案:

答案 0 :(得分:1)

附加参数确实是问题所在。例如,考虑以下子目标:

1. ⋀lng. length (pattern_0_1 lng 0) = lng ⟹ item = 0 ⟹ length (pattern_0_1 lng (Suc 0)) = lng

您看到归纳假设仅适用于零,但是您需要一个。

解决方法很简单:

apply(induction lng arbitrary: item)

这指示归纳方法首先泛化变量item。然后,归纳假设变得更广泛适用。