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

时间:2017-01-14 18:34:47

标签: 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
}.

我知道最好用inverse:forall x:G, {y: mult x y = e}.inverse: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的更好方法的建议(但在我对组的定义下,不包括在组定义中存在这样的函数。我相信问题可能与许多其他情况相关,当人们可以证明每个元素的一些对应关系并且需要将这种对应关系建立为函数时)。

1 个答案:

答案 0 :(得分:4)

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

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

  • 其次,在使用策略创建定义时,您应该使用命令Defined结束证明。使用Qed将声明定义" Opaque",这意味着它无法展开,从而阻止您进行证明。

  • 从定义中提取见证的方法是使用投影。在这种情况下,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.