{-
Given postconditions for each possible function called,
Parameter types for each possible function called,
the "top-level" statement we're finding the WLP for,
a "current" statement, and an expression,
find the weakest condition which will imply the postcondition
whenever the statement halts.

We need the postconditions in order to allow function calls, since inferring
Function postconditions is equivalent to inferring loop invariants, if we allow recursion

We need the "top-level" statement to get its free vars, since Z3 is used
to try to find loop invariants in this procedure.
-}
wlp :: (PostConds, ProgParams, Statement)  -> Statement -> Expression -> (Expression, [Expression])
wlp pconds  Skip q = (q, [])
wlp :: (PostConds, ProgParams, Statement)  -> Statement -> Expression -> (Expression, [Expression])
wlp pconds  Skip q = (q, [])
wlp pconds  Skip q = (q, [])