+
+lemma st_step_dx: ∀p,M,M2. M ⇀[p] M2 → ∀M1. M1 ⓢ⥤* M → M1 ⓢ⥤* M2.
+#p #M #M2 #H elim H -p -M -M2
+[ #B #A #M1 #H
+ elim (st_inv_appl … H ???) -H [4: // |2,3: skip ] #s #B1 #M #HM1 #HB1 #H (**) (* simplify line *)
+ elim (st_inv_abst … H ??) -H [3: // |2: skip ] #r #A1 #HM #HA1 (**) (* simplify line *)
+ lapply (lhap_trans … HM1 … (dx:::r) (@B1.𝛌.A1) ?) /2 width=1/ -M #HM1
+ lapply (lhap_step_dx … HM1 (◊) ([⬐B1]A1) ?) -HM1 // #HM1
+ @(st_step_sn … HM1) /2 width=1/
+| #p #A #A2 #_ #IHA2 #M1 #H
+ elim (st_inv_abst … H ??) -H [3: // |2: skip ] /3 width=4/ (**) (* simplify line *)
+| #p #B #B2 #A #_ #IHB2 #M1 #H
+ elim (st_inv_appl … H ???) -H [4: // |2,3: skip ] /3 width=6/ (**) (* simplify line *)
+| #p #B #A #A2 #_ #IHA2 #M1 #H
+ elim (st_inv_appl … H ???) -H [4: // |2,3: skip ] /3 width=6/ (**) (* simplify line *)
+]
+qed-.
+
+lemma st_lhap1_swap: ∀p,N1,N2. N1 ⓗ⇀[p] N2 → ∀M1. M1 ⓢ⥤* N1 →
+ ∃∃q,M2. M1 ⓗ⇀[q] M2 & M2 ⓢ⥤* N2.
+#p #N1 #N2 #H elim H -p -N1 -N2
+[ #D #C #M1 #H
+ elim (st_inv_appl … H ???) -H [4: // |2,3: skip ] #s #D1 #N #HM1 #HD1 #H (**) (* simplify line *)
+ elim (st_inv_abst … H ??) -H [3: // |2: skip ] #r #C1 #HN #HC1 (**) (* simplify line *)
+ lapply (lhap_trans … HM1 … (dx:::r) (@D1.𝛌.C1) ?) /2 width=1/ -N #HM1
+ lapply (lhap_step_dx … HM1 (◊) ([⬐D1]C1) ?) -HM1 // #HM1
+ elim (lhap_inv_pos … HM1 ?) -HM1
+ [2: >length_append normalize in ⊢ (??(??%)); // ]
+ #q #r #M #_ #HM1 #HM -s
+ @(ex2_2_intro … HM1) -M1
+ @(st_step_sn … HM) /2 width=1/
+| #p #D #C1 #C2 #_ #IHC12 #M1 #H -p
+ elim (st_inv_appl … H ???) -H [4: // |2,3: skip ] #s #B #A1 #HM1 #HBD #HAC1 (**) (* simplify line *)
+ elim (IHC12 … HAC1) -C1 #p #C1 #HAC1 #HC12
+ lapply (lhap_step_dx … HM1 (dx::p) (@B.C1) ?) -HM1 /2 width=1/ -A1 #HM1
+ elim (lhap_inv_pos … HM1 ?) -HM1
+ [2: >length_append normalize in ⊢ (??(??%)); // ]
+ #q #r #M #_ #HM1 #HM -p -s
+ @(ex2_2_intro … HM1) -M1 /2 width=6/
+]
+qed-.
+
+lemma st_lsreds: ∀s,M1,M2. M1 ⇀*[s] M2 → M1 ⓢ⥤* M2.
+#s #M1 #M2 #H @(lstar_ind_r ????????? H) -s -M2 // /2 width=4 by st_step_dx/
+qed.
+
+theorem st_trans: transitive … st.
+#M1 #M #M2 #HM1 #HM2
+elim (st_inv_lsreds_is_le … HM1) -HM1 #s1 #HM1 #_
+elim (st_inv_lsreds_is_le … HM2) -HM2 #s2 #HM2 #_
+lapply (lsreds_trans … HM1 … HM2) -M /2 width=2/
+qed-.
+
+theorem lsreds_standard: ∀s,M,N. M ⇀*[s] N →
+ ∃∃r. M ⇀*[r] N & is_le r.
+#s #M #N #H
+@st_inv_lsreds_is_le /2 width=2/
+qed-.
+
+theorem lsreds_lhap1_swap: ∀s,M1,N1. M1 ⇀*[s] N1 → ∀p,N2. N1 ⓗ⇀[p] N2 →
+ ∃∃q,r,M2. M1 ⓗ⇀[q] M2 & M2 ⇀*[r] N2 & is_le (q::r).
+#s #M1 #N1 #HMN1 #p #N2 #HN12
+lapply (st_lsreds … HMN1) -s #HMN1
+elim (st_lhap1_swap … HN12 … HMN1) -p -N1 #q #M2 #HM12 #HMN2
+elim (st_inv_lsreds_is_le … HMN2) -HMN2 #r #HMN2 #Hr
+lapply (lhap1_inv_head … HM12) /3 width=7/
+qed-.