diff --git a/prelude/list.v b/prelude/list.v
index 6e0bac82ae30832c2582a686ab64310422c5be2d..ef167dc392dd8dbcd7307416bb4e333f26e57bc4 100644
--- a/prelude/list.v
+++ b/prelude/list.v
@@ -1372,6 +1372,11 @@ Proof.
   induction l as [|x l IH]; [done|].
   by rewrite reverse_cons, (commutative (++)), IH.
 Qed.
+Lemma delete_Permutation l i x : l !! i = Some x → l ≡ₚ x :: delete i l.
+Proof.
+  revert i; induction l as [|y l IH]; intros [|i] ?; simplify_equality'; auto.
+  by rewrite Permutation_swap, <-(IH i).
+Qed.
 
 (** ** Properties of the [prefix_of] and [suffix_of] predicates *)
 Global Instance: PreOrder (@prefix_of A).
@@ -2522,59 +2527,85 @@ End Forall2_order.
 Section Forall3.
   Context {A B C} (P : A → B → C → Prop).
   Hint Extern 0 (Forall3 _ _ _ _) => constructor.
-  Lemma Forall3_app l1 k1 k1' l2 k2 k2' :
+  Lemma Forall3_app l1 l2 k1 k2 k1' k2' :
     Forall3 P l1 k1 k1' → Forall3 P l2 k2 k2' →
     Forall3 P (l1 ++ l2) (k1 ++ k2) (k1' ++ k2').
   Proof. induction 1; simpl; auto. Qed.
-  Lemma Forall3_cons_inv_m l y l2' k :
-    Forall3 P l (y :: l2') k → ∃ x l2 z k2,
-      l = x :: l2 ∧ k = z :: k2 ∧ P x y z ∧ Forall3 P l2 l2' k2.
+  Lemma Forall3_cons_inv_l x l k k' :
+    Forall3 P (x :: l) k k' → ∃ y k2 z k2',
+      k = y :: k2 ∧ k' = z :: k2' ∧ P x y z ∧ Forall3 P l k2 k2'.
+  Proof. inversion_clear 1; naive_solver. Qed.
+  Lemma Forall3_app_inv_l l1 l2 k k' :
+    Forall3 P (l1 ++ l2) k k' → ∃ k1 k2 k1' k2',
+     k = k1 ++ k2 ∧ k' = k1' ++ k2' ∧ Forall3 P l1 k1 k1' ∧ Forall3 P l2 k2 k2'.
+  Proof.
+    revert k k'. induction l1 as [|x l1 IH]; simpl; inversion_clear 1.
+    * by repeat eexists; eauto.
+    * by repeat eexists; eauto.
+    * edestruct IH as (?&?&?&?&?&?&?&?); eauto; naive_solver.
+  Qed.
+  Lemma Forall3_cons_inv_m l y k k' :
+    Forall3 P l (y :: k) k' → ∃ x l2 z k2',
+      l = x :: l2 ∧ k' = z :: k2' ∧ P x y z ∧ Forall3 P l2 k k2'.
+  Proof. inversion_clear 1; naive_solver. Qed.
+  Lemma Forall3_app_inv_m l k1 k2 k' :
+    Forall3 P l (k1 ++ k2) k' → ∃ l1 l2 k1' k2',
+     l = l1 ++ l2 ∧ k' = k1' ++ k2' ∧ Forall3 P l1 k1 k1' ∧ Forall3 P l2 k2 k2'.
+  Proof.
+    revert l k'. induction k1 as [|x k1 IH]; simpl; inversion_clear 1.
+    * by repeat eexists; eauto.
+    * by repeat eexists; eauto.
+    * edestruct IH as (?&?&?&?&?&?&?&?); eauto; naive_solver.
+  Qed.
+  Lemma Forall3_cons_inv_r l k z k' :
+    Forall3 P l k (z :: k') → ∃ x l2 y k2,
+      l = x :: l2 ∧ k = y :: k2 ∧ P x y z ∧ Forall3 P l2 k2 k'.
   Proof. inversion_clear 1; naive_solver. Qed.
-  Lemma Forall3_app_inv_m l l1' l2' k :
-    Forall3 P l (l1' ++ l2') k → ∃ l1 l2 k1 k2,
-      l = l1 ++ l2 ∧ k = k1 ++ k2 ∧ Forall3 P l1 l1' k1 ∧ Forall3 P l2 l2' k2.
+  Lemma Forall3_app_inv_r l k k1' k2' :
+    Forall3 P l k (k1' ++ k2') → ∃ l1 l2 k1 k2,
+      l = l1 ++ l2 ∧ k = k1 ++ k2 ∧ Forall3 P l1 k1 k1' ∧ Forall3 P l2 k2 k2'.
   Proof.
-    revert l k. induction l1' as [|x l1' IH]; simpl; inversion_clear 1.
+    revert l k. induction k1' as [|x k1' IH]; simpl; inversion_clear 1.
     * by repeat eexists; eauto.
     * by repeat eexists; eauto.
     * edestruct IH as (?&?&?&?&?&?&?&?); eauto; naive_solver.
   Qed.
-  Lemma Forall3_impl (Q : A → B → C → Prop) l l' k :
-    Forall3 P l l' k → (∀ x y z, P x y z → Q x y z) → Forall3 Q l l' k.
-  Proof. intros Hl ?. induction Hl; auto. Defined.
-  Lemma Forall3_length_lm l l' k : Forall3 P l l' k → length l = length l'.
+  Lemma Forall3_impl (Q : A → B → C → Prop) l k k' :
+    Forall3 P l k k' → (∀ x y z, P x y z → Q x y z) → Forall3 Q l k k'.
+  Proof. intros Hl ?; induction Hl; auto. Defined.
+  Lemma Forall3_length_lm l k k' : Forall3 P l k k' → length l = length k.
   Proof. by induction 1; f_equal'. Qed.
-  Lemma Forall3_length_lr l l' k : Forall3 P l l' k → length l = length k.
+  Lemma Forall3_length_lr l k k' : Forall3 P l k k' → length l = length k'.
   Proof. by induction 1; f_equal'. Qed.
-  Lemma Forall3_lookup_lmr l l' k i x y z :
-    Forall3 P l l' k →
-    l !! i = Some x → l' !! i = Some y → k !! i = Some z → P x y z.
+  Lemma Forall3_lookup_lmr l k k' i x y z :
+    Forall3 P l k k' →
+    l !! i = Some x → k !! i = Some y → k' !! i = Some z → P x y z.
   Proof.
     intros H. revert i. induction H; intros [|?] ???; simplify_equality'; eauto.
   Qed.
-  Lemma Forall3_lookup_l l l' k i x :
-    Forall3 P l l' k → l !! i = Some x →
-    ∃ y z, l' !! i = Some y ∧ k !! i = Some z ∧ P x y z.
+  Lemma Forall3_lookup_l l k k' i x :
+    Forall3 P l k k' → l !! i = Some x →
+    ∃ y z, k !! i = Some y ∧ k' !! i = Some z ∧ P x y z.
   Proof.
     intros H. revert i. induction H; intros [|?] ?; simplify_equality'; eauto.
   Qed.
-  Lemma Forall3_lookup_m l l' k i y :
-    Forall3 P l l' k → l' !! i = Some y →
-    ∃ x z, l !! i = Some x ∧ k !! i = Some z ∧ P x y z.
+  Lemma Forall3_lookup_m l k k' i y :
+    Forall3 P l k k' → k !! i = Some y →
+    ∃ x z, l !! i = Some x ∧ k' !! i = Some z ∧ P x y z.
   Proof.
     intros H. revert i. induction H; intros [|?] ?; simplify_equality'; eauto.
   Qed.
-  Lemma Forall3_lookup_r l l' k i z :
-    Forall3 P l l' k → k !! i = Some z →
-    ∃ x y, l !! i = Some x ∧ l' !! i = Some y ∧ P x y z.
+  Lemma Forall3_lookup_r l k k' i z :
+    Forall3 P l k k' → k' !! i = Some z →
+    ∃ x y, l !! i = Some x ∧ k !! i = Some y ∧ P x y z.
   Proof.
     intros H. revert i. induction H; intros [|?] ?; simplify_equality'; eauto.
   Qed.
-  Lemma Forall3_alter_lm f g l l' k i :
-    Forall3 P l l' k →
-    (∀ x y z, l !! i = Some x → l' !! i = Some y → k !! i = Some z →
+  Lemma Forall3_alter_lm f g l k k' i :
+    Forall3 P l k k' →
+    (∀ x y z, l !! i = Some x → k !! i = Some y → k' !! i = Some z →
       P x y z → P (f x) (g y) z) →
-    Forall3 P (alter f i l) (alter g i l') k.
+    Forall3 P (alter f i l) (alter g i k) k'.
   Proof. intros Hl. revert i. induction Hl; intros [|]; auto. Qed.
 End Forall3.