Coq中有限集的建模基数
我在Coq中建立了有限集的基本理论 有限集(FSET)的语法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
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).