proposition: Lemma substring_concat {x y z} {s : string} : (substring x y s ++ substring (x + y) z s)%string = substring x (y + z) s.
proof: Proof. revert x y z. induction s; simpl; intros. { destruct (y + z), x, y, z; reflexivity. } { destruct x, y, z; try reflexivity; simpl; rewrite ?Nat.add_0_r, ?substring_correct0, ?string_concat_empty_r; try reflexivity. { apply f_equal. apply IHs. } { rewrite IHs; simpl; reflexivity. } } Qed.
imports: Fiat.Common.Coq__8_4__8_5__Compat Coq.ZArith.ZArith Coq.Arith.PeanoNat Coq.Strings.Ascii Coq.Strings.String Fiat.Common.List.Operations Fiat.Common.StringOperations