summaryrefslogtreecommitdiff
path: root/backends/lean/Base/Primitives
diff options
context:
space:
mode:
Diffstat (limited to 'backends/lean/Base/Primitives')
-rw-r--r--backends/lean/Base/Primitives/Scalar.lean48
-rw-r--r--backends/lean/Base/Primitives/Vec.lean13
2 files changed, 37 insertions, 24 deletions
diff --git a/backends/lean/Base/Primitives/Scalar.lean b/backends/lean/Base/Primitives/Scalar.lean
index 1e9b51c2..3beb7527 100644
--- a/backends/lean/Base/Primitives/Scalar.lean
+++ b/backends/lean/Base/Primitives/Scalar.lean
@@ -66,27 +66,33 @@ def U128.smin : Int := 0
def U128.smax : Int := HPow.hPow 2 128 - 1
-- The "normalized" bounds, that we use in practice
-def I8.min := -128
-def I8.max := 127
-def I16.min := -32768
-def I16.max := 32767
-def I32.min := -2147483648
-def I32.max := 2147483647
-def I64.min := -9223372036854775808
-def I64.max := 9223372036854775807
-def I128.min := -170141183460469231731687303715884105728
-def I128.max := 170141183460469231731687303715884105727
-@[simp] def U8.min := 0
-def U8.max := 255
-@[simp] def U16.min := 0
-def U16.max := 65535
-@[simp] def U32.min := 0
-def U32.max := 4294967295
-@[simp] def U64.min := 0
-def U64.max := 18446744073709551615
-@[simp] def U128.min := 0
-def U128.max := 340282366920938463463374607431768211455
-@[simp] def Usize.min := 0
+def I8.min : Int := -128
+def I8.max : Int := 127
+def I16.min : Int := -32768
+def I16.max : Int := 32767
+def I32.min : Int := -2147483648
+def I32.max : Int := 2147483647
+def I64.min : Int := -9223372036854775808
+def I64.max : Int := 9223372036854775807
+def I128.min : Int := -170141183460469231731687303715884105728
+def I128.max : Int := 170141183460469231731687303715884105727
+@[simp]
+def U8.min : Int := 0
+def U8.max : Int := 255
+@[simp]
+def U16.min : Int := 0
+def U16.max : Int := 65535
+@[simp]
+def U32.min : Int := 0
+def U32.max : Int := 4294967295
+@[simp]
+def U64.min : Int := 0
+def U64.max : Int := 18446744073709551615
+@[simp]
+def U128.min : Int := 0
+def U128.max : Int := 340282366920938463463374607431768211455
+@[simp]
+def Usize.min : Int := 0
def Isize.refined_min : { n:Int // n = I32.min ∨ n = I64.min } :=
⟨ Isize.smin, by
diff --git a/backends/lean/Base/Primitives/Vec.lean b/backends/lean/Base/Primitives/Vec.lean
index 35092c29..5a709566 100644
--- a/backends/lean/Base/Primitives/Vec.lean
+++ b/backends/lean/Base/Primitives/Vec.lean
@@ -22,20 +22,27 @@ def Vec (α : Type u) := { l : List α // l.length ≤ Usize.max }
instance Vec.cast (a : Type u): Coe (Vec a) (List a) where coe := λ v => v.val
instance (a : Type u) : Arith.HasIntProp (Vec a) where
- prop_ty := λ v => v.val.len ≤ Scalar.max ScalarTy.Usize
+ prop_ty := λ v => 0 ≤ v.val.len ∧ v.val.len ≤ Scalar.max ScalarTy.Usize
prop := λ ⟨ _, l ⟩ => by simp[Scalar.max, List.len_eq_length, *]
@[simp]
abbrev Vec.length {α : Type u} (v : Vec α) : Int := v.val.len
+@[simp]
+abbrev Vec.v {α : Type u} (v : Vec α) : List α := v.val
+
example {a: Type u} (v : Vec a) : v.length ≤ Scalar.max ScalarTy.Usize := by
scalar_tac
def Vec.new (α : Type u): Vec α := ⟨ [], by apply Scalar.cMax_suffices .Usize; simp ⟩
+-- TODO: very annoying that the α is an explicit parameter
def Vec.len (α : Type u) (v : Vec α) : Usize :=
- let ⟨ v, l ⟩ := v
- Usize.ofIntCore (List.length v) (by simp [Scalar.min, Usize.min]) l
+ Usize.ofIntCore v.val.len (by scalar_tac) (by scalar_tac)
+
+@[simp]
+theorem Vec.len_val {α : Type u} (v : Vec α) : (Vec.len α v).val = v.length :=
+ by rfl
-- This shouldn't be used
def Vec.push_fwd (α : Type u) (_ : Vec α) (_ : α) : Unit := ()