proposition: Lemma firstn_skipn_self {A} : forall (n m o : nat) (l l1 l2 l3 : list A), (l1 ++ l2 ++ l3)%list = l -> length l1 = n -> length l2 = m -> length l3 = o -> l1 = firstn n l /\ l2 = firstn m (skipn n l) /\ l3 = firstn o (skipn (n + m) l).
proof: Proof. intros; subst; intuition; eauto using firstn_skipn_app, skipn_app, firstn_app. rewrite skipn_app; symmetry; apply firstn_app. Qed.
imports: Fiat.Common.Coq__8_4__8_5__Compat Coq.Bool.Bool Coq.ZArith.ZArith Coq.Lists.List Fiat.Common.DecideableEnsembles Fiat.Common.EnumType Fiat.Common.BoundedLookup Fiat.Common Fiat.Common.ilist Fiat.Common.Tactics.CacheStringConstant Fiat.Common.IterateBoundedIndex Fiat.Computation Bedrock.Word