aboutsummaryrefslogtreecommitdiffhomepage
path: root/theories/Structures/DecidableType2.v
diff options
context:
space:
mode:
Diffstat (limited to 'theories/Structures/DecidableType2.v')
-rw-r--r--theories/Structures/DecidableType2.v211
1 files changed, 75 insertions, 136 deletions
diff --git a/theories/Structures/DecidableType2.v b/theories/Structures/DecidableType2.v
index 7cae4358b..111f45ca7 100644
--- a/theories/Structures/DecidableType2.v
+++ b/theories/Structures/DecidableType2.v
@@ -22,135 +22,98 @@ End BareEquality.
(** * Specification of the equality by the Type Classe [Equivalence] *)
-Module Type Equality_fun (Import E:BareEquality).
+Module Type IsEq (Import E:BareEquality).
Instance eq_equiv : Equivalence eq.
Hint Resolve (@Equivalence_Reflexive _ _ eq_equiv).
Hint Resolve (@Equivalence_Transitive _ _ eq_equiv).
Hint Immediate (@Equivalence_Symmetric _ _ eq_equiv).
-End Equality_fun.
+End IsEq.
(** * Earlier specification of equality by three separate lemmas. *)
-Module Type EqualityOrig_fun(Import E:BareEquality).
+Module Type IsEqOrig (Import E:BareEquality).
Axiom eq_refl : forall x : t, eq x x.
Axiom eq_sym : forall x y : t, eq x y -> eq y x.
Axiom eq_trans : forall x y z : t, eq x y -> eq y z -> eq x z.
Hint Immediate eq_sym.
Hint Resolve eq_refl eq_trans.
-End EqualityOrig_fun.
+End IsEqOrig.
(** * Types with decidable equality *)
-Module Type Decidable_fun (Import E:BareEquality).
+Module Type HasEqDec (Import E:BareEquality).
Parameter eq_dec : forall x y : t, { eq x y } + { ~ eq x y }.
-End Decidable_fun.
+End HasEqDec.
(** * Boolean Equality *)
(** Having [eq_dec] is the same as having a boolean equality plus
a correctness proof. *)
-Module Type BoolEq_fun (Import E:BareEquality).
+Module Type HasEqBool (Import E:BareEquality).
Parameter Inline eqb : t -> t -> bool.
Parameter eqb_eq : forall x y, eqb x y = true <-> eq x y.
-End BoolEq_fun.
+End HasEqBool.
(** From these basic blocks, we can build many combinations
of static standalone module types. *)
-Module Type EqualityType.
- Include Type BareEquality.
- Include Self Type Equality_fun.
-End EqualityType.
-
-Module Type EqualityTypeOrig.
- Include Type BareEquality.
- Include Self Type EqualityOrig_fun.
-End EqualityTypeOrig.
-
-Module Type EqualityTypeBoth. (* <: EqualityType <: EqualityTypeOrig *)
- Include Type BareEquality.
- Include Self Type Equality_fun.
- Include Self Type EqualityOrig_fun.
-End EqualityTypeBoth.
-
-Module Type DecidableType. (* <: EqualityType *)
- Include Type BareEquality.
- Include Self Type Equality_fun.
- Include Self Type Decidable_fun.
-End DecidableType.
-
-Module Type DecidableTypeOrig. (* <: EqualityTypeOrig *)
- Include Type BareEquality.
- Include Self Type EqualityOrig_fun.
- Include Self Type Decidable_fun.
-End DecidableTypeOrig.
-
-Module Type DecidableTypeBoth. (* <: DecidableType <: DecidableTypeOrig *)
- Include Type EqualityTypeBoth.
- Include Self Type Decidable_fun.
-End DecidableTypeBoth.
-
-Module Type BooleanEqualityType. (* <: EqualityType *)
- Include Type BareEquality.
- Include Self Type Equality_fun.
- Include Self Type BoolEq_fun.
-End BooleanEqualityType.
-
-Module Type BooleanDecidableType. (* <: DecidableType <: BooleanEqualityType *)
- Include Type BareEquality.
- Include Self Type Equality_fun.
- Include Self Type Decidable_fun.
- Include Self Type BoolEq_fun.
-End BooleanDecidableType.
-
-Module Type DecidableTypeFull. (* <: all previous interfaces *)
- Include Type BareEquality.
- Include Self Type Equality_fun.
- Include Self Type EqualityOrig_fun.
- Include Self Type Decidable_fun.
- Include Self Type BoolEq_fun.
-End DecidableTypeFull.
+Module Type EqualityType := BareEquality <+ IsEq.
+
+Module Type EqualityTypeOrig := BareEquality <+ IsEqOrig.
+
+Module Type EqualityTypeBoth (* <: EqualityType <: EqualityTypeOrig *)
+ := BareEquality <+ IsEq <+ IsEqOrig.
+
+Module Type DecidableType (* <: EqualityType *)
+ := BareEquality <+ IsEq <+ HasEqDec.
+
+Module Type DecidableTypeOrig (* <: EqualityTypeOrig *)
+ := BareEquality <+ IsEqOrig <+ HasEqDec.
+
+Module Type DecidableTypeBoth (* <: DecidableType <: DecidableTypeOrig *)
+ := EqualityTypeBoth <+ HasEqDec.
+
+Module Type BooleanEqualityType (* <: EqualityType *)
+ := BareEquality <+ IsEq <+ HasEqBool.
+
+Module Type BooleanDecidableType (* <: DecidableType <: BooleanEqualityType *)
+ := BareEquality <+ IsEq <+ HasEqDec <+ HasEqBool.
+
+Module Type DecidableTypeFull (* <: all previous interfaces *)
+ := BareEquality <+ IsEq <+ IsEqOrig <+ HasEqDec <+ HasEqBool.
(** * Compatibility wrapper from/to the old version of
[EqualityType] and [DecidableType] *)
-Module Backport_ET_fun (E:BareEquality)(F:Equality_fun E) <: EqualityOrig_fun E.
+Module BackportEq (E:BareEquality)(F:IsEq E) <: IsEqOrig E.
Definition eq_refl := @Equivalence_Reflexive _ _ F.eq_equiv.
Definition eq_sym := @Equivalence_Symmetric _ _ F.eq_equiv.
Definition eq_trans := @Equivalence_Transitive _ _ F.eq_equiv.
-End Backport_ET_fun.
+End BackportEq.
-Module Update_ET_fun (E:BareEquality)(F:EqualityOrig_fun E) <: Equality_fun E.
+Module UpdateEq (E:BareEquality)(F:IsEqOrig E) <: IsEq E.
Instance eq_equiv : Equivalence E.eq.
Proof. exact (Build_Equivalence _ _ F.eq_refl F.eq_sym F.eq_trans). Qed.
-End Update_ET_fun.
+End UpdateEq.
-Module Backport_ET (E:EqualityType) <: EqualityTypeBoth.
- Include E.
- Include Backport_ET_fun E E.
-End Backport_ET.
+Module Backport_ET (E:EqualityType) <: EqualityTypeBoth
+ := E <+ BackportEq E E.
-Module Update_ET (E:EqualityTypeOrig) <: EqualityTypeBoth.
- Include E.
- Include Update_ET_fun E E.
-End Update_ET.
+Module Update_ET (E:EqualityTypeOrig) <: EqualityTypeBoth
+ := E <+ UpdateEq E E.
-Module Backport_DT (E:DecidableType) <: DecidableTypeBoth.
- Include E.
- Include Backport_ET_fun E E.
-End Backport_DT.
+Module Backport_DT (E:DecidableType) <: DecidableTypeBoth
+ := E <+ BackportEq E E.
-Module Update_DT (E:DecidableTypeOrig) <: DecidableTypeBoth.
- Include E.
- Include Update_ET_fun E E.
-End Update_DT.
+Module Update_DT (E:DecidableTypeOrig) <: DecidableTypeBoth
+ := E <+ UpdateEq E E.
(** * Having [eq_dec] is equivalent to having [eqb] and its spec. *)
-Module Dec2Bool_fun (E:BareEquality)(F:Decidable_fun E) <: BoolEq_fun E.
+Module HasEqDec2Bool (E:BareEquality)(F:HasEqDec E) <: HasEqBool E.
Definition eqb x y := if F.eq_dec x y then true else false.
Lemma eqb_eq : forall x y, eqb x y = true <-> E.eq x y.
Proof.
@@ -158,9 +121,9 @@ Module Dec2Bool_fun (E:BareEquality)(F:Decidable_fun E) <: BoolEq_fun E.
auto with *.
split. discriminate. intro EQ; elim NEQ; auto.
Qed.
-End Dec2Bool_fun.
+End HasEqDec2Bool.
-Module Bool2Dec_fun (E:BareEquality)(F:BoolEq_fun E) <: Decidable_fun E.
+Module HasEqBool2Dec (E:BareEquality)(F:HasEqBool E) <: HasEqDec E.
Lemma eq_dec : forall x y, {E.eq x y}+{~E.eq x y}.
Proof.
intros x y. assert (H:=F.eqb_eq x y).
@@ -168,17 +131,13 @@ Module Bool2Dec_fun (E:BareEquality)(F:BoolEq_fun E) <: Decidable_fun E.
apply -> H; auto.
intro EQ. apply H in EQ. discriminate.
Defined.
-End Bool2Dec_fun.
+End HasEqBool2Dec.
-Module Dec2Bool (E:DecidableType) <: BooleanDecidableType.
- Include E.
- Include Dec2Bool_fun E E.
-End Dec2Bool.
+Module Dec2Bool (E:DecidableType) <: BooleanDecidableType
+ := E <+ HasEqDec2Bool E E.
-Module Bool2Dec (E:BooleanEqualityType) <: BooleanDecidableType.
- Include E.
- Include Bool2Dec_fun E E.
-End Bool2Dec.
+Module Bool2Dec (E:BooleanEqualityType) <: BooleanDecidableType
+ := E <+ HasEqBool2Dec E E.
@@ -192,46 +151,30 @@ Module Type UsualBareEquality. (* <: BareEquality *)
Definition eq := @eq t.
End UsualBareEquality.
-Module UsualEquality_fun (E:UsualBareEquality) <: Equality_fun E.
+Module UsualIsEq (E:UsualBareEquality) <: IsEq E.
Program Instance eq_equiv : Equivalence E.eq.
-End UsualEquality_fun.
+End UsualIsEq.
-Module UsualEqualityOrig_fun (E:UsualBareEquality) <: EqualityOrig_fun E.
+Module UsualIsEqOrig (E:UsualBareEquality) <: IsEqOrig E.
Definition eq_refl := @eq_refl E.t.
Definition eq_sym := @eq_sym E.t.
Definition eq_trans := @eq_trans E.t.
-End UsualEqualityOrig_fun.
-
-Module Type UsualEqualityType. (* <: EqualityType *)
- Include Type UsualBareEquality.
- Include Self Type Equality_fun.
-End UsualEqualityType.
-
-Module Type UsualDecidableType. (* <: DecidableType *)
- Include Type UsualBareEquality.
- Include Self Type Equality_fun.
- Include Self Type Decidable_fun.
-End UsualDecidableType.
-
-Module Type UsualDecidableTypeBoth. (* <: DecidableTypeBoth *)
- Include Type UsualBareEquality.
- Include Self Type Equality_fun.
- Include Self Type EqualityOrig_fun.
- Include Self Type Decidable_fun.
-End UsualDecidableTypeBoth.
-
-Module Type UsualBoolEq.
- Include Type UsualBareEquality.
- Include Self Type BoolEq_fun.
-End UsualBoolEq.
-
-Module Type UsualDecidableTypeFull. (* <: DecidableTypeFull *)
- Include Type UsualBareEquality.
- Include Self Type Equality_fun.
- Include Self Type EqualityOrig_fun.
- Include Self Type Decidable_fun.
- Include Self Type BoolEq_fun.
-End UsualDecidableTypeFull.
+End UsualIsEqOrig.
+
+Module Type UsualEqualityType (* <: EqualityType *)
+ := UsualBareEquality <+ IsEq.
+
+Module Type UsualDecidableType (* <: DecidableType *)
+ := UsualBareEquality <+ IsEq <+ HasEqDec.
+
+Module Type UsualDecidableTypeBoth (* <: DecidableTypeBoth *)
+ := UsualBareEquality <+ IsEq <+ IsEqOrig <+ HasEqDec.
+
+Module Type UsualBoolEq := UsualBareEquality <+ HasEqBool.
+
+Module Type UsualDecidableTypeFull (* <: DecidableTypeFull *)
+ := UsualBareEquality <+ IsEq <+ IsEqOrig <+ HasEqDec <+ HasEqBool.
+
(** a [UsualDecidableType] is in particular an [DecidableType]. *)
@@ -247,14 +190,10 @@ End MiniDecidableType.
Module Make_UDT (M:MiniDecidableType) <: UsualDecidableTypeBoth.
Include M.
Definition eq := @eq M.t.
- Include Self UsualEquality_fun.
- Include Self UsualEqualityOrig_fun.
+ Include Self UsualIsEq.
+ Include Self UsualIsEqOrig.
End Make_UDT.
-Module Make_UDTF (M:UsualBoolEq) <: UsualDecidableTypeFull.
- Include M. (* t, eq, eqb, eqb_eq *)
- Include UsualEquality_fun M.
- Include UsualEqualityOrig_fun M.
- Include Bool2Dec_fun M M.
-End Make_UDTF.
+Module Make_UDTF (M:UsualBoolEq) <: UsualDecidableTypeFull
+ := M <+ UsualIsEq <+ UsualIsEqOrig <+ HasEqBool2Dec.