Fixpoint fold_Ssequence lc :=
match lc with
| nil => Sskip
| c1 :: nil => c1
| c :: lc0 => Ssequence c (fold_Ssequence lc0)
end.
Definition non_Sseq c :=
match c with
| Ssequence _ _ => False
| _ => True
end.
Inductive unfold_Sseq_rel: statement -> list statement -> Prop :=
| singleton: forall c, non_Sseq c -> unfold_Sseq_rel c (c :: nil)
| tl_step: forall c1 c2 lc, non_Sseq c1 -> unfold_Sseq_rel c2 lc ->
unfold_Sseq_rel (Ssequence c1 c2) (c1 :: lc)
| hd_step: forall c1 c2 c3 lc, unfold_Sseq_rel (Ssequence c1 (Ssequence c2 c3)) lc ->
unfold_Sseq_rel (Ssequence (Ssequence c1 c2) c3) lc
.

Lemma semax_equiv_trans: forall {CS: compspecs} {Espec: OracleKind} c1 c2 c3, semax_equiv c1 c2 -> semax_equiv c2 c3 -> semax_equiv c1 c3.