2022-01-18 20:51:02 +03:00
|
|
|
(* This file is part of the Catala compiler, a specification language for tax
|
|
|
|
and social benefits computation rules. Copyright (C) 2022 Inria, contributor:
|
|
|
|
Aymeric Fromherz <aymeric.fromherz@inria.fr>
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
|
|
use this file except in compliance with the License. You may obtain a copy of
|
|
|
|
the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
License for the specific language governing permissions and limitations under
|
|
|
|
the License. *)
|
|
|
|
|
|
|
|
(** [solve_vc] is the main entry point of this module. It takes a list of
|
|
|
|
expressions [vcs] corresponding to verification conditions that must be
|
|
|
|
discharged by Z3, and attempts to solve them **)
|
|
|
|
let solve_vc
|
2022-08-12 23:42:39 +03:00
|
|
|
(decl_ctx : Shared_ast.decl_ctx)
|
2022-04-04 09:56:48 +03:00
|
|
|
(vcs : Conditions.verification_condition list) : unit =
|
2022-01-19 12:12:20 +03:00
|
|
|
(* Right now we only use the Z3 backend but the functorial interface should
|
|
|
|
make it easy to mix and match different proof backends. *)
|
2022-01-19 12:17:19 +03:00
|
|
|
Z3backend.Io.init_backend ();
|
2022-01-18 20:51:02 +03:00
|
|
|
let z3_vcs =
|
|
|
|
List.map
|
|
|
|
(fun vc ->
|
|
|
|
( vc,
|
|
|
|
try
|
|
|
|
let ctx, z3_vc =
|
2022-01-19 12:17:19 +03:00
|
|
|
Z3backend.Io.translate_expr
|
2022-11-16 23:59:48 +03:00
|
|
|
(Z3backend.Io.make_context decl_ctx)
|
2022-04-12 18:07:00 +03:00
|
|
|
vc.Conditions.vc_guard
|
2022-01-18 20:51:02 +03:00
|
|
|
in
|
|
|
|
Z3backend.Io.Success (z3_vc, ctx)
|
|
|
|
with Failure msg -> Fail msg ))
|
|
|
|
vcs
|
|
|
|
in
|
2022-09-06 15:10:32 +03:00
|
|
|
let all_proven =
|
|
|
|
List.fold_left
|
|
|
|
(fun all_proven vc ->
|
|
|
|
if Z3backend.Io.encode_and_check_vc decl_ctx vc then all_proven
|
|
|
|
else false)
|
|
|
|
true z3_vcs
|
|
|
|
in
|
|
|
|
if all_proven then
|
|
|
|
Utils.Cli.result_format "No errors found during the proof mode run."
|