会员证明

时间:2019-05-01 12:34:55

标签: isabelle proof

我需要证明以下内容:

lemma  "m = min_list(x#xs) ⟹ m ∈ set (x#xs)"

用简单的英语来说,我需要证明“ min_list(x#xs)”的返回值始终是(x#xs)的成员

我尝试过:

apply(induct xs)
apply(auto)

我还尝试通过使用以下命令为min_list重用现有引理:

find_theorems min_list

此目标很长,以至于我不知道如何进行。

我不是在寻找一个完整的答案,而只是在暗示如何解决这一难题。此外,对于刚刚学习Isabelle的人来说,这是一个简单的难题还是一个非常困难的难题?

1 个答案:

答案 0 :(得分:1)

扰流器:可以使用标准列表归纳法和auto来证明定理,即类似于by (induct xs ...) (auto simp: ...)的定理。我特意省略了证明中的部分,以便您自己填写。您将需要考虑是否需要将任何变量(即mx指定为arbitrary,并且还需要了解简化程序可能需要的信息(在min_list中的List)。

关于您关于问题难度的问题,我相信,难度是经验的函数。最肯定的是,当我开始学习Isabelle时,发现与您的问题类似的证明很难形式化。经过一段时间Isabelle的编码(在回答此问题之前,我必须在Isabelle中累积了相当于4-5个月的全职编码),这种问题似乎不再存在给我带来重大挑战当然,还需要考虑其他因素,例如以前有数学或逻辑方面的培训,并且有过编码经验。


正在独自学习Isabelle的人的一般建议(该建议可能与专业教练通常推荐的方法不一致)

我认为,当证明相似的结果时,重要的是要了解Isabelle主要是“笔直式”证明形式化的工具。因此,在尝试将其正式化之前,手头有“纸笔”证明很重要。在攻击类似问题时,我建议采用以下一般方法:

  1. 在纸上写下证明。
  2. 使用Isar对证明进行形式化,并提供尽可能多的详细信息,并且不必过多关注证明的长度。另外,请尽量不要依赖工具进行自动推理(即autoblastmesonmetisfastforce),并使用类似{ {1}}和rule尽可能多。
  3. 完成intro证明后,将用于自动推理的工具(例如Isarauto)应用于Isar证明,以尽可能简化证明。

当然,最终,随着学习伊莎贝尔的进步,省略1和2变得越来越容易。

我可以提供更多详细信息,例如完整的简短证明和长blast版本的证明。


更新

根据您在评论中的要求,我提供了非正式证明。

引理Isar

备注。为了完整起见,我还提供了m = min_list (x # xs) ⟹ m ∈ set (x # xs)的定义以及有关常量min_list的一些注释。 set的定义可以在理论min_list中找到:

List

隐式定义了const fun min_list :: "'a::ord list ⇒ 'a" where "min_list (x # xs) = (case xs of [] ⇒ x | _ ⇒ min x (min_list xs))" ,并构成set的{​​{1}}基础结构的一部分(请参阅文档“在Isabelle中定义(Co)数据类型和原始(Co)递归函数” / HOL”(如果是Isabelle)。特别是,它被称为数据类型的“设置函数”。 const datatype的许多基本属性可以通过检查/搜索找到,例如list。我相信定理set代表了const find_theorems list.set的主要属性(我可以随意在定理中重命名原理图变量):

thm list.set

证明。通过列表set上的结构归纳来证明。在理论set [] = {} set (?x # ?xs) = insert ?x (set ?xs) 的开头,归纳原理被称为未命名引理。为了完整起见,我在下面重申归纳原理:

xs

基本情况:假定List,并为所有"P [] ⟹ (⋀a list. P list ⟹ P (a # list)) ⟹ P list"显示xs = []。从m = min_list (x # xs) ⟹ m ∈ set (x # xs)的定义来看,x很简单。同样,可以直接从常量min_list的属性中显示min_list (x # []) = x。代替上面的谓词,仍然需要显示set (x # []) = {x}对所有set而言。这是根据基本集合论得出的。

归纳步骤:假设m = x ⟹ m ∈ {x},对所有x⋀x. m = min_list (x # xs) ⟹ m ∈ set (x # xs)m = min_list (a # x # xs) ⟹ m ∈ set (a # x # xs)显示a。修复xxsa。假设x。然后剩下的就是显示xs。给定m = min_list (a # x # xs),从m ∈ set (a # x # xs)的定义可以很容易地推断出m = min_list (a # x # xs)min_list。明确考虑以下情况:

  • 案例1:m = am = min_list (x # xs)来自定义。然后,m = a替换。
  • 第二种情况:a ∈ set (a # x # xs)。然后,从假设m ∈ set (a # x # xs)得出m = min_list (x # xs)。因此,⋀x. m = min_list (x # xs) ⟹ m ∈ set (x # xs)遵循m ∈ set (x # xs)的属性。

在所有可能的情况下,m ∈ set (a # x # xs)都需要证明。

这样,证明就得出结论了。

总结思想。尝试将此非正式证明转换为set证明。另外,请注意,证明可能不是理想的-稍后我可能会对证明进行编辑。