Raw File
mochi-a-checksum.hs
undefined as rforall a. a
undefined = 0

assert as {safe:Bool | safe == True} -> Unit
assert = 0

makePair as rforall a, b. fst:a -> snd:b -> Pair >a >b
makePair = undefined

fst as rforall a, b. pair:(Pair >a >b) -> a
fst = undefined

snd as rforall a, b. pair:(Pair >a >b) -> b
snd = undefined

makeArray :: n:Int -> Pair >{v:Int | v = n} >(i:{v:Int | (0 <= v) /\ (v < n)} -> Int)
makeArray = \n -> makePair n (\i -> 0)

update :: n:Int ~> p:(Pair >{v:Int | v = n} >(i:{v:Int | (0 <= v) /\ (v < n)} -> Int)) -> i:{v:Int | (0 <= v) /\ (v < n)} -> x:Int -> Pair >{v:Int | v = n} >(j:{v:Int | (0 <= v) /\ (v < n)} -> {v:Int | (j = i) => (v = x)})
update = \p i x -> makePair (fst p) (\j -> if j == i then x else (snd p) j)

checksum :: ar0:Int ~> ar1:Int ~> p:(Pair >{v:Int | v > 1} >(x:Int -> {v:Int | ((x = 0) => (v = ar0)) /\ ((x = 1) => (v = ar1))})) -> x:{v:Int | v = ar0 + ar1} -> Unit
checksum = \p x -> assert ((((snd p) 0) + ((snd p) 1)) == x)

main :: a:Int -> b:Int -> Unit
main = \a b -> checksum (update (update (makeArray 2) 0 a) 1 b) (a + b)
back to top