(*========================================================
            DARTS AS NATURALS
========================================================*)

(* For simplicity, dart is nat, 
but it could be a deferred type: *)

Definition dart := nat.(* Decidability of dart equality: *)

Definition eq_dart_dec := eq_nat_dec.(* Nil dart: *)

Definition nil := 0%nat.(*========================================================
     FREE MAPS, CONSTRUCTORS, OBSERVERS AND DESTRUCTORS
 ========================================================*)

(* Free maps: *)

Inductive fmap:Set :=
      V : fmap
    | I : fmap->dart->fmap
    | L : fmap->dim->dart->dart->fmap.(*========================================================
     FREE MAPS, CONSTRUCTORS, OBSERVERS AND DESTRUCTORS
 ========================================================*)

(* Free maps: *)

Inductive fmap:Set :=
      V : fmap
    | I : fmap->dart->fmap
    | L : fmap->dim->dart->dart->fmap.(*========================================================
     FREE MAPS, CONSTRUCTORS, OBSERVERS AND DESTRUCTORS
 ========================================================*)

(* Free maps: *)

Inductive fmap:Set :=
      V : fmap
    | I : fmap->dart->fmap
    | L : fmap->dim->dart->dart->fmap.(*========================================================
     FREE MAPS, CONSTRUCTORS, OBSERVERS AND DESTRUCTORS
 ========================================================*)

(* Free maps: *)

Inductive fmap:Set :=
      V : fmap
    | I : fmap->dart->fmap
    | L : fmap->dim->dart->dart->fmap.(* Map vacuity: *)

Definition empty(m:fmap): Prop:=
 match m with
       V => True
    |  _ => False
 end.

Lemma empty_dec: forall (m:fmap), {empty m}+{~empty m}.