let prove ctx f is_valid =
begin
Z3.push ctx;
let not_f = Z3.mk_not ctx f in
Z3.assert_cnstr ctx not_f;
(match Z3.check_and_get_model ctx with
| (Z3.L_FALSE,_) ->
printf "valid\n";
if not is_valid then exitf "unexpected result";
| (Z3.L_UNDEF,m) ->
printf "unknown\n";
printf "potential counterexample:\n%s\n" (Z3.model_to_string ctx m);
if is_valid then exitf "unexpected result";
| (Z3.L_TRUE,m) ->
printf "invalid\n";
printf "counterexample:\n%s\n" (Z3.model_to_string ctx m);
if is_valid then exitf "unexpected result";
);
Z3.pop ctx 1;
end