Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Language.Haskell.Liquid.ProofCombinators
  2.  
  3. {-@ type PlusAsso = x:Int -> y:Int -> z:Int -> {x + (y+z) == (x+y) + z} @-}
  4.  
  5. {-@ type Nat = {x:Int | x >= 0} @-}
  6.  
  7. {-@ modPlus :: n:Nat -> {x:Nat | x < n} -> {y:Nat | y < n} -> {r:Nat | x+y<2*n && r < n && r >= 0} @-}
  8. modPlus n x y = if x + y >= n then x + y - n  else x+y ::Int
  9.  
  10. {-@ reflect modPlus @-}
  11.  
  12. {-@ modIdLeft :: n:Nat -> {x:Nat | x < n} -> {r:Nat | x == r} @-}
  13. modIdLeft n x = modPlus n 0 x
  14.  
  15.  
  16. {-@ modIdRight :: n:Nat -> {x:Nat | x < n} -> {r:Nat | x == r} @-}
  17. modIdRight n x = modPlus n x 0
  18.  
  19. {-@ reflect modInv @-}
  20. {-@ modInv :: n:Nat -> {x:Nat | x < n} -> {r:Nat | r >= 0 && r < n} @-}
  21. modInv n x = if x == 0 then 0 else n - x :: Int
  22.  
  23.  
  24. {-@ rightInv ::  n:Nat -> {x:Nat | x < n} -> {modPlus n x (modInv n x) == 0} @-}
  25. rightInv n x = modPlus n x (modInv n x) ==. n - n ==. 0 *** QED
  26.  
  27. {-@ leftInv ::  n:Nat -> {x:Nat | x < n} -> {modPlus n (modInv n x) x  == 0} @-}
  28. leftInv n x = modPlus n (modInv n x) x ==. n - n ==. 0 *** QED
  29.  
  30. {-@ com ::
  31.     n:Nat ->
  32.     {x:Nat | x < n} ->
  33.     {y:Nat | y < n} ->
  34.     {modPlus n x y == modPlus n y x} @-}
  35. com :: Int -> Int -> Int -> Proof
  36. com n x y
  37.     | x + y >= n = modPlus n x y ==. x + y - n ==. y + x - n ==. modPlus n y x *** QED
  38.     | otherwise = modPlus n x y ==. x + y ==. y + x ==. modPlus n y x *** QED
  39.  
  40.  
  41. {-@ asso ::
  42.     n:Nat ->
  43.     {x:Nat | x < n} ->
  44.     {y:Nat | y < n} ->
  45.     {z:Nat | z < n} ->
  46.     {modPlus n x (modPlus n y z) == modPlus n (modPlus n x y) z} @-}
  47. asso :: Int -> Int -> Int -> Int -> Proof
  48. asso _ _ _ _ = undefined
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement