From d5b1ae21cf7b97ff5cda16aafd6e4923d179ecb2 Mon Sep 17 00:00:00 2001
From: Ralf Jung <jung@mpi-sws.org>
Date: Mon, 11 Jan 2021 18:32:17 +0100
Subject: [PATCH] add elem_of_seq, elem_of_seqZ, seqZ_app

Proofs by Tej
---
 theories/list_numbers.v | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/theories/list_numbers.v b/theories/list_numbers.v
index 0045b143..f4116df1 100644
--- a/theories/list_numbers.v
+++ b/theories/list_numbers.v
@@ -73,6 +73,10 @@ Section seq.
     by rewrite IH, Nat.add_succ_r.
   Qed.
 
+  Lemma elem_of_seq start sz x :
+    x ∈ seq start sz ↔ (start ≤ x < start + sz)%nat.
+  Proof. rewrite elem_of_list_In, in_seq. done. Qed.
+
   Lemma Forall_seq (P : nat → Prop) i n :
     Forall P (seq i n) ↔ ∀ j, i ≤ j < i + n → P j.
   Proof.
@@ -136,6 +140,31 @@ Section seqZ.
   Lemma NoDup_seqZ m n : NoDup (seqZ m n).
   Proof. apply NoDup_fmap_2, NoDup_seq. intros ???; lia. Qed.
 
+  Lemma seqZ_app m n1 n2 :
+    0 ≤ n1 →
+    0 ≤ n2 →
+    seqZ m (n1 + n2) = seqZ m n1 ++ seqZ (m + n1) n2.
+  Proof.
+    intros. unfold seqZ.
+    replace (Z.to_nat (n1 + n2)) with (Z.to_nat n1 + Z.to_nat n2)%nat by lia.
+    rewrite seq_app, fmap_app.
+    f_equal.
+    replace (0 + Z.to_nat n1)%nat with (Z.to_nat n1 + 0)%nat by lia.
+    rewrite <- fmap_add_seq.
+    rewrite <- list_fmap_compose.
+    apply list_fmap_ext; auto.
+    intros. simpl. lia.
+  Qed.
+
+  Lemma elem_of_seqZ start sz x :
+    x ∈ seqZ start sz ↔ start ≤ x < start + sz.
+  Proof.
+    rewrite elem_of_list_lookup.
+    setoid_rewrite lookup_seqZ. split; intros.
+    - destruct H as [i ?]. lia.
+    - exists (Z.to_nat (x - start)). lia.
+  Qed.
+
   Lemma Forall_seqZ (P : Z → Prop) m n :
     Forall P (seqZ m n) ↔ ∀ m', m ≤ m' < m + n → P m'.
   Proof.
-- 
GitLab