Notation value := (Syntax.value constructor).Notation term := (Syntax.term variable function constructor).Notation pattern := (Syntax.pattern variable constructor).Notation rule := (Syntax.rule variable function constructor).Notation term_beq := (term_beq variable_eq_dec function_eq_dec constructor_eq_dec).Definition cache : Type := list (term * value).Notation assoc_cache := (assoc term_beq).Definition cache_beq (C C' : cache) : bool :=
  list_beq _ (prod_beq _ _ term_beq (value_beq constructor_eq_dec)) C C'.

(* Specifications: *)
Lemma cache_beq_eq c1 c2 : cache_beq c1 c2 = true <-> c1 = c2.
Lemma function_beq_refl (f : function) : forall p, function_beq p f f = true.
Lemma value_beq_refl (v : value) : value_beq constructor_eq_dec v v = true.
Lemma cache_beq_refl C : cache_beq C C = true.