Coq中有限集的建模基数

Coq中有限集的建模基数,coq,Coq,我在Coq中建立了有限集的基本理论 有限集(FSET)的语法 fset\u expr可以 空集合,一个添加操作, 另一个集合的过滤器(集合理解), 两套的杯子(接头), 或两个集合的帽(交点) Inductive fset_expr { A : Set } : Set := | fset_expr_empty : fset_expr | fset_expr_add : fset_expr -> A -> fset_expr | fset_expr_filter : fset_exp

我在Coq中建立了有限集的基本理论

有限集(FSET)的语法
fset\u expr
可以 空集合,一个添加操作, 另一个集合的过滤器(集合理解), 两套的杯子(接头), 或两个集合的帽(交点)

 Inductive fset_expr { A : Set } : Set :=
| fset_expr_empty : fset_expr
| fset_expr_add : fset_expr -> A -> fset_expr
| fset_expr_filter : fset_expr -> (A -> bool) -> fset_expr
| fset_expr_cup : fset_expr -> fset_expr -> fset_expr
| fset_expr_cap : fset_expr -> fset_expr -> fset_expr.
集成员的语义
in_fset s a
表示
s:fset_expr
包含成员
a

Inductive in_fset { A : Set } : fset_expr (A:=A) -> A -> Prop :=
| in_fset_add : forall x a, in_fset (fset_expr_add x a) a
| in_fset_added : forall x a0 a1, in_fset x a0 -> in_fset (fset_expr_add x a1) a0
| in_fset_cup_l : forall x y a, in_fset x a -> in_fset (fset_expr_cup x y) a
| in_fset_cup_r : forall x y a, in_fset y a -> in_fset (fset_expr_cup x y) a
| in_fset_cap : forall x y a, in_fset x a -> in_fset y a -> in_fset (fset_expr_cap x y) a
| in_fset_filter : forall x f a, in_fset x a -> (f a = true) -> in_fset (fset_expr_filter x f) a.
子集与集合等式 基数 这就是发生并发症的地方。我定义了
cardinality\u fset sn
,这意味着有限集
s:fset\u expr
包含
n:nat
元素

Inductive cardinality_fset { A : Set } : fset_expr (A:=A) -> nat -> Prop :=
| cardinality_fset_empty : cardinality_fset fset_expr_empty 0
| cardinality_fset_add : forall s n a,
    ~(in_fset s a) ->
    cardinality_fset s n ->
    cardinality_fset (fset_expr_add s a) (S n)
| cardinality_fset_trans :
    forall x y n,
      eq_fset x y ->
      cardinality_fset x n ->
      cardinality_fset y n.
问题 我无法证明基数是定义良好的,即关系
eq\u fset
fset\u expr
的每个同余类都有唯一的基数。可能吗

  forall s : fset_expr (A:=A), exists n, (cardinality_fset s n /\ forall s' n', eq_fset s s' -> cardinality_fset s' n' -> n' = n).

为了证明这个定理,您需要能够编写一个函数
基数:fset_expr->nat
,用于计算有限集的基数,为此,您需要确定两个元素
(a1a2:a)
是否相等(这样您就不会重复计数)


如果对所有a1 a2:A,{a1=a2}+{a1 a2}都包含一个假设
,那么你的定理应该是可证明的。

要证明这个定理,你需要能够编写一个计算有限集的基数的函数
基数:fset_expr->nat,您需要确定两个元素
(a1a2:A)
是否相等(这样您就不会重复计算)


如果你为所有a1 a2:A,{a1=a2}+{a1 a2}
包含一个假设
,那么你的定理应该是可证明的。

我认为
基数
函数对于证明是必要的和充分的。即使没有您的平等假设,也有可能实现这样的功能吗?或者这样的假设是绝对必要的?假设基数函数存在,要知道
A
的两个元素
a1
a2
是否相等,只需计算
adda1(adda2为空)
的基数即可。是的,这两个概念似乎对彼此都是必要的。我看到,
基数
函数对于证明是必要的和足够的。即使没有您的平等假设,也有可能实现这样的功能吗?或者这样的假设是绝对必要的?假设基数函数存在,要知道
A
的两个元素
a1
a2
是否相等,只需计算
adda1(adda2为空)
的基数即可。因此,是的,这两个概念似乎对彼此都是必要的。
  forall s : fset_expr (A:=A), exists n, (cardinality_fset s n /\ forall s' n', eq_fset s s' -> cardinality_fset s' n' -> n' = n).