diff --git a/theories/algebra/list.v b/theories/algebra/list.v index b40a301c568ec7f0fb01661a75f65daa17f696aa..b631b236a0c185eaf10096497b01a46fdbb567a5 100644 --- a/theories/algebra/list.v +++ b/theories/algebra/list.v @@ -368,6 +368,12 @@ Section properties. Qed. Lemma list_lookup_singletonM i x : ({[ i := x ]} : list A) !! i = Some x. Proof. induction i; by f_equal/=. Qed. + Lemma list_lookup_singletonM_lt i i' x: + (i' < i)%nat → ({[ i := x ]} : list A) !! i' = Some ε. + Proof. move: i'. induction i; intros [|i']; naive_solver auto with lia. Qed. + Lemma list_lookup_singletonM_gt i i' x: + (i < i')%nat → ({[ i := x ]} : list A) !! i' = None. + Proof. move: i'. induction i; intros [|i']; naive_solver auto with lia. Qed. Lemma list_lookup_singletonM_ne i j x : i ≠j → ({[ i := x ]} : list A) !! j = None ∨ ({[ i := x ]} : list A) !! j = Some ε. @@ -412,6 +418,20 @@ Section properties. Lemma list_singleton_snoc l x: {[length l := x]} ⋅ l ≡ l ++ [x]. Proof. elim: l => //= ?? <-. by rewrite left_id. Qed. + Lemma list_singletonM_included i x l: + {[i := x]} ≼ l ↔ (∃ x', l !! i = Some x' ∧ x ≼ x'). + Proof. + rewrite list_lookup_included. split. + { move /(_ i). rewrite list_lookup_singletonM option_included_total. + naive_solver. } + intros (y&Hi&?) j. destruct (Nat.lt_total j i) as [?|[->|?]]. + - rewrite list_lookup_singletonM_lt //. + destruct (lookup_lt_is_Some_2 l j) as [z Hz]. + { trans i; eauto using lookup_lt_Some. } + rewrite Hz. by apply Some_included_2, ucmra_unit_least. + - rewrite list_lookup_singletonM Hi. by apply Some_included_2. + - rewrite list_lookup_singletonM_gt //. apply: ucmra_unit_least. + Qed. (* Update *) Lemma list_singleton_updateP (P : A → Prop) (Q : list A → Prop) x :