Section freem_def.
Variable A : Setoid.
Inductive Tlist : Type :=
| Empty : Tlist
| Concat1 : A -> Tlist -> Tlist.
Fixpoint Equal_Tlist (l : Tlist) : Tlist -> Prop :=
fun m : Tlist =>
match l, m with
| Empty, Empty => True
| Empty, _ => False
| Concat1 a l1, Concat1 b m1 => a =_S b /\ Equal_Tlist l1 m1
| _, _ => False
end.
Canonical Structure Tlist_setoid : Setoid := Equal_Tlist_equiv.
Fixpoint Concat (l : Tlist_setoid) : Tlist_setoid -> Tlist_setoid :=
fun m : Tlist_setoid =>
match l with
| Empty => m
| Concat1 a l1 => Concat1 a (Concat l1 m)
end.

Lemma Concat_congr : Map2_congr_law Concat.