## 16.4 Function call

Still following the syntax of ML, the function application is written (f a1 ... an), where f is a function and the ai's its arguments. Notice that f and the ai's may be annotated programs themselves.
In the general case, f is a function already specified (either with `Global Variable` or with a proof of correctness) and has a pre-condition Pf and a post-condition Qf.
As expected, a proof obligation is generated, which correspond to Pf applied to the values of the arguments, once they are evaluated.
Regarding the post-condition of f, there are different possible cases:

- either you did not annotate the function call, writing directly
  (f a1 ... an)
  and then the post-condition of f is added automatically if possible: indeed, if some arguments of f make side-effects this is not always possible. In that case, you have to put a post-condition to the function call by yourself;
- or you annotated it with a post-condition, say Q:
  (f a1 ... an) { Q }
  then you will have to prove that Q holds under the hypothesis that the post-condition Qf holds (where both are instantiated by the results of the evaluation of the ai). Of course, if Q is exactly the post-condition of f then the corresponding proof obligation will be automatically discharged.