我对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
的定义?
感谢您的帮助。
答案 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
不是Prop
,Set
或Type
,而是谓词。