From af1f33c71da22060ddcd10adf54032b981440c89 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Wed, 14 Apr 2021 12:14:11 +0200
Subject: [PATCH] Add lemma `lookup_map_seq`, derive other `lookup_map_seq`
 lemmas from that.

---
 theories/fin_maps.v | 41 +++++++++++++++++++----------------------
 1 file changed, 19 insertions(+), 22 deletions(-)

diff --git a/theories/fin_maps.v b/theories/fin_maps.v
index 694b9ec0..05eb4b04 100644
--- a/theories/fin_maps.v
+++ b/theories/fin_maps.v
@@ -2417,39 +2417,36 @@ Section map_seq.
   Implicit Types x : A.
   Implicit Types xs : list A.
 
+  Lemma lookup_map_seq start xs i :
+    map_seq (M:=M A) start xs !! i = guard (start ≤ i); xs !! (i - start).
+  Proof.
+    revert start. induction xs as [|x' xs IH]; intros start; simpl.
+    { rewrite lookup_empty; simplify_option_eq; by rewrite ?lookup_nil. }
+    destruct (decide (start = i)) as [->|?].
+    - by rewrite lookup_insert, option_guard_True, Nat.sub_diag by lia.
+    - rewrite lookup_insert_ne, IH by done.
+      simplify_option_eq; try done || lia.
+      by replace (i - start) with (S (i - S start)) by lia.
+  Qed.
+  Lemma lookup_map_seq_0 xs i : map_seq (M:=M A) 0 xs !! i = xs !! i.
+  Proof. by rewrite lookup_map_seq, option_guard_True, Nat.sub_0_r by lia. Qed.
+
   Lemma lookup_map_seq_Some_inv start xs i x :
     xs !! i = Some x ↔ map_seq (M:=M A) start xs !! (start + i) = Some x.
   Proof.
-    revert start i. induction xs as [|x' xs IH]; intros start i; simpl.
-    { by rewrite lookup_empty, lookup_nil. }
-    destruct i as [|i]; simpl.
-    { by rewrite Nat.add_0_r, lookup_insert. }
-    rewrite lookup_insert_ne by lia. by rewrite (IH (S start)), Nat.add_succ_r.
+    rewrite lookup_map_seq, option_guard_True by lia.
+    by rewrite Nat.add_sub_swap, Nat.sub_diag.
   Qed.
   Lemma lookup_map_seq_Some start xs i x :
     map_seq (M:=M A) start xs !! i = Some x ↔ start ≤ i ∧ xs !! (i - start) = Some x.
-  Proof.
-    destruct (decide (start ≤ i)) as [|Hsi].
-    { rewrite (lookup_map_seq_Some_inv start).
-      replace (start + (i - start)) with i by lia. naive_solver. }
-    split; [|naive_solver]. intros Hi; destruct Hsi.
-    revert start i Hi. induction xs as [|x' xs IH]; intros start i; simpl.
-    { by rewrite lookup_empty. }
-    rewrite lookup_insert_Some; intros [[-> ->]|[? ?%IH]]; lia.
-  Qed.
-
+  Proof. rewrite lookup_map_seq. case_option_guard; naive_solver. Qed.
   Lemma lookup_map_seq_None start xs i :
     map_seq (M:=M A) start xs !! i = None ↔ i < start ∨ start + length xs ≤ i.
   Proof.
-    trans (¬start ≤ i ∨ ¬is_Some (xs !! (i - start))).
-    - rewrite eq_None_not_Some, <-not_and_l. unfold is_Some.
-      setoid_rewrite lookup_map_seq_Some. naive_solver.
-    - rewrite lookup_lt_is_Some. lia.
+    rewrite lookup_map_seq.
+    case_option_guard; rewrite ?lookup_ge_None; naive_solver lia.
   Qed.
 
-  Lemma lookup_map_seq_0 xs i : map_seq (M:=M A) 0 xs !! i = xs !! i.
-  Proof. apply option_eq; intros x. by rewrite (lookup_map_seq_Some_inv 0). Qed.
-
   Lemma map_seq_singleton start x :
     map_seq (M:=M A) start [x] = {[ start := x ]}.
   Proof. done. Qed.
-- 
GitLab