我需要证明以下内容:
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的人来说,这是一个简单的难题还是一个非常困难的难题?
答案 0 :(得分:1)
扰流器:可以使用标准列表归纳法和auto
来证明定理,即类似于by (induct xs ...) (auto simp: ...)
的定理。我特意省略了证明中的部分,以便您自己填写。您将需要考虑是否需要将任何变量(即m
或x
指定为arbitrary
,并且还需要了解简化程序可能需要的信息(在min_list
中的List
)。
关于您关于问题难度的问题,我相信,难度是经验的函数。最肯定的是,当我开始学习Isabelle时,发现与您的问题类似的证明很难形式化。经过一段时间Isabelle
的编码(在回答此问题之前,我必须在Isabelle
中累积了相当于4-5个月的全职编码),这种问题似乎不再存在给我带来重大挑战当然,还需要考虑其他因素,例如以前有数学或逻辑方面的培训,并且有过编码经验。
正在独自学习Isabelle的人的一般建议(该建议可能与专业教练通常推荐的方法不一致)
我认为,当证明相似的结果时,重要的是要了解Isabelle主要是“笔直式”证明形式化的工具。因此,在尝试将其正式化之前,手头有“纸笔”证明很重要。在攻击类似问题时,我建议采用以下一般方法:
Isar
对证明进行形式化,并提供尽可能多的详细信息,并且不必过多关注证明的长度。另外,请尽量不要依赖工具进行自动推理(即auto
,blast
,meson
,metis
,fastforce
),并使用类似{ {1}}和rule
尽可能多。intro
证明后,将用于自动推理的工具(例如Isar
,auto
)应用于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
。修复x
,xs
和a
。假设x
。然后剩下的就是显示xs
。给定m = min_list (a # x # xs)
,从m ∈ set (a # x # xs)
的定义可以很容易地推断出m = min_list (a # x # xs)
或min_list
。明确考虑以下情况:
m = a
。 m = 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
证明。另外,请注意,证明可能不是理想的-稍后我可能会对证明进行编辑。