aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChantal Keller <Chantal.Keller@lri.fr>2022-04-14 18:09:46 +0200
committerChantal Keller <Chantal.Keller@lri.fr>2022-04-14 18:09:46 +0200
commitd2585fac6defa17889a0244556b6822fc0c3cb4e (patch)
treeca0f10fb4be4caadc348670b0fde3ddd49d19cd9
parent7ce6bf4f7740de4c69877ec9179520bcaa0d014c (diff)
parent1f21e1f95d43f5e76e38e1737de9a2a0322fd71c (diff)
downloadsmtcoq-d2585fac6defa17889a0244556b6822fc0c3cb4e.tar.gz
smtcoq-d2585fac6defa17889a0244556b6822fc0c3cb4e.zip
Merge remote-tracking branch 'origin/coq-8.12' into coq-8.13
-rw-r--r--examples/Example.v27
-rw-r--r--src/Misc.v9
-rw-r--r--src/PropToBool.v10
-rw-r--r--src/Tactics.v76
-rw-r--r--src/g_smtcoq.mlg6
-rw-r--r--src/trace/coqInterface.ml1
-rw-r--r--src/trace/coqInterface.mli1
-rw-r--r--src/verit/verit.ml14
-rw-r--r--src/verit/verit.mli4
-rw-r--r--unit-tests/Tests_verit_tactics.v64
10 files changed, 193 insertions, 19 deletions
diff --git a/examples/Example.v b/examples/Example.v
index cd53212..5e12e74 100644
--- a/examples/Example.v
+++ b/examples/Example.v
@@ -14,7 +14,6 @@
If you are using native-coq instead of Coq 8.11, replace it with:
Require Import SMTCoq.
*)
-
Require Import SMTCoq.SMTCoq.
Require Import Bool.
@@ -425,3 +424,29 @@ Section CompCert.
Qed.
End CompCert.
+
+
+(** The verit solver can be called with a timeout (a positive integer,
+ in seconds). If the goal cannot be solved within this given time,
+ then an anomaly is raised.
+ To test, one can uncomment the following examples.
+**)
+
+Section test_timeout.
+
+ Variable P : Z -> bool.
+ Variable H0 : P 0.
+ Variable HInd : forall n, implb (P n) (P (n + 1)).
+
+ Goal P 3.
+ Proof.
+ (* verit_timeout 3. *) verit.
+ Qed.
+
+ Goal true -> P 1000000000.
+ Proof.
+ intro H.
+ (* verit_timeout 5. *)
+ Abort.
+
+End test_timeout.
diff --git a/src/Misc.v b/src/Misc.v
index 86dc1aa..b7afd47 100644
--- a/src/Misc.v
+++ b/src/Misc.v
@@ -457,7 +457,7 @@ intros n i A f; revert i; induction n.
intros i a Hi.
assert (i = 0).
rewrite <- to_Z_eq, to_Z_0.
-generalize (to_Z_bounded i); lia.
+generalize (to_Z_bounded i). change (φ (i) < 1)%Z in Hi. lia.
reflexivity.
intros i a Hi; simpl.
case (i =? 0); [ reflexivity | ].
@@ -481,7 +481,7 @@ Lemma iter_int63_aux_S : forall n i A f a,
Proof.
intros n i A f; revert i; induction n; intros i a Hi.
{
- lia.
+ change (0 < φ (i) < 1)%Z in Hi. lia.
}
simpl.
replace (i =? 0) with false.
@@ -515,8 +515,9 @@ replace (i =? 0) with false.
case_eq (i =? 2).
{
rewrite eqb_spec; intro H; rewrite H in *; clear i H.
- destruct n; [ lia | ].
- case n; reflexivity.
+ destruct n.
+ - change (0 < φ (2) < 2 ^ Z.of_nat 1)%Z with (0 < φ (2) < 2)%Z in Hi. lia.
+ - case n; reflexivity.
}
rewrite <- not_true_iff_false, eqb_spec, <- to_Z_eq.
change (to_Z 2) with 2%Z; intro Hi2.
diff --git a/src/PropToBool.v b/src/PropToBool.v
index d71c81c..5a7bf53 100644
--- a/src/PropToBool.v
+++ b/src/PropToBool.v
@@ -164,10 +164,10 @@ Ltac prop2bool_hyp H :=
destruct HFalse
| ];
clear H';
- match (eval compute in prop2bool_comp) with
+ lazymatch (eval compute in prop2bool_comp) with
| true =>
let A := eval cbv in prop2bool_t in
- match goal with
+ lazymatch goal with
| [ _ : CompDec A |- _ ] => idtac
| _ =>
let Hcompdec := fresh "Hcompdec" in
@@ -195,7 +195,7 @@ Ltac prop2bool_hyp H :=
| _ => prop2bool
end in
tac_rec;
- match goal with
+ lazymatch goal with
| [ |- ?g ] => only [prop2bool_Hbool_evar]: refine g
end;
destruct HFalse
@@ -213,9 +213,9 @@ Ltac prop2bool_hyp H :=
Ltac remove_compdec_hyp H :=
let TH := type of H in
- match TH with
+ lazymatch TH with
| forall p : CompDec ?A, _ =>
- match goal with
+ lazymatch goal with
| [ p' : CompDec A |- _ ] =>
let H1 := fresh in
assert (H1 := H p'); clear H; assert (H := H1); clear H1;
diff --git a/src/Tactics.v b/src/Tactics.v
index 14b984b..6f2c7b1 100644
--- a/src/Tactics.v
+++ b/src/Tactics.v
@@ -29,7 +29,7 @@ Ltac get_hyps_acc acc :=
| id _ => fail
| _ =>
let _ := match goal with _ => change P with (id P) in H end in
- match acc with
+ lazymatch acc with
| Some ?t => get_hyps_acc (Some (H, t))
| None => get_hyps_acc (Some H)
end
@@ -95,6 +95,34 @@ Tactic Notation "verit_bool_no_check" :=
fun Hs => verit_bool_no_check_base_auto Hs; vauto.
+(** Tactics in bool with timeout **)
+
+Tactic Notation "verit_bool_base_auto_timeout" constr(h) int_or_var(timeout) := verit_bool_base_timeout h timeout; auto with typeclass_instances.
+Tactic Notation "verit_bool_no_check_base_auto_timeout" constr(h) int_or_var(timeout) := verit_bool_no_check_base_timeout h timeout; auto with typeclass_instances.
+
+Tactic Notation "verit_bool_timeout" constr(h) int_or_var(timeout) :=
+ let Hs := get_hyps in
+ match Hs with
+ | Some ?Hs => verit_bool_base_auto_timeout (Some (h, Hs)) timeout
+ | None => verit_bool_base_auto_timeout (Some h) timeout
+ end;
+ vauto.
+Tactic Notation "verit_bool_timeout" int_or_var(timeout) :=
+ let Hs := get_hyps in
+ verit_bool_base_auto_timeout Hs timeout; vauto.
+
+Tactic Notation "verit_bool_no_check_timeout" constr(h) int_or_var (timeout) :=
+ let Hs := get_hyps in
+ match Hs with
+ | Some ?Hs => verit_bool_no_check_base_auto_timeout (Some (h, Hs)) timeout
+ | None => verit_bool_no_check_base_auto_timeout (Some h) timeout
+ end;
+ vauto.
+Tactic Notation "verit_bool_no_check_timeout" int_or_var(timeout) :=
+ let Hs := get_hyps in
+ verit_bool_no_check_base_auto_timeout Hs timeout; vauto.
+
+
(** Tactics in Prop **)
Ltac zchaff := prop2bool; zchaff_bool; bool2prop.
@@ -145,6 +173,52 @@ Tactic Notation "verit_no_check" :=
end; vauto
].
+Tactic Notation "verit_timeout" constr(h) int_or_var(timeout) :=
+ prop2bool;
+ [ .. | prop2bool_hyps h;
+ [ .. | let Hs := get_hyps in
+ match Hs with
+ | Some ?Hs =>
+ prop2bool_hyps Hs;
+ [ .. | verit_bool_base_auto_timeout (Some (h, Hs)) timeout ]
+ | None => verit_bool_base_auto_timeout (Some h) timeout
+ end; vauto
+ ]
+ ].
+Tactic Notation "verit_timeout" int_or_var(timeout) :=
+ prop2bool;
+ [ .. | let Hs := get_hyps in
+ match Hs with
+ | Some ?Hs =>
+ prop2bool_hyps Hs;
+ [ .. | verit_bool_base_auto_timeout (Some Hs) timeout ]
+ | None => verit_bool_base_auto_timeout (@None nat) timeout
+ end; vauto
+ ].
+Tactic Notation "verit_no_check_timeout" constr(h) int_or_var(timeout) :=
+ prop2bool;
+ [ .. | prop2bool_hyps h;
+ [ .. | let Hs := get_hyps in
+ match Hs with
+ | Some ?Hs =>
+ prop2bool_hyps Hs;
+ [ .. | verit_bool_no_check_base_auto_timeout (Some (h, Hs)) timeout ]
+ | None => verit_bool_no_check_base_auto_timeout (Some h) timeout
+ end; vauto
+ ]
+ ].
+Tactic Notation "verit_no_check_timeout" int_or_var(timeout) :=
+ prop2bool;
+ [ .. | let Hs := get_hyps in
+ match Hs with
+ | Some ?Hs =>
+ prop2bool_hyps Hs;
+ [ .. | verit_bool_no_check_base_auto_timeout (Some Hs) timeout ]
+ | None => verit_bool_no_check_base_auto_timeout (@None nat) timeout
+ end; vauto
+ ].
+
+
Ltac cvc4 := prop2bool; [ .. | cvc4_bool; bool2prop ].
Ltac cvc4_no_check := prop2bool; [ .. | cvc4_bool_no_check; bool2prop ].
diff --git a/src/g_smtcoq.mlg b/src/g_smtcoq.mlg
index 7b8093b..cd0233f 100644
--- a/src/g_smtcoq.mlg
+++ b/src/g_smtcoq.mlg
@@ -113,8 +113,10 @@ END
TACTIC EXTEND Tactic_verit
-| [ "verit_bool_base" constr(lpl) ] -> { Verit.tactic lpl (get_lemmas ()) }
-| [ "verit_bool_no_check_base" constr(lpl) ] -> { Verit.tactic_no_check lpl (get_lemmas ()) }
+| [ "verit_bool_base" constr(lpl) ] -> { Verit.tactic None lpl (get_lemmas ()) }
+| [ "verit_bool_no_check_base" constr(lpl) ] -> { Verit.tactic_no_check None lpl (get_lemmas ()) }
+| [ "verit_bool_base_timeout" constr(lpl) int_or_var(timeout) ] -> { Verit.tactic (Some timeout) lpl (get_lemmas ()) }
+| [ "verit_bool_no_check_base_timeout" constr(lpl) int_or_var(timeout) ] -> { Verit.tactic_no_check (Some timeout) lpl (get_lemmas ()) }
END
TACTIC EXTEND Tactic_cvc4
diff --git a/src/trace/coqInterface.ml b/src/trace/coqInterface.ml
index f33f091..b139d3e 100644
--- a/src/trace/coqInterface.ml
+++ b/src/trace/coqInterface.ml
@@ -150,6 +150,7 @@ let set_evars_tac noc =
(* Other differences between the two versions of Coq *)
type constr_expr = Constrexpr.constr_expr
let error s = CErrors.user_err (Pp.str s)
+let anomaly s = CErrors.anomaly (Pp.str s)
let warning n s = CWarnings.create ~name:n ~category:"SMTCoq plugin" Pp.str s
let destruct_rel_decl r = Context.Rel.Declaration.get_name r,
diff --git a/src/trace/coqInterface.mli b/src/trace/coqInterface.mli
index af34d87..f4fff30 100644
--- a/src/trace/coqInterface.mli
+++ b/src/trace/coqInterface.mli
@@ -98,6 +98,7 @@ val set_evars_tac : constr -> tactic
(* Other differences between the two versions of Coq *)
type constr_expr = Constrexpr.constr_expr
val error : string -> 'a
+val anomaly : string -> 'a
val warning : string -> string -> unit
val destruct_rel_decl : (constr, types) Context.Rel.Declaration.pt -> name * types
val interp_constr : Environ.env -> Evd.evar_map -> constr_expr -> constr
diff --git a/src/verit/verit.ml b/src/verit/verit.ml
index c2fb186..33f9b4c 100644
--- a/src/verit/verit.ml
+++ b/src/verit/verit.ml
@@ -169,7 +169,7 @@ let export out_channel rt ro lsmt =
exception Unknown
-let call_verit _ rt ro ra_quant rf_quant first lsmt =
+let call_verit timeout _ rt ro ra_quant rf_quant first lsmt =
let (filename, outchan) = Filename.open_temp_file "verit_coq" ".smt2" in
export outchan rt ro lsmt;
close_out outchan;
@@ -177,6 +177,11 @@ let call_verit _ rt ro ra_quant rf_quant first lsmt =
let wname, woc = Filename.open_temp_file "warnings_verit" ".log" in
close_out woc;
let command = "veriT --proof-prune --proof-merge --proof-with-sharing --cnf-definitional --disable-ackermann --input=smtlib2 --proof=" ^ logfilename ^ " " ^ filename ^ " 2> " ^ wname in
+ let command =
+ match timeout with
+ | Some i -> "timeout "^(string_of_int i)^" "^command
+ | None -> command
+ in
Format.eprintf "%s@." command;
let t0 = Sys.time () in
let exit_code = Sys.command command in
@@ -202,7 +207,7 @@ let call_verit _ rt ro ra_quant rf_quant first lsmt =
CoqInterface.error ("veriT failed with the error: " ^ l)
done
with End_of_file -> () in
-
+ if exit_code = 124 (*code for timeout*) then (close_in win; Sys.remove wname; let _ = CoqInterface.anomaly "veriT timed out" in ());
try
if exit_code <> 0 then CoqInterface.warning "verit-non-zero-exit-code" ("Verit.call_verit: command " ^ command ^ " exited with code " ^ string_of_int exit_code);
raise_warnings_errors ();
@@ -217,7 +222,7 @@ let call_verit _ rt ro ra_quant rf_quant first lsmt =
let verit_logic =
SL.of_list [LUF; LLia]
-let tactic_gen vm_cast lcpl lcepl =
+let tactic_gen vm_cast timeout lcpl lcepl =
(* Transform the tuple of lemmas given by the user into a list *)
let lcpl =
let lcpl = EConstr.Unsafe.to_constr lcpl in
@@ -235,6 +240,7 @@ let tactic_gen vm_cast lcpl lcepl =
let rf = VeritSyntax.rf in
let ra_quant = VeritSyntax.ra_quant in
let rf_quant = VeritSyntax.rf_quant in
- SmtCommands.tactic call_verit verit_logic rt ro ra rf ra_quant rf_quant vm_cast lcpl lcepl
+ SmtCommands.tactic (call_verit timeout) verit_logic rt ro ra rf ra_quant rf_quant vm_cast lcpl lcepl
let tactic = tactic_gen vm_cast_true
let tactic_no_check = tactic_gen (fun _ -> vm_cast_true_no_check)
+
diff --git a/src/verit/verit.mli b/src/verit/verit.mli
index 72566d2..d67051f 100644
--- a/src/verit/verit.mli
+++ b/src/verit/verit.mli
@@ -19,5 +19,5 @@ val parse_certif :
val checker : string -> string -> unit
val checker_debug : string -> string -> unit
val theorem : CoqInterface.id -> string -> string -> unit
-val tactic : EConstr.t -> CoqInterface.constr_expr list -> CoqInterface.tactic
-val tactic_no_check : EConstr.t -> CoqInterface.constr_expr list -> CoqInterface.tactic
+val tactic : int option -> EConstr.t -> CoqInterface.constr_expr list -> CoqInterface.tactic
+val tactic_no_check : int option -> EConstr.t -> CoqInterface.constr_expr list -> CoqInterface.tactic
diff --git a/unit-tests/Tests_verit_tactics.v b/unit-tests/Tests_verit_tactics.v
index a6ea27b..4285f96 100644
--- a/unit-tests/Tests_verit_tactics.v
+++ b/unit-tests/Tests_verit_tactics.v
@@ -1498,3 +1498,67 @@ Section OCamlCompDec.
x ++ y = a0::nil -> x = nil /\ y = a0::nil \/ x = a0::nil /\ y = nil.
Proof. verit_no_check. Qed.
End OCamlCompDec.
+
+
+Section TimeoutBool.
+ Variable P : Z -> bool.
+ Variable H0 : P 0.
+ Variable HInd : forall n, implb (P n) (P (n + 1)).
+
+ Goal P 3.
+ Proof.
+ verit_bool_base_auto_timeout (Some (H0, HInd)) 10.
+ Qed.
+
+ Goal P 3.
+ Proof.
+ verit_bool_no_check_base_auto_timeout (Some (H0, HInd)) 10.
+ Qed.
+
+ Goal P 3.
+ Proof.
+ verit_bool_timeout (H0, HInd) 10.
+ Qed.
+
+ Goal P 3.
+ Proof.
+ verit_bool_timeout 10.
+ Qed.
+
+ Goal P 3.
+ Proof.
+ verit_bool_no_check_timeout (H0, HInd) 10.
+ Qed.
+
+ Goal P 3.
+ Proof.
+ verit_bool_no_check_timeout 10.
+ Qed.
+End TimeoutBool.
+
+
+Section TimeoutProp.
+ Variable P : Z -> bool.
+ Variable H0 : P 0.
+ Variable HInd : forall n, (P n) -> (P (n + 1)).
+
+ Goal P 3.
+ Proof.
+ verit_timeout (H0, HInd) 10.
+ Qed.
+
+ Goal P 3.
+ Proof.
+ verit_timeout 10.
+ Qed.
+
+ Goal P 3.
+ Proof.
+ verit_no_check_timeout (H0, HInd) 10.
+ Qed.
+
+ Goal P 3.
+ Proof.
+ verit_no_check_timeout 10.
+ Qed.
+End TimeoutProp.