Ensemble的标准笛卡尔积结构是什么?

时间:2019-05-18 17:03:29

标签: coq cartesian-product set-theory

我在Ensemble中使用Coq.Sets.Ensemble类型的集合。该库定义了UnionIntersection,但我找不到笛卡尔积的任何构造。

具体来说,我正在寻找一个构造函数,该构造函数需要一个Ensemble U和一个Ensemble V并返回一个Ensemble (U * V),其中包含所有有序对(u, v)的集合,其中u ∈ Uv ∈ V

明确称为Cartesian的东西会很棒。也许有某种方法可以使用正常的产品类型嵌入相同的想法?

我试图构造这样的引理:

Lemma cartesian_inclusion : forall A B C D : Ensemble U,
    Included U A C /\ Included U B D -> Included (U * U) (A, B) (C, D).

但是出现以下错误:

The term "(A, B)" has type "(Ensemble U * Ensemble U)%type" while it is expected to have type "Ensemble (U * U)".

这种错误是有道理的。 (A, B)给您一套产品,而我想要的是一套产品。如何用Coq表达这一点?

1 个答案:

答案 0 :(得分:3)

类型ForeignKey仅定义为Ensemble U。我们可以轻松地为集合定义笛卡尔积,如下所示:

U -> Prop

这是您所说引理的证明:

Require Import Coq.Sets.Ensembles.

Definition Cartesian (U V : Type) (A : Ensemble U) (B : Ensemble V) 
  : Ensemble (U * V) :=
  fun x => In _ A (fst x) /\ In _ B (snd x).

顺便说一句,集成库很少在现代Coq开发中使用-它只为处理谓词就不会给您带来任何好处。