packages feed

mprover-0.0.0.0: examples/Test.hs

module Test where

--
-- As a simple case, let's prove a theorem about lazy lists: namely, that
-- map (+1) zeros = ones (paraphrasing a bit, since we're technically talking
-- about Nats rather than Ints).
--
{ data List a = Nil | Cons a (List a)
; data Nat = Z | S Nat

; map :: (a -> b) -> List a -> List b
; map = \ f -> \ l -> case l of
                      { Nil         -> Nil
                      ; (Cons x xs) -> Cons (f x) (map f xs)
                      }

; ones = Cons (S Z) ones
; zeros = Cons Z zeros

; mapPlusOne ::: { map S zeros = ones }
; mapPlusOne = trans
                (eval ::: { map S zeros = Cons (S Z) (map S zeros) })
                (trans
                 (Cons (eval ::: { S Z = S Z }) (mapPlusOne ::: { map S zeros = ones }))
                 (eval ::: { Cons (S Z) ones = ones }))
}