Liquid Haskell Proofs

https://travis-ci.org/wkunkel/liquidhaskell-proofs.svg?branch=master

Goals

  • Formally prove the theorems outlined in the “Reasoning about Programs” chapter of the book “Programming in Haskell” using Liquid Haskell
  • Formally prove the theoerms in the paper “Calculating Correct Compilers” which the chapter was adapted from.

Tasks

Chapter

reverse [x] = [x]

add n Zero = n

add x (add y z) = add (add x y) z

length (replicate n x) = n

reverse (reverse xs) = xs and corresponding lemmas

reverse xs = reverse′ xs []

reverse xs = foldl (flip (:)) [] xs

flatten t = flatten′ t []

exec (comp e) [] = [eval e] and corresponding lemmas

exec (comp′ e c) s = exec c (eval e : s)

Exercises

add n (Succ m) = Succ (add n m)

add n m = add m n

all (== x) (replicate n x)

xs ++ [] = xs

xs ++ (ys ++ zs) = (xs ++ ys) ++ zs

reverse (xs ++ [x]) = x : reverse xs

map f (map g xs) = map (f . g) xs

take n xs ++ drop n xs = xs

the number of leaves in a binary tree without empty nodes is one more than the number of internal nodes

construct comp′ given comp′ e c = comp e ++ c (this might not be in scope).