Coq中的Powerset和合奏

时间:2014-06-11 07:47:07

标签: coq

我对monoid有以下定义

Class Monoid
  (K : Type)
  (op : K -> K -> K)
  (unit : K) := {
    (* few properties here *)
  }.

我可以很容易地为幺半群(N, +, 0)实例化:

Instance Monoid_Instance_1 : Monoid nat plus O. 

工作正常。

我的问题是我想实现(P(P(G)), Union, Empty_set)之类的幺半群,其中P(P(G))是集合G的powerset的powerset。理想情况下,我想做类似的事情:

Parameter G : Set.
Instance Monoid_Instance_2 : Monoid (Power_set (Power_set G)) Union Empty_set. 

由于Ensemble (Ensemble G)返回的Power_set类型(当然上面的双重Power_set是虚构的),它不起作用

你知道我怎么做吗?我是否需要更改Monoid的定义?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

Power_set是对Ensemble的操作,而不是Set上的操作。

Require Import Coq.Sets.Powerset.

Parameter S : Set.
Parameter E : Ensemble S.

Check Power_set _ (Power_set _ E).

Ensemble S已经是powerset monoid。每个E : Ensemble S都是S的子集,反之亦然(将x : X读为x ∈ X)。 Ensemble是谓词:Ensemble X = (X -> Prop) = (X -> 2) = P X

Conjecture C1 : forall x y z, Union _ (Union _ x y) z = Union _ x (Union _ y z).
Conjecture C2 : forall x, Union _ Empty_set x = x.

实际上,这些猜想假设谓词扩展性,这不是建设性的,但可以安全地添加。

你可以证明像

这样的东西
Power e1 : Ensemble (Ensemble t1)

In Empty (Power e1)

In e1 (Power e3) -> In e2 (Power e3) -> In (Union e1 e2) (Power e3)

,但你无法证明

Power e1 : Type

Empty : Power e1

Union : Power e1 -> Power e1 -> Power e1

Power e1不是PropSetType,而是谓词。