Library Asm.Util.Map

Require Import Bool Peano_dec Compare_dec Omega List.

Set Implicit Arguments.

Definition eq_dec (t : Set) := forall (e1 e2 : t), {e1 = e2} + {e1 <> e2}.

Inductive ord (T : Set) : T -> T -> Prop :=
  | OrdEq : forall e1 e2, e1 = e2 -> ord e1 e2
  | OrdLt : forall e1 e2, e1 <> e2 -> ord e1 e2
  | OrdGt : forall e1 e2, e1 <> e2 -> ord e1 e2.

Definition ord_dec (t : Set) := forall (e1 e2 : t), ord e1 e2.

Module Type ORDERED_SET.
  Parameter t : Set.
  Axiom eq_dec : eq_dec t.
  Parameter lt : t -> t -> Prop.
  Axiom lt_dec : forall e1 e2, {lt e1 e2} + {~lt e1 e2}.

  Axiom lt_irr : forall e, ~lt e e.
  Axiom neq_lt : forall e1 e2, e1 <> e2 -> lt e1 e2 \/ lt e2 e1.
  Axiom lt_asym : forall e1 e2, lt e1 e2 -> ~lt e2 e1.
End ORDERED_SET.

Module Type FINITE.
  Parameter t : Set.
  Parameter to_nat : t -> nat.
  Axiom inj : forall t1 t2, t1 = t2 <-> to_nat t1 = to_nat t2.
End FINITE.

Module FiniteOrderedSet (S : FINITE).
  Import S.

  Definition t := t.

  Theorem eq_dec : eq_dec t.

  Definition lt a b := to_nat a < to_nat b.

  Theorem lt_dec : forall e1 e2, {lt e1 e2} + {~lt e1 e2}.

  Theorem lt_irr : forall e, ~lt e e.

  Theorem neq_lt : forall e1 e2, e1 <> e2 -> lt e1 e2 \/ lt e2 e1.

  Theorem lt_asym : forall e1 e2, lt e1 e2 -> ~lt e2 e1.
End FiniteOrderedSet.

Definition eq_dec_to_eq (T : Set) (eq_dec : forall (e1 e2 : T), {e1 = e2} + {e1 <> e2}) e1 e2 :=
  if eq_dec e1 e2 then true else false.

Module TotalMap (T : ORDERED_SET).
  Import T.

  Parameter map : Set -> Set.
  Parameter empty : forall (V : Set), V -> map V.
  Parameter sel : forall V, map V -> t -> V.
  Parameter upd : forall V, map V -> t -> V -> map V.

  Axiom sel_empty : forall (V : Set) (v : V) x,
    sel (empty v) x = v.
  Axiom sel_eq : forall (V : Set) m x (v : V),
    sel (upd m x v) x = v.
  Axiom sel_neq : forall (V : Set) m x (v : V) x',
    x <> x' -> sel (upd m x v) x' = sel m x'.

  Parameter subMap : forall (V : Set)
    (P : V -> V -> bool) (Prefl : forall v, P v v = true)
    (M1 M2 : map V), {b : bool |
    b = true -> forall n, P (sel M1 n) (sel M2 n) = true}.

  Parameter eq_dec : forall ran : Set, (forall (x y : ran), {x = y} + {x <> y})
    -> forall (m1 m2 : map ran),
      {m1 = m2} + {m1 <> m2}.

  Parameter mapMap : forall (V V' : Set) (f : V -> V')
    (m : map V), {m' : map V'
      | forall k, sel m' k = f (sel m k)}.

  Parameter mapMapi : forall (V V' : Set) (f : t -> V -> V')
    (m : map V), {m' : map V'
      | forall k, sel m' k = f k (sel m k)}.
End TotalMap.


Index
This page has been generated by coqdoc