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


How to build a function implicitly in Coq?

我试图证明每个组都有反函数。

我定义的组如下:

1
2
3
4
5
6
7
8
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
}.

我知道最好用inverse:forall x:G, {y: mult x y = e}.甚至inverse:G->G. is_inverse:forall x:G, mult x (inverse x)=e.代替反公理,但是我更喜欢我的定义,主要是因为我希望定义与教室中给出的定义相同。

因此,我提供了一个合适的选择公理版本:

1
2
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)).

现在,我可以证明我的主张:

1
2
3
4
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.

既然我已经证明了存在,那么我想定义一个实际函数。在这里,我感到事情开始变得混乱。以下定义创建了一个实际的函数,但看起来很丑陋和复杂:

1
2
3
4
5
6
Definition inv_func(H:Group):G H->G H.
pose (inv_func_exists H).
pose indefinite_description.
generalize e0 s.
trivial.
Qed.

最后,我想证明inv_func实际上是一个反函数:

1
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的更好方法的建议,我将不胜感激(但根据我对group的定义,而在group定义中不包含该功能。我相信问题可能是可以证明每个元素都具有某种对应关系,并且需要将此对应关系作为一个函数来建立关系。


您的问题中有很多问题。 我将尝试解决所有这些问题:

  • 首先,没有理由比{x | P}更喜欢exists x, P +描述,确实,这样做似乎很奇怪。 {x | P}是完全有效的,因为"存在一个可以计算的x",我宁愿在您的小组中使用该定义。

  • 其次,在使用战术创建定义时,应使用命令Defined结束证明。 使用Qed将声明定义" Opaque",这意味着它不能被扩展,从而阻止您进行证明。

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

使用以上所有内容,我们得出:

1
2
3
4
5
6
7
8
9
10
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.