From 76263149abe2ceb826691f742e9d92ca03b9dcc0 Mon Sep 17 00:00:00 2001
From: Felipe Cerqueira <felipec@mpi-sws.org>
Date: Thu, 3 Nov 2016 16:02:07 +0100
Subject: [PATCH] Add more lemmas about zip

---
 util/list.v | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/util/list.v b/util/list.v
index 17a22147a..8e441bb82 100644
--- a/util/list.v
+++ b/util/list.v
@@ -228,6 +228,60 @@ Section Zip.
     }
   Qed.
 
+  Lemma unzip1_pair:
+    forall {T1 T2: eqType} (l: seq T1) (f: T1 -> T2),
+      unzip1 [seq (x, f x) | x <- l] = l.
+  Proof.
+    intros T1 T2.
+    induction l; first by done.
+    by intros f; simpl; f_equal.
+  Qed.
+
+  Lemma unzip2_pair:
+    forall {T1 T2: eqType} (l: seq T1) (f: T1 -> T2),
+      unzip2 [seq (f x, x) | x <- l] = l.
+  Proof.
+    intros T1 T2.
+    induction l; first by done.
+    by intros f; simpl; f_equal.
+  Qed.
+
+  Lemma eq_unzip1:
+    forall {T1 T2: eqType} (l1 l2: seq (T1 * T2)) x0,
+      size l1 = size l2 ->
+      (forall i, i < size l1 -> (fst (nth x0 l1 i)) = (fst (nth x0 l2 i))) ->
+      unzip1 l1 = unzip1 l2.
+  Proof.
+    intros T1 T2.
+    induction l1; simpl; first by destruct l2.
+    intros l2 x0 SIZE ALL.
+    destruct l2; first by done.
+    simpl; f_equal; first by feed (ALL 0).
+    case: SIZE => SIZE.
+    apply IHl1 with (x0 := x0); first by done.
+    intros i LTi.
+    by feed (ALL i.+1);
+      first by rewrite -[X in X < _]addn1 -[X in _ < X]addn1 ltn_add2r.
+  Qed.
+
+  Lemma eq_unzip2:
+    forall {T1 T2: eqType} (l1 l2: seq (T1 * T2)) x0,
+      size l1 = size l2 ->
+      (forall i, i < size l1 -> (snd (nth x0 l1 i)) = (snd (nth x0 l2 i))) ->
+      unzip2 l1 = unzip2 l2.
+  Proof.
+    intros T1 T2.
+    induction l1; simpl; first by destruct l2.
+    intros l2 x0 SIZE ALL.
+    destruct l2; first by done.
+    simpl; f_equal; first by feed (ALL 0).
+    case: SIZE => SIZE.
+    apply IHl1 with (x0 := x0); first by done.
+    intros i LTi.
+    by feed (ALL i.+1);
+      first by rewrite -[X in X < _]addn1 -[X in _ < X]addn1 ltn_add2r.
+  Qed.
+
 End Zip.
 
 (* Restate nth_error function from Coq library. *)
-- 
GitLab