Coq 定义证明范围内的函数

Coq 定义证明范围内的函数,coq,coq-tactic,Coq,Coq Tactic,我试图证明内射函数在Coq中是左可逆的。在我的证明中,我的目标是一个“存在”命题。我想定义一个函数,它使用证明范围中的术语(我之前介绍过的类型和函数),然后向“exists”目标显示该函数。以下是我到目前为止写的内容: (*函数组合*) 定义fun_comp{A B C:Type}(f:A->B)(g:B->C):A->C:= 乐趣a:a=>g(fa)。 符号“g.o.f”:=(乐趣互补)(在70级)。 定义非空(A:Type):=存在A:A,A=A。 (*任何给定类型的标识函数*) 定义fun

我试图证明内射函数在Coq中是左可逆的。在我的证明中,我的目标是一个“存在”命题。我想定义一个函数,它使用证明范围中的术语(我之前介绍过的类型和函数),然后向“exists”目标显示该函数。以下是我到目前为止写的内容:

(*函数组合*)
定义fun_comp{A B C:Type}(f:A->B)(g:B->C):A->C:=
乐趣a:a=>g(fa)。
符号“g.o.f”:=(乐趣互补)(在70级)。
定义非空(A:Type):=存在A:A,A=A。
(*任何给定类型的标识函数*)
定义fun\u id(A:Type):=fun A:A=>A。
(*左可逆*)
定义l_可逆{ab:Type}(f:A->B):=
存在fl:B->A,fl.o f=fun\U id A。
定义内射{ab:Type}(f:A->B):=
对于所有a:a,f a=f a'->a=a'。
(*是函数映像中的给定元素?*)
_fun_图像{ab:Type}(B:B)(f:A->B)中的定义元素:=
存在a:a,fa=b。
定理内射是可逆的:
对于所有(ab:Type)(f:A->B),非空A/\内射f->l_可逆f。
证明。
介绍A、B、f、H。
将H分解为[Hnempty Hinj]。
展开l_可逆。
在空中展开非空。
将Hnempty分解为[a0]。
(*这里是我的函数定义和调用“exists myfun”*)
下面是我试图定义的函数:

Definition fL(b:b):=if elem_in_fun_image b f
然后f a
否则a0。
下面是防风雨窗的外观:

1子目标
A:类型
B:类型
f:A->B
a0:A
H:a0=a0
Hinj:内射f
========================= (1 / 1)
存在fl:B->A,(fl.o f)=乐趣id A

我该怎么做?我对Coq非常陌生,因此欢迎其他评论和指针。

此定义不能在基本逻辑中执行。您需要添加一些额外的公理:

(* from Coq.Logic.FunctionalExtensionality *)
functional_extensionality : forall A B (f g : A -> B),
  (forall x, f x = g x) -> f = g

(* from Coq.Logic.Classical *)
classic : forall P : Prop, P \/ ~ P

(* from Coq.Logic.ClassicalChoice *)
choice : forall (A B : Type) (R : A->B->Prop),
  (forall x : A, exists y : B, R x y) ->
   exists f : A->B, (forall x : A, R x (f x)).
目标是定义一个关系
R
,该关系表征要构造的左逆。存在量化的
f
将是相反的!您将需要
经典
公理来显示
选择
的前提条件,并且需要函数扩展性来显示所需的等式。我将把它作为一个练习,以了解
R
需要什么以及如何完成证明