Module Type Protothetic (dolce:DOLCE_root).
(************************** Meta-rules of Protothetic in Coq ***************************)
Parameter eqP : Prop -> Prop -> Prop.
Notation "a ≡≡ b" := (eqP a b)  (at level 80).
(* elimination rules for equivalence *)
Parameter detachL     : forall (p q:Prop), (p ≡≡ q) -> p -> q.
Parameter detachR     : forall (p q:Prop), (p ≡≡ q) -> q -> p.
(* substitution rules for equivalence -> use rewrite *)
Add Parametric Relation  : Prop (eqP)
reflexivity proved by (ProtoReflex)
symmetry proved by (ProtoSymm)
transitivity proved by (ProtoTrans)
as eq_Prop.
Structure Morphism  : Type := {
f       :> Prop -> Prop;
compat  : forall (x1 x2: Prop), (x1 ≡≡ x2) -> ((f x1) ≡≡ (f x2))}.
Add Parametric Morphism  (M : Morphism) :
(@f M) with signature (@eqP ==> @eqP) as extensional_prop.

Axiom A3 : forall (g:Morphism)(p:Prop), (forall f:Morphism, (g p ≡≡ (forall r:Prop, (f r ≡≡ g p) ≡≡ forall r:Prop,(f r ≡≡ g (p ≡≡ (forall q:Prop, q))))) ≡≡ forall q:Prop, g q).