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)