如何在Coq中隐式构建函数?

如何在Coq中隐式构建函数?,coq,Coq,我试图证明每个群都有一个反函数 我对集团的定义如下: Record Group:Type := { G:Set; mult:G->G->G; e:G; assoc:forall x y z:G, mult x (mult y z)=mult (mult x y) z; neut:forall x:G, mult e x=x /\ mult x e=x; inverse:forall x:G,exists y:G, mult x y = e }. 我知道最好是用逆:forall x:

我试图证明每个群都有一个反函数

我对集团的定义如下:

Record Group:Type := {
G:Set;
mult:G->G->G;
e:G;
assoc:forall x y z:G, mult x (mult y z)=mult (mult x y) z;
neut:forall x:G, mult e x=x /\ mult x e=x;
inverse:forall x:G,exists y:G, mult x y = e
}.
我知道最好是用逆:forall x:G,{y:mult x y=e}或者甚至是逆:G->G来代替逆公理。is_inverse:forall x:G,mult x inverse x=e,但我更喜欢我的定义,主要是因为我希望定义与课堂上给出的定义相同

因此,我将选择公理的一个合适版本包括在内:

Axiom indefinite_description : forall (A : Type) (P: A->Prop), ex P -> sig P.
Axiom functional_choice : forall A B (R:A->B->Prop), (forall x, exists y, R x y) -> (exists f, forall x, R x (f x)).
现在我可以证明我的主张:

Lemma inv_func_exists(H:Group):exists inv_func:G H->G H, (forall x:G H, mult H x (inv_func(x))=e H).
generalize (inverse H).
apply functional_choice.
Qed.
既然我已经证明了存在,我想定义一个实际的函数。在这里,我感觉事情开始变得一团糟。下面的定义创建了一个实际的函数,但看起来既丑陋又复杂:

Definition inv_func(H:Group):G H->G H.
pose (inv_func_exists H).
pose indefinite_description.
generalize e0 s.
trivial.
Qed.
最后,我想证明inv_func实际上是一个反函数:

Lemma inv_func_is_inverse:forall (H:Group), forall x:(G H), mult H x (inv_func H x)=e H.
我可以看出Coq知道inv_func是如何定义的,例如Print inv_func,但我不知道如何正式证明引理


最后,我希望您能提出建议,说明如何证明最后一个引理,以及如何更好地定义inv_func,但在我对组的定义中,不包括在组定义中存在这样一个函数。我相信这个问题在很多其他情况下都是相关的,因为人们可以证明每个元素都有对应关系,并且需要将这种对应关系作为一个函数来构建

你的问题里面有很多问题。我将尝试解决所有这些问题:

首先,没有理由偏爱exists x,p+描述而不是{x | p},事实上,这样做似乎很奇怪。{x | P}是完全有效的,因为存在一个可以计算的x,我更愿意在您的组中使用该定义

其次,当使用策略创建定义时,应该使用定义的命令结束证明。使用Qed将声明定义为不透明的,这意味着它无法扩展,从而阻止您进行证明

从定义中提取证人的方法是使用投影。在这种情况下,proj1_sig

利用以上所有信息,我们得出:

Definition inv_func' (H:Group) (x : G H) : G H.
Proof.
destruct (inverse H x) as [y _].
exact y.
Defined.

Definition inv_func (H:Group) (x : G H) : G H := proj1_sig (inverse H x).

Lemma inv_func_is_inverse (H:Group) (x: G H) : mult H x (inv_func H x) = e H.
Proof. now unfold inv_func; destruct (inverse H x). Qed.

函数选择遵循不确定描述公理:证明。简介A B R H.存在乐趣x:A=>proj1\U sig不确定\U描述\uH x。简介x。应用项目符号不确定描述。谢谢@ejgallego。你的代码对我有用。然而,我还是不明白。使用定义中定义的Qed替换为Qed的原始代码,策略展开inv_func。产生所有H:groupX:GH的目标,multHX=EH,这是错误的。为什么会这样?@tomjerry7这是因为一个微不足道的策略就是挑选一个武断的证人来总结证据。在本例中,它选择group.OK的输入元素。谢谢你详细的回答,这很有帮助。