aboutsummaryrefslogtreecommitdiffhomepage
path: root/contrib/first-order/rules.ml
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/first-order/rules.ml')
-rw-r--r--contrib/first-order/rules.ml142
1 files changed, 79 insertions, 63 deletions
diff --git a/contrib/first-order/rules.ml b/contrib/first-order/rules.ml
index be91c9ec5..12593de70 100644
--- a/contrib/first-order/rules.ml
+++ b/contrib/first-order/rules.ml
@@ -24,7 +24,9 @@ type seqtac= (Sequent.t -> tactic) -> Sequent.t -> tactic
type lseqtac= global_reference -> seqtac
-let wrap n b tacrec seq gls=
+type 'a with_backtracking = tactic -> 'a
+
+let wrap n b continue seq gls=
check_for_interrupt ();
let nc=pf_hyps gls in
let env=pf_env gls in
@@ -41,7 +43,7 @@ let wrap n b tacrec seq gls=
let seq1=aux n nc [] in
let seq2=if b then
add_formula true dummy_id (pf_concl gls) seq1 gls else seq1 in
- tacrec seq2 gls
+ continue seq2 gls
let id_of_global=function
VarRef id->id
@@ -58,47 +60,53 @@ let axiom_tac t seq=
try exact_no_check (constr_of_reference (find_left t seq))
with Not_found->tclFAIL 0 "No axiom link"
-let ll_atom_tac a id tacrec seq=
- try
- tclTHENLIST
- [generalize [mkApp(constr_of_reference id,
- [|constr_of_reference (find_left a seq)|])];
- clear_global id;
- introf;
- wrap 1 false tacrec seq]
- with Not_found->tclFAIL 0 "No link"
+let ll_atom_tac a backtrack id continue seq=
+ tclIFTHENELSE
+ (try
+ tclTHENLIST
+ [generalize [mkApp(constr_of_reference id,
+ [|constr_of_reference (find_left a seq)|])];
+ clear_global id;
+ introf]
+ with Not_found->tclFAIL 0 "No link")
+ (wrap 1 false continue seq) backtrack
(* right connectives rules *)
-let and_tac tacrec seq=
- tclTHEN simplest_split (wrap 0 true tacrec seq)
+let and_tac backtrack continue seq=
+ tclIFTHENELSE simplest_split (wrap 0 true continue seq) backtrack
-let or_tac tacrec seq=
- any_constructor (Some (tclSOLVE [wrap 0 true tacrec seq]))
+let or_tac backtrack continue seq=
+ tclORELSE
+ (any_constructor (Some (tclSOLVE [wrap 0 true continue seq])))
+ backtrack
-let arrow_tac tacrec seq=
- tclTHEN introf (wrap 1 true tacrec seq)
+let arrow_tac continue seq=
+ tclTHEN introf (wrap 1 true continue seq)
(* left connectives rules *)
-let left_and_tac ind id tacrec seq=
- let n=(construct_nhyps ind).(0) in
- tclTHENLIST
+let left_and_tac ind backtrack id continue seq=
+ let n=(construct_nhyps ind).(0) in
+ tclIFTHENELSE
+ (tclTHENLIST
[simplest_elim (constr_of_reference id);
clear_global id;
- tclDO n introf;
- wrap n false tacrec seq]
+ tclDO n introf])
+ (wrap n false continue seq)
+ backtrack
-let left_or_tac ind id tacrec seq=
+let left_or_tac ind backtrack id continue seq=
let v=construct_nhyps ind in
let f n=
tclTHENLIST
[clear_global id;
tclDO n introf;
- wrap n false tacrec seq] in
- tclTHENSV
+ wrap n false continue seq] in
+ tclIFTHENSVELSE
(simplest_elim (constr_of_reference id))
(Array.map f v)
+ backtrack
let left_false_tac id=
simplest_elim (constr_of_reference id)
@@ -107,8 +115,7 @@ let left_false_tac id=
(* We use this function for false, and, or, exists *)
-let ll_ind_tac ind largs id tacrec seq gl=
- (try
+let ll_ind_tac ind largs backtrack id continue seq gl=
let rcs=ind_hyps 0 ind largs in
let vargs=Array.of_list largs in
(* construire le terme H->B, le generaliser etc *)
@@ -122,56 +129,65 @@ let ll_ind_tac ind largs id tacrec seq gl=
Sign.it_mkLambda_or_LetIn head rc in
let lp=Array.length rcs in
let newhyps=list_tabulate myterm lp in
- tclTHENLIST
- [generalize newhyps;
- clear_global id;
- tclDO lp introf;
- wrap lp false tacrec seq]
- with Invalid_argument _ ->tclFAIL 0 "") gl
-
-let ll_arrow_tac a b c id tacrec seq=
+ tclIFTHENELSE
+ (tclTHENLIST
+ [generalize newhyps;
+ clear_global id;
+ tclDO lp introf])
+ (wrap lp false continue seq) backtrack gl
+
+let ll_arrow_tac a b c backtrack id continue seq=
let cc=mkProd(Anonymous,a,(lift 1 b)) in
let d=mkLambda (Anonymous,b,
mkApp ((constr_of_reference id),
[|mkLambda (Anonymous,(lift 1 a),(mkRel 2))|])) in
- tclTHENS (cut c)
- [tclTHENLIST
- [introf;
- clear_global id;
- wrap 1 false tacrec seq];
- tclTHENS (cut cc)
- [exact_no_check (constr_of_reference id);
- tclTHENLIST
- [generalize [d];
- introf;
+ tclORELSE
+ (tclTHENS (cut c)
+ [tclTHENLIST
+ [introf;
clear_global id;
- tclSOLVE [wrap 1 true tacrec seq]]]]
+ wrap 1 false continue seq];
+ tclTHENS (cut cc)
+ [exact_no_check (constr_of_reference id);
+ tclTHENLIST
+ [generalize [d];
+ introf;
+ clear_global id;
+ tclSOLVE [wrap 1 true continue seq]]]])
+ backtrack
(* quantifier rules (easy side) *)
-let forall_tac tacrec seq=
- tclTHEN introf (wrap 0 true tacrec seq)
+let forall_tac backtrack continue seq=
+ tclORELSE
+ (tclTHEN introf (wrap 0 true continue seq))
+ (if !qflag then
+ tclFAIL 0 "reversible in 1st order mode"
+ else
+ backtrack)
-let left_exists_tac ind id tacrec seq=
+let left_exists_tac ind id continue seq=
let n=(construct_nhyps ind).(0) in
tclTHENLIST
[simplest_elim (constr_of_reference id);
clear_global id;
tclDO n introf;
- (wrap (n-1) false tacrec seq)]
-
-let ll_forall_tac prod id tacrec seq=
- tclTHENS (cut prod)
- [tclTHENLIST
- [introf;
- (fun gls->
- let id0=pf_nth_hyp_id gls 1 in
- let term=mkApp((constr_of_reference id),[|mkVar(id0)|]) in
- tclTHEN (generalize [term]) (clear [id0]) gls);
- clear_global id;
- introf;
- tclSOLVE [wrap 1 false tacrec (deepen seq)]];
- tclSOLVE [wrap 0 true tacrec (deepen seq)]]
+ (wrap (n-1) false continue seq)]
+
+let ll_forall_tac prod backtrack id continue seq=
+ tclORELSE
+ (tclTHENS (cut prod)
+ [tclTHENLIST
+ [introf;
+ (fun gls->
+ let id0=pf_nth_hyp_id gls 1 in
+ let term=mkApp((constr_of_reference id),[|mkVar(id0)|]) in
+ tclTHEN (generalize [term]) (clear [id0]) gls);
+ clear_global id;
+ introf;
+ tclSOLVE [wrap 1 false continue (deepen seq)]];
+ tclSOLVE [wrap 0 true continue (deepen seq)]])
+ backtrack
(* rules for instantiation with unification moved to instances.ml *)