Coq 集成的标准笛卡尔积结构是什么?

Coq 集成的标准笛卡尔积结构是什么?,coq,cartesian-product,set-theory,Coq,Cartesian Product,Set Theory,我在Coq.sets.emble中为集合使用emble类型。这个库定义了并集和交集,但我找不到笛卡尔积的任何构造 具体来说,我正在寻找一个构造函数,它接受集合U和集合V,并返回一个集合(U*V),其中包含所有有序对的集合(U,V),其中U∈ U和v∈ V 明确地称之为笛卡尔的东西会很棒。或者,也许有某种方法可以使用普通的产品类型来嵌入相同的想法 我试图构造这样一个引理: Lemma cartesian_inclusion : forall A B C D : Ensemble U, In

我在
Coq.sets.emble
中为集合使用
emble
类型。这个库定义了
并集
交集
,但我找不到笛卡尔积的任何构造

具体来说,我正在寻找一个构造函数,它接受
集合U
集合V
,并返回一个
集合(U*V)
,其中包含所有有序对的集合
(U,V)
,其中
U∈ U
v∈ V

明确地称之为笛卡尔的东西会很棒。或者,也许有某种方法可以使用普通的产品类型来嵌入相同的想法

我试图构造这样一个引理:

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来表达这一点

类型
集合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).
这是你所说引理的一个证明:

Lemma cartesian_inclusion U V A B C D :
  Included U A C /\ Included V B D ->
  Included (U * V) (Cartesian _ _ A B) (Cartesian _ _ C D).
Proof.
intros [HU HV] [x y] [HA HB].
split.
- now apply HU.
- now apply HV.
Qed.

顺便说一句,集成库很少用于现代Coq开发中——它除了使用谓词之外没有任何好处。

谢谢您的回答,这非常有效!你的最后一句评论“简单地处理谓词通常容易得多”,很有趣。您是否有指向该样式示例的链接?@MatthewPiziak列表上的
Forall
谓词(在
Coq.lists.List
中),例如,为all a(a->Prop)->List a->Prop使用type
,而不是将集合作为其参数。还有一点我想我没有在我的回答中清楚地表达自己:并不是说使用谓词更容易,只是集合是不必要的间接层次。