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 }. |
我知道最好用
因此,我提供了一个合适的选择公理版本:
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(例如
总之,对于如何证明最后一个引理以及定义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. |