Section SR_to_MPCP.
Local Definition string := string nat.
Variable R : stack nat.
Variables x0 y0 : string.
Notation "x ≻ y" := (rew R x y) (at level 70).
Notation "x ≻* y" := (rewt R x y) (at level 70).
Notation Sigma := (x0 ++ y0 ++ sym R).
Definition dollar := fresh Sigma.
Notation "$" := dollar.
Definition hash := fresh (dollar :: Sigma).
Notation "#" := hash.
Definition d := [$] / ($ :: x0 ++ [#]).
Definition e := (y0 ++ [#;$]) / [$].
Definition P := [d ; e] ++ R ++ [ ([#] / [#] )] ++ map (fun a => [a] / [a]) Sigma.
Fact SR_MPCP x :
x <<= Sigma -> x ≻* y0 -> exists A, A <<= P /\ tau1 A = x ++ [#] ++ tau2 A.
Fact MPCP_SR x y A :
A <<= P -> x <<= Sigma -> y <<= Sigma ->
tau1 A = x ++ [#] ++ y ++ tau2 A ->
y ++ x ≻* y0.

Corollary SR_MPCP_cor :
x0 ≻* y0 <-> exists A, A <<= P /\ tau1 (d :: A) = tau2 (d :: A).