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,而不是将集合作为其参数。还有一点我想我没有在我的回答中清楚地表达自己:并不是说使用谓词更容易,只是集合是不必要的间接层次。