+
+(* ************ *)
+(* STRINGA + ID *)
+(* ************ *)
+
+(* tipo pubblico *)
+inductive aux_strId_type : Type ≝
+ STR_ID: aux_str_type → nat → aux_strId_type.
+
+(* getter *)
+definition get_name_strId ≝ λsid:aux_strId_type.match sid with [ STR_ID n _ ⇒ n ].
+definition get_id_strId ≝ λsid:aux_strId_type.match sid with [ STR_ID _ d ⇒ d ].
+
+(* confronto *)
+definition eqStrId_str ≝
+λsid,sid':aux_strId_type.(eqStr_str (get_name_strId sid) (get_name_strId sid'))⊗(eqb (get_id_strId sid) (get_id_strId sid')).
+
+lemma eq_to_eqstrid : ∀s,s'.s = s' → eqStrId_str s s' = true.
+ intros 3;
+ rewrite < H;
+ elim s;
+ simplify;
+ rewrite > (eq_to_eqstr a a (refl_eq ??));
+ rewrite > (eq_to_eqb_true n n (refl_eq ??));
+ reflexivity.
+qed.
+
+lemma eqstrid_to_eq : ∀s,s'.eqStrId_str s s' = true → s = s'.
+ intros 2;
+ elim s 0;
+ elim s' 0;
+ intros 4;
+ simplify;
+ intro;
+ rewrite > (eqstr_to_eq a1 a (andb_true_true ?? H));
+ rewrite > (eqb_true_to_eq n1 n (andb_true_true_r ?? H));
+ reflexivity.
+qed.