Tensor
Imports
open Math;
open List;
Types
Functions
def vzeros (n : Int | n ≥ 0) : {v : Vector | dim v = n && (lower v = 0.0 && upper v = 0.0)}
def vones (n : Int | n ≥ 0) : {v : Vector | dim v = n && (lower v = 1.0 && upper v = 1.0)}
def vfull (n : Int | n ≥ 0) (x : Float) : {v : Vector | dim v = n && (lower v = x && upper v = x)}
def from_list (xs : List Float) : {v : Vector | dim v = size xs}
def vdim (v : Vector) : {n : Int | n = dim v && n ≥ 0}
def vget (v : Vector) (i : Int | i ≥ 0 && i < dim v) : {x : Float | lower v ≤ x && x ≤ upper v}
def vlower (v : Vector | dim v > 0) : {f : Float | f = lower v}
def vupper (v : Vector | dim v > 0) : {f : Float | f = upper v}
def vadd (a : Vector) (b : Vector | dim b = dim a) : {r : Vector | dim r = dim a && (lower r ≥ lower a + lower b && upper r ≤ upper a + upper b)}
def vsub (a : Vector) (b : Vector | dim b = dim a) : {r : Vector | dim r = dim a && (lower r ≥ lower a - upper b && upper r ≤ upper a - lower b)}
def hadamard (a : Vector) (b : Vector | dim b = dim a) : {r : Vector | dim r = dim a}
def hadamard_nonneg (a : Vector | lower a ≥ 0.0) (b : Vector | dim b = dim a && lower b ≥ 0.0) : {r : Vector | dim r = dim a && (lower r ≥ lower a * lower b && upper r ≤ upper a * upper b)}
def scale (s : Float) (v : Vector) : {r : Vector | dim r = dim v}
def scale_nonneg (s : Float | s ≥ 0.0) (v : Vector) : {r : Vector | dim r = dim v && (lower r ≥ s * lower v && upper r ≤ s * upper v)}
def dot (a : Vector) (b : Vector | dim b = dim a) : Float
def dot_nonneg (a : Vector | lower a ≥ 0.0) (b : Vector | dim b = dim a && lower b ≥ 0.0) : {f : Float | f ≥ 0.0}
def norm (v : Vector) : {f : Float | f ≥ 0.0}
def normalize (v : Vector | dim v > 0) : {r : Vector | dim r = dim v}
def vsum (v : Vector) : Float
def mzeros (r : Int | r ≥ 0) (c : Int | c ≥ 0) : {m : Matrix | rows m = r && (cols m = c && (mlower m = 0.0 && mupper m = 0.0))}
def eye (n : Int | n ≥ 0) : {m : Matrix | rows m = n && (cols m = n && (mlower m ≥ 0.0 && mupper m ≤ 1.0))}
def mrows (m : Matrix) : {n : Int | n = rows m && n ≥ 0}
def mcols (m : Matrix) : {n : Int | n = cols m && n ≥ 0}
def mget (m : Matrix) (i : Int | i ≥ 0 && i < rows m) (j : Int | j ≥ 0 && j < cols m) : {x : Float | mlower m ≤ x && x ≤ mupper m}
def mlower_of (m : Matrix | rows m > 0 && cols m > 0) : {f : Float | f = mlower m}
def mupper_of (m : Matrix | rows m > 0 && cols m > 0) : {f : Float | f = mupper m}
def madd (a : Matrix) (b : Matrix | rows b = rows a && cols b = cols a) : {
r : Matrix | rows r = rows a && (cols r = cols a && (mlower r ≥ mlower a + mlower b && mupper r ≤ mupper a + mupper b))
}
def matmul (a : Matrix) (b : Matrix | rows b = cols a) : {r : Matrix | rows r = rows a && cols r = cols b}
def matvec (m : Matrix) (v : Vector | dim v = cols m) : {r : Vector | dim r = rows m}
def transpose (m : Matrix) : {r : Matrix | rows r = cols m && (cols r = rows m && (mlower r = mlower m && mupper r = mupper m))}
Uninterpreted
Functions declared as def f ... = uninterpreted: only their signature is known to the verifier; they have no body.
def dim : (v : Vector) → Int
def rows : (m : Matrix) → Int
def cols : (m : Matrix) → Int
def lower : (v : Vector) → Float
def upper : (v : Vector) → Float
def mlower : (m : Matrix) → Float
def mupper : (m : Matrix) → Float