如何证明Isabelle/HOL中反函数的存在性?

如何证明Isabelle/HOL中反函数的存在性?,isabelle,isar,Isabelle,Isar,我试图证明以下关于双射函数反函数存在性的基本定理(学习Isabelle/HOL定理证明): 对于任意集S及其单位映射1_S,α:S→T是双射iff 存在一个映射β:T→使得βα=1μS和αβ=1μS 以下是我在尝试定义相关事物(包括和)之后所得到的信息。但由于我对Isabelle和/或Isar缺乏了解,我陷入了困境,无法取得多大进展 theory Test imports Main "HOL.Relation" begin lemma bij_iff

我试图证明以下关于双射函数反函数存在性的基本定理(学习Isabelle/HOL定理证明):

对于任意集S及其单位映射1_S,α:S→T是双射iff 存在一个映射β:T→使得βα=1μS和αβ=1μS

以下是我在尝试定义相关事物(包括和)之后所得到的信息。但由于我对Isabelle和/或Isar缺乏了解,我陷入了困境,无法取得多大进展

theory Test
  imports  Main 
    "HOL.Relation"
begin

    lemma bij_iff_ex_identity : "bij_betw f A B ⟷ (∃ g. g∘f = restrict id B ∧ f∘g = restrict id A)" 
      unfolding bij_betw_def inj_on_def restrict_def iffI 
    proof
      let ?g = "restrict (λ y. (if f x = y then x else undefined)) B"
      assume "(∀x∈A. ∀y∈A. f x = f y ⟶ x = y)"
      have "?g∘f = restrict id B"
      proof
      (* cannot prove this *)

end
在上面,我试图给出一个明确的存在见证(即原始函数
f
的逆函数
g
)。关于证据,我有几个问题

  • 在Isabelle术语中,概念的定义是否正确(函数、反函数等)

  • 如何扩展相关定义,然后使用函数应用程序简化它们。我已经学习了一些Isabelle(2021)关于应用样式simp和结构化样式Isar证明的示例/教程,但无法流利地使用Isar证明。一旦我启动了“证明”命令,我就不知道如何继续保持沉默

  • Isar有一种新的方式,即
    假设。。。显示用于说明定理的…
    。是否有类似的支持来证明iff(
    )如上面的示例所示?没有它,就无法访问
    assms
    等,并且有必要
    假设
    除了证明过程中的结论之外的一切

  • 有人能解释一下上面关于反函数的存在性证明是如何完成的吗

    引理bij_iff_ex_恒等式:“bij_betw f A B⟷ (∃ g、 g∘f=限制id B∧ F∘g=限制id A)“

    我想这不是你想要的,我怀疑这是真的<代码>g∘f=限制id B并不意味着
    g∘f
    id
    B
    上相等。这意味着总功能
    g∘f
    (HOL中只有total函数)等于total函数
    restrict id B
    。后者在
    x上返回
    id x
    ∈B
    未定义
    否则。因此,为了实现这一等式,
    g
    需要在
    f
    的输入不在
    B
    时输出
    undefined
    。但是
    g
    怎么会知道呢

    如果要使用
    restrict
    ,可以编写
    restrict(g∘f) B=限制id B
    。但就我个人而言,我宁愿选择更简单的
    (∀x∈B.(g)∘f) x=x)

    因此,修正后的定理是:

    引理bij_iff_ex_恒等式:“bij_betw f A B⟷ (∃ g(∀x∈A.(g)∘f) x=x)∧ (∀Y∈B.(f)∘g) y=y))“

    (顺便说一句,这仍然是错误的,正如quickcheck在Isabelle/jEdit中告诉我的,请参阅输出窗口。如果
    A
    有一个元素,而
    B
    为空,
    f
    不能是双射。因此,您尝试的定理实际上在数学上是不正确的。我不会尝试修复它,只回答其余的几行

    展开bij_betw_def inj_on_def restrict_def iffI

    此处的
    iffI
    无效。展开只能应用
    A=B
    (无条件重写规则)形式的定理。
    iffI
    不是那种形式。(使用
    thm iffI
    查看。)

    证明

    就我个人而言,我不使用裸露的形式
    proof
    ,但总是
    proof-
    proof(某些方法)
    。因为
    proof
    只是应用了一些默认方法(在这种情况下,相当于
    (规则iffI)
    ,因此我认为最好是将其明确化。
    证明-
    只是开始证明,而不应用额外的方法

    let?g=“restrict(λy.(如果fx=y,则x未定义))B”

    这里有一个未绑定的变量
    x
    (注意IDE中的背景色)。这很可能不是您想要的。从形式上讲,这是允许的,但是
    x
    将被视为某个任意常量

    一般来说,我不认为有任何方法可以简单地定义
    g
    (即,仅使用量词和函数应用程序,以及if-then-else)。我认为定义逆的唯一方法(即使你知道它存在)是使用
    操作符,因为你需要说
    gy
    是“the”
    x
    这样
    fx=y
    (随后在证明中,您将遇到证明义务,证明它确实存在并且是唯一的。)请参见
    Hilbert\u Choice.thy中
    inv to
    的定义(除了它使用
    一些
    而不是
    ).对于初学者,可以尝试使用现有的
    inv_into
    常量进行验证

    假设”(∀x∈A.∀Y∈A.f x=f y⟶ x=y)“

    所有的
    假设
    命令都必须与验证目标中的假设完全相同。您可以通过临时编写命令
    显示A来测试您是否编写正确(这是一个无法验证的目标,但会完成验证,因此它会诱使Isabelle检查是否正确)。如果此命令未给出错误,则说明
    假定
    s是正确的。如果您没有给出错误,则应为
    (∀x∈A.∀Y∈A.f x=f y⟶ x=y)∧ f'A=B
    ('是这里的反勾符号。标记不允许我写它。)

    我的建议是:先用
    bij
    而不是
    bij\u betw
    来验证。(如果你想作弊,一个方向是BNF\u Fixpoint\u Base.o\u bij。) 一旦完成,您可以尝试概括

    引理bij_iff_ex_恒等式:“bij_betw f A B⟷ (∃ g、 g∘f=限制id B∧ F∘g=限制id A)“

    我认为这并不是你想要的,我怀疑这是真的∘f=限制id B"bij_betw f A B ⟷ (∃g. (∀x ∈ A. f x ∈ B ∧ g(f x) = x) ∧ (∀y ∈ B. g y ∈ A ∧ f(g y) = y))"
    lemma bij_betw_iff:
      shows "bij_betw f A B ⟷
        (
          ∃g.
            (∀x. x∈A ⟶ g (f x) = x) ∧
            (∀y. y∈B ⟶ f (g y) = y) ∧
            f ∈ A → B ∧
            g ∈ B → A
        )"
    sorry