Section Decomposition.
Fixpoint decomp s t: option (eqs X) :=
if s == t then Some nil
else match s, t with
| var x, t => Some [(var x, t)]
| s, var x => Some [(var x, s)]
| app s1 s2, app t1 t2 =>
match decomp s1 t1, decomp s2 t2 with
| Some E1, Some E2 => Some (E1 ++ E2)
|  _, _ => None
end
| _, _ => None
end.
Fixpoint decomp' E :=
match E with
| nil => Some nil
| e :: E => match decomp (fst e) (snd e),  decomp' E with
| Some E1, Some E2 => Some (E1 ++ E2)
| _, _ => None
end
end.

Lemma decomp'_some_ind (P: eqs X -> eqs X -> Prop):
P nil nil ->
(forall s t E E1 E2, decomp s t = Some E1 ->
decomp' E = Some E2 -> P E E2 -> P ((s, t) :: E) (E1 ++ E2)) ->
forall E E', decomp' E = Some E' -> P E E'.