Isabelle 会员证明
我需要证明以下几点:Isabelle 会员证明,isabelle,proof,Isabelle,Proof,我需要证明以下几点: lemma "m = min_list(x#xs) ⟹ m ∈ set (x#xs)" 简单地说,我需要证明“min#u list(x#xs)”的返回值始终是(x#xs)的成员 我试过: apply(induct xs) apply(auto) 我还尝试使用以下方法重用min_列表的现有引理: find_theorems min_list 此时的次级目标太长,我不知道如何继续 我不是在寻找一个完整的答案,只是关于如何处理这个引理的提示。此外,对于刚刚学习Isabel
lemma "m = min_list(x#xs) ⟹ m ∈ set (x#xs)"
简单地说,我需要证明“min#u list(x#xs)”的返回值始终是(x#xs)的成员
我试过:
apply(induct xs)
apply(auto)
我还尝试使用以下方法重用min_列表的现有引理:
find_theorems min_list
此时的次级目标太长,我不知道如何继续
我不是在寻找一个完整的答案,只是关于如何处理这个引理的提示。此外,对于刚刚学习Isabelle的人来说,这个证明是简单的还是非常困难的?扰流器:可以使用标准列表归纳法和
auto
来证明这个定理,即类似于的东西(导入xs…)
。我故意在证明中省略了部分供您自己填写。您需要考虑是否需要将任何变量(即m
或x
)指定为任意,并了解简化程序可能需要哪些信息(在理论列表
中的min\u列表
说明中寻找线索)
关于你关于问题难度的问题,我认为,难度是经验的函数。最肯定的是,当我开始学习Isabelle时,我发现很难将类似于你问题中的证明形式化。在花了一段时间在Isabelle编写代码之后(在回答这个问题时,我必须在Isabelle
中累积相当于4-5个月的全职编码时间),这些问题对我来说似乎不再是一个重大挑战。当然,还有其他因素需要考虑,例如以前的数学或逻辑培训以及以前的编码经验
由自学Isabelle的人提供的一般建议(建议可能与专业讲师通常推荐的方法不一致)
我认为,在证明类似结果时,重要的是要了解Isabelle主要是“纸笔”证据形式化的工具。因此,在尝试将“纸笔”证据形式化之前,手边有“纸笔”证据非常重要。在解决类似问题时,我建议以下一般方法:
把证据写在纸上
使用Isar将证明形式化,提供尽可能多的细节,不太关心证明的长度。此外,尽量不要依赖自动推理工具(即auto
,blast
,meson
,metis
,fastforce
)并尽可能多地使用直接方法,如规则
和简介
一旦您的Isar
证明完成,将自动推理工具(例如auto
,blast
)应用到您的Isar证明中,以尽可能简化您的证明
当然,最终,当你在学习Isabelle方面取得进步时,省略1和2会变得越来越容易
我可以提供进一步的细节,例如完整的简短证明和长Isar
版本的证明
更新
根据你在评论中的要求,我提供了一个非正式的证据
引理m=min_列表(x#xs)⟹ M∈ 设置(x#xs)
备注。为完整起见,我还提供了min_列表
的定义以及有关const集合
的一些注释。min_列表
的定义可以在理论列表
中找到:
fun min_list :: "'a::ord list ⇒ 'a" where
"min_list (x # xs) = (case xs of [] ⇒ x | _ ⇒ min x (min_list xs))"
常量集合
是隐式定义的,并且构成列表
的数据类型
基础结构的一部分(如果是Isabelle,请参阅标准文档中的文档“在Isabelle/HOL中定义(Co)数据类型和原始(Co)递归函数”)特别是,它被称为数据类型的“集合函数”。通过检查/搜索可以找到常量集合的许多基本属性,例如查找定理列表.set
。我相信定理thm列表.set
代表常量集合的主要属性(我冒昧地重命名了定理中的原理图变量):
证明。证明是通过列表上的结构归纳法进行的。xs
。归纳原则在理论列表
的开头以一个未命名的引理陈述。为完整起见,我重申归纳原则如下:
“p[]⟹ (⋀列表.P列表⟹ P(名单)⟹ P列表“
基本情况:假设xs=[]
,显示m=min_列表(x#xs)⟹ M∈ set(x#xs)
用于所有x
。从min#u list
的定义来看,很容易看出min#u list(x#[])=x
。类似地,set(x#[])={x}
可以直接从常量set
的属性中显示出来。替换到上面的谓词中,仍然需要说明m=x>⟹ M∈ {x}
适用于所有x
。这源自基本集合论
归纳步骤:假设⋀x、 m=最小列表(x#xs)⟹ M∈ 设置(x#xs)
,显示m=min#u列表(a#x#xs)⟹ M∈ 为所有a
、x
和xs
设置(a#x#xs)
。修复a
、x
和xs
。假设m=min\u列表(a#x#xs∈ 设置(a x x x xs)。给定<代码> m=min列表(a x xx xs)< /> >,从<代码> min列表> /代码>的定义中,很容易推断出<代码> m=a < /> >或<代码> m=min列表(xxxs)。
- 案例一:
m=a
a∈ set(a#x#xs)
遵循定义。然后,m∈ 通过替换设置(a#x#xs)
- 案例二:
m=minu列表(x#xs)
set [] = {}
set (?x # ?xs) = insert ?x (set ?xs)