Section Interreducible.
Global Program Instance uni_sysuni (I: uni X): sysuni :=
{ Gammaᵤ' := Gammaᵤ; Eᵤ' := [(sᵤ, tᵤ)]; Lᵤ' := [Aᵤ]; Hᵤ' := _; }.
Global Program Instance sysuni_uni (I: sysuni): uni X :=
{
Gammaᵤ := Gammaᵤ';
sᵤ := linearize_terms (left_side Eᵤ');
tᵤ := linearize_terms (right_side Eᵤ');
Aᵤ := (Arr (rev Lᵤ') alpha) → alpha;
H1ᵤ := _;
H2ᵤ := _;
}.
End Interreducible.
End SystemUnification.
Arguments SU : clear implicits.
Arguments sysuni : clear implicits.
Arguments Gammaᵤ' {_} {_}.
Arguments Eᵤ' {_} {_}.
Arguments Lᵤ' {_} {_}.
Notation "sigma •₊₊ E" := (map (subst_eq sigma) E) (at level 69, right associativity).
Notation  "Gamma ⊢₊₊ E : L" := (eqs_typing Gamma E L) (at level 80, E at level 99).
Notation "Gamma ⊢₂ e : A" := (eq_typing Gamma e A) (at level 80, e at level 99).
Hint Rewrite all_terms_cons_iff all_terms_app Vars'_app Vars'_cons: simplify.
Hint Resolve all_terms_nil : core.
(* ** Normalisation *)
Definition NSU {X: Const} (I: sysuni X) := exists Delta sigma,
Delta ⊩ sigma : Gammaᵤ' /\ (forall s t, (s, t) ∈ Eᵤ' -> sigma • s ≡ sigma • t) /\
forall x, normal (sigma x).

Lemma SU_NSU X I: SU X I <-> NSU I.