如何证明Isabelle/HOL中反函数的存在性?
我试图证明以下关于双射函数反函数存在性的基本定理(学习Isabelle/HOL定理证明): 对于任意集S及其单位映射1_S,α:S→T是双射iff 存在一个映射β:T→使得βα=1μS和αβ=1μS 以下是我在尝试定义相关事物(包括和)之后所得到的信息。但由于我对Isabelle和/或Isar缺乏了解,我陷入了困境,无法取得多大进展如何证明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
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
)。关于证据,我有几个问题
假设。。。显示用于说明定理的…
。是否有类似的支持来证明iff(⟷代码>)如上面的示例所示?没有它,就无法访问assms
等,并且有必要假设
除了证明过程中的结论之外的一切
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