summaryrefslogtreecommitdiff
path: root/backends/lean/Base/IList
diff options
context:
space:
mode:
authorSon Ho2023-07-20 12:08:09 +0200
committerSon Ho2023-07-20 12:08:09 +0200
commit6ef1d360b89fd9f9383e63609888bf925a6a16ab (patch)
tree32622c6273f0feed88c595bcfd48c85a5dac7505 /backends/lean/Base/IList
parentd87e35e1a53b2252cc2c8c554216115773fd9678 (diff)
Improve progress further and move some lemmas
Diffstat (limited to 'backends/lean/Base/IList')
-rw-r--r--backends/lean/Base/IList/IList.lean67
1 files changed, 67 insertions, 0 deletions
diff --git a/backends/lean/Base/IList/IList.lean b/backends/lean/Base/IList/IList.lean
index ddb10236..1773e593 100644
--- a/backends/lean/Base/IList/IList.lean
+++ b/backends/lean/Base/IList/IList.lean
@@ -175,6 +175,73 @@ theorem idrop_eq_nil_of_le (hineq : ls.len ≤ i) : idrop i ls = [] := by
apply hi
linarith
+@[simp]
+theorem index_ne
+ {α : Type u} [Inhabited α] (l: List α) (i: ℤ) (j: ℤ) (x: α) :
+ 0 ≤ i → i < l.len → 0 ≤ j → j < l.len → j ≠ i →
+ (l.update i x).index j = l.index j
+ :=
+ λ _ _ _ _ _ => match l with
+ | [] => by simp at *
+ | hd :: tl =>
+ if h: i = 0 then
+ have : j ≠ 0 := by scalar_tac
+ by simp [*]
+ else if h : j = 0 then
+ have : i ≠ 0 := by scalar_tac
+ by simp [*]
+ else
+ by
+ simp [*]
+ simp at *
+ apply index_ne <;> scalar_tac
+
+@[simp]
+theorem index_eq
+ {α : Type u} [Inhabited α] (l: List α) (i: ℤ) (x: α) :
+ 0 ≤ i → i < l.len →
+ (l.update i x).index i = x
+ :=
+ fun _ _ => match l with
+ | [] => by simp at *; exfalso; scalar_tac -- TODO: exfalso needed. Son FIXME
+ | hd :: tl =>
+ if h: i = 0 then
+ by
+ simp [*]
+ else
+ by
+ simp [*]
+ simp at *
+ apply index_eq <;> scalar_tac
+
+def allP {α : Type u} (l : List α) (p: α → Prop) : Prop :=
+ foldr (fun a r => p a ∧ r) True l
+
+@[simp]
+theorem allP_nil {α : Type u} (p: α → Prop) : allP [] p :=
+ by simp [allP, foldr]
+
+@[simp]
+theorem allP_cons {α : Type u} (hd: α) (tl : List α) (p: α → Prop) :
+ allP (hd :: tl) p ↔ p hd ∧ allP tl p
+ := by simp [allP, foldr]
+
+def pairwise_rel
+ {α : Type u} (rel : α → α → Prop) (l: List α) : Prop
+ := match l with
+ | [] => True
+ | hd :: tl => allP tl (rel hd) ∧ pairwise_rel rel tl
+
+@[simp]
+theorem pairwise_rel_nil {α : Type u} (rel : α → α → Prop) :
+ pairwise_rel rel []
+ := by simp [pairwise_rel]
+
+@[simp]
+theorem pairwise_rel_cons {α : Type u} (rel : α → α → Prop) (hd: α) (tl: List α) :
+ pairwise_rel rel (hd :: tl) ↔ allP tl (rel hd) ∧ pairwise_rel rel tl
+ := by simp [pairwise_rel]
+
end Lemmas
end List