我在Ensemble
中使用Coq.Sets.Ensemble
类型的集合。该库定义了Union
和Intersection
,但我找不到笛卡尔积的任何构造。
具体来说,我正在寻找一个构造函数,该构造函数需要一个Ensemble U
和一个Ensemble V
并返回一个Ensemble (U * V)
,其中包含所有有序对(u, v)
的集合,其中u ∈ U
和v ∈ 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表达这一点?
答案 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开发中使用-它只为处理谓词就不会给您带来任何好处。