(** Documentation for the standard library can be found at
    http://coq.inria.fr/library/.  

    The [Search] command is a good way to look for theorems involving 
    objects of specific types.  Take a minute now to experiment with it. *)

(* ################################################################# *)
(** * Identifiers *)

(** First, we need a type for the keys that we use to index into our
    maps.  For this purpose, we again use the type [id] from the
    [Lists] chapter.  To make this chapter self contained, we repeat
    its definition here, together with the equality comparison
    function for [id]s and its fundamental property. *)

Inductive id : Type :=
  | Id : string -> id.(** Documentation for the standard library can be found at
    http://coq.inria.fr/library/.  

    The [Search] command is a good way to look for theorems involving 
    objects of specific types.  Take a minute now to experiment with it. *)

(* ################################################################# *)
(** * Identifiers *)

(** First, we need a type for the keys that we use to index into our
    maps.  For this purpose, we again use the type [id] from the
    [Lists] chapter.  To make this chapter self contained, we repeat
    its definition here, together with the equality comparison
    function for [id]s and its fundamental property. *)

Inductive id : Type :=
  | Id : string -> id.Definition beq_id x y :=
  match x,y with
    | Id n1, Id n2 => if string_dec n1 n2 then true else false
  end.

(* Specifications: *)
Theorem beq_id_refl : forall id, true = beq_id id id.
Theorem beq_id_true_iff : forall x y : id, beq_id x y = true <-> x = y.
Theorem beq_id_false_iff : forall x y : id, beq_id x y = false <-> x <> y.
Theorem false_beq_id : forall x y : id, x <> y -> beq_id x y = false.