Put mouse over identifiers to see inferred types
 1: GHC.Types.Module{-@ LIQUID "--exactdc" @-}
 2: {-@ LIQUID "--higherorder" @-}
 3: 
 4: module Reverse where 
 5: 
 6: import LiquidHaskell.ProofCombinators 
 7: import Prelude hiding (reverse, (++), length)
 8: 
 9: {-@ measure length @-}
10: {-@ length :: [a] -> Nat @-} 
11: length :: [a] -> Int 
12: x1:[a] -> {v : GHC.Types.Int | v >= 0
                               && v == Reverse.length x1}length []     = 0 
13: length (_:xs) = {v : GHC.Types.Int | v == (1 : int)}1 x1:GHC.Types.Int -> x2:GHC.Types.Int -> {v : GHC.Types.Int | v == x1 + x2}+ {v : GHC.Types.Int | v >= 0
                     && v == Reverse.length xs}length xs
14: 
15: {-@ infix   : @-}
16: {-@ reflect reverse @-}
17: {-@ reverse :: is:[a] -> {os:[a] | length is == length os} @-}
18: reverse :: [a] -> [a]
19: x1:[a] -> {os : [a] | Reverse.length x1 == Reverse.length os}reverse []     = []
20: reverse (x:xs) = {os : [a] | Reverse.length xs == Reverse.length os
            && os == Reverse.reverse xs}reverse xs ++ [x]
21: 
22: {-@ infix   ++ @-}
23: {-@ reflect ++ @-}
24: {-@ (++) :: xs:[a] -> ys:[a] -> {os:[a] | length os == length xs + length ys} @-}
25: (++) :: [a] -> [a] -> [a]
26: []     x1:[a] -> x2:[a] -> {os : [a] | Reverse.length os == Reverse.length x1 + Reverse.length x2}++ [a]ys = ys
27: (x:xs) ++ ys = x:({os : [a] | Reverse.length os == Reverse.length xs + Reverse.length ys
            && os == Reverse.++ xs ys}xs ++ ys)
28: 
29: 
30: singletonP :: a -> Proof
31: {-@ singletonP :: x:a -> { reverse [x] == [x] } @-}
32: x1:a -> {VV : () | Reverse.reverse (GHC.Types.: x1 GHC.Types.[]) == GHC.Types.: x1 GHC.Types.[]}singletonP ax
33:   =   [a]reverse [x]
34:   ==. [a]reverse [] ++ [x]
35:   ==. [a][] ++ [x]
36:   ==. [x]
37:   *** QED