diff options
| author | herbelin | 2000-04-30 00:47:42 +0000 |
|---|---|---|
| committer | herbelin | 2000-04-30 00:47:42 +0000 |
| commit | 779a8f64d36ab2a46224d9916a36473119e8f84d (patch) | |
| tree | d0033c39a3015ab8e37929f0e9d64b9a45f29734 | |
| parent | 4e4e62ccb7c0dc2dc2796e32cfab5b80d268ccf8 (diff) | |
Adaptés pour le type constr_pattern et les nouvelles fonctions de filtrage
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@389 85f007b7-540e-0410-9357-904b9bb8a0f7
| -rw-r--r-- | tactics/equality.ml | 214 | ||||
| -rw-r--r-- | tactics/equality.mli | 6 | ||||
| -rw-r--r-- | tactics/tauto.ml | 200 |
3 files changed, 224 insertions, 196 deletions
diff --git a/tactics/equality.ml b/tactics/equality.ml index e1fe98148c..b282309927 100644 --- a/tactics/equality.ml +++ b/tactics/equality.ml @@ -176,24 +176,28 @@ let find_constructor env sigma c = type leibniz_eq = { eq : marked_term; ind : marked_term; - rrec : marked_pattern option; + rrec : marked_term option; rect : marked_term option; - congr: marked_pattern; - sym : marked_pattern } + congr: marked_term; + sym : marked_term } let mmk = make_module_marker [ "Prelude"; "Logic_Type"; "Specif"; "Logic" ] (* Patterns *) -let eq_pattern = put_pat mmk "(eq ? ? ?)" -let not_pattern = put_pat mmk "(not ?)" -let imp_False_pattern = put_pat mmk "? -> False" +let eq_pattern_mark = put_pat mmk "(eq ?1 ?2 ?3)" +let not_pattern_mark = put_pat mmk "(not ?)" +let imp_False_pattern_mark = put_pat mmk "? -> False" + +let eq_pattern () = get_pat eq_pattern_mark +let not_pattern () = get_pat not_pattern_mark +let imp_False_pattern () = get_pat imp_False_pattern_mark let eq= { eq = put_squel mmk "eq"; ind = put_squel mmk "eq_ind" ; - rrec = Some (put_pat mmk "eq_rec"); + rrec = Some (put_squel mmk "eq_rec"); rect = Some (put_squel mmk "eq_rect"); - congr = put_pat mmk "f_equal" ; - sym = put_pat mmk "sym_eq" } + congr = put_squel mmk "f_equal" ; + sym = put_squel mmk "sym_eq" } let build_eq eq = get_squel eq.eq let build_ind eq = get_squel eq.ind @@ -202,23 +206,25 @@ let build_rect eq = | None -> assert false | Some sq -> get_squel sq -let eqT_pattern = put_pat mmk "(eqT ? ? ?)" +let eqT_pattern_mark = put_pat mmk "(eqT ?1 ?2 ?3)" +let eqT_pattern () = get_pat eqT_pattern_mark let eqT= { eq = put_squel mmk "eqT"; ind = put_squel mmk "eqT_ind" ; rrec = None; rect = None; - congr = put_pat mmk "congr_eqT" ; - sym = put_pat mmk "sym_eqT" } + congr = put_squel mmk "congr_eqT" ; + sym = put_squel mmk "sym_eqT" } -let idT_pattern = put_pat mmk "(identityT ? ? ?)" +let idT_pattern_mark = put_pat mmk "(identityT ?1 ?2 ?3)" +let idT_pattern () = get_pat idT_pattern_mark let idT = { eq = put_squel mmk "identityT"; ind = put_squel mmk "identityT_ind" ; - rrec = Some (put_pat mmk "identityT_rec") ; + rrec = Some (put_squel mmk "identityT_rec") ; rect = Some (put_squel mmk "identityT_rect"); - congr = put_pat mmk "congr_idT" ; - sym = put_pat mmk "sym_idT" } + congr = put_squel mmk "congr_idT" ; + sym = put_squel mmk "sym_idT" } (* List of constructions depending of the initial state *) @@ -238,10 +244,20 @@ let build_UnitT () = get_squel squel_UnitT let build_IT () = get_squel squel_IT let build_I () = get_squel squel_I -let pat_False = put_pat mmk "False" -let pat_EmptyT = put_pat mmk "EmptyT" +let pat_False_mark = put_pat mmk "False" +let pat_False () = get_pat pat_False_mark +let pat_EmptyT_mark = put_pat mmk "EmptyT" +let pat_EmptyT () = get_pat pat_EmptyT_mark + let notT_pattern = put_pat mmk "(notT ?)" +(* Destructuring patterns *) +let match_eq eqn eq_pat = + match matches eqn eq_pat with + | [(1,t);(2,x);(3,y)] -> (t,x,y) + | _ -> anomaly "match_eq: an eq pattern should match 3 terms" + + let rec hd_of_prod prod = match strip_outer_cast prod with | (DOP2(Prod,c,DLAM(n,t'))) -> hd_of_prod t' @@ -274,14 +290,14 @@ let necessary_elimination sort_arity sort = [< 'sTR "no primitive equality on proofs" >] let find_eq_pattern aritysort sort = -(* let mt =*) + let mt = match necessary_elimination aritysort sort with | Set_Type -> eq.eq | Type_Type -> idT.eq | Set_SetorProp -> eq.eq | Type_SetorProp -> eqT.eq -(* in - get_pat mt*) + in + get_squel mt (* [find_positions t1 t2] @@ -325,14 +341,15 @@ let find_positions env sigma t1 t2 = match (whd_betadeltaiota_stack env sigma t1 [], whd_betadeltaiota_stack env sigma t2 []) with - | ((DOPN(MutConstruct _ as oper1,_) as hd1,args1), - (DOPN(MutConstruct _ as oper2,_) as hd2,args2)) -> + | ((DOPN(MutConstruct sp1 as oper1,_) as hd1,args1), + (DOPN(MutConstruct sp2 as oper2,_) as hd2,args2)) -> (* both sides are constructors, so either we descend, or we can discriminate here. *) - if oper1 = oper2 then - List.flatten (list_map2_i (fun i arg1 arg2 -> - findrec ((oper1,i)::posn) arg1 arg2) - 0 args1 args2) + if sp1 = sp2 then + List.flatten + (list_map2_i + (fun i arg1 arg2 -> findrec ((oper1,i)::posn) arg1 arg2) + 0 args1 args2) else raise (DiscrFound(List.rev posn,oper1,oper2)) @@ -351,8 +368,8 @@ let find_positions env sigma t1 t2 = in (try Inr(findrec [] t1 t2) - with DiscrFound (x_0,x_1,x_2) -> - Inl (x_0,x_1,x_2)) + with DiscrFound (path,c1,c2) -> + Inl (path,c1,c2)) let discriminable env sigma t1 t2 = match find_positions env sigma t1 t2 with @@ -526,24 +543,19 @@ let rec build_discriminator sigma env dirn c sort = function ,DOP0(Sort(Prop Null)))) | _ -> assert false -let dest_somatch_eq eqn eq_pat = - match matches eqn eq_pat with - | [t;x;y] -> (t,x,y) - | _ -> anomaly "dest_somatch_eq: an eq pattern should match 3 terms" - let find_eq_data_decompose eqn = - if (matches eqn eq_pattern) then - (eq, dest_somatch_eq eqn eq_pattern) - else if (somatches eqn eqT_pattern) then - (eqT, dest_somatch_eq eqn eqT_pattern) - else if (somatches eqn idT_pattern) then - (idT, dest_somatch_eq eqn idT_pattern) + if (is_matching (eq_pattern ()) eqn) then + (eq, match_eq (eq_pattern ()) eqn) + else if (is_matching (eqT_pattern ()) eqn) then + (eqT, match_eq (eqT_pattern ()) eqn) + else if (is_matching (idT_pattern ()) eqn) then + (idT, match_eq (idT_pattern ()) eqn) else errorlabstrm "find_eq_data_decompose" [< >] let gen_absurdity id gl = - if (matches gl (clause_type (Some id) gl) pat_False) - or (matches gl (clause_type (Some id) gl) pat_EmptyT) + if (pf_is_matching gl (pat_False ()) (clause_type (Some id) gl)) + or (pf_is_matching gl (pat_EmptyT ()) (clause_type (Some id) gl)) then simplest_elim (VAR id) gl else @@ -636,9 +648,9 @@ let discrOnLastHyp gls = let discrClause cls gls = match cls with | None -> - if somatches (pf_concl gls) not_pattern then + if is_matching (not_pattern ()) (pf_concl gls) then (tclTHEN (tclTHEN hnf_in_concl intro) discrOnLastHyp) gls - else if somatches (pf_concl gls) imp_False_pattern then + else if is_matching (imp_False_pattern ()) (pf_concl gls) then (tclTHEN intro discrOnLastHyp) gls else errorlabstrm "DiscrClause" (insatisfied_prec_message cls) @@ -688,16 +700,16 @@ let projT2_term = put_squel mmk "projT2" let sigT_rect_term = put_squel mmk "sigT_rect" let build_sigma_prop () = - (get_squel projS1_term, - get_squel projS2_term, - get_squel sigS_rec_term, + (fst (destConst (get_squel projS1_term)), + fst (destConst (get_squel projS2_term)), + fst (destConst (get_squel sigS_rec_term)), get_squel existS_term, get_squel sigS_term) let build_sigma_type () = - (get_squel projT1_term, - get_squel projT2_term, - get_squel sigT_rect_term, + (fst (destConst (get_squel projT1_term)), + fst (destConst (get_squel projT2_term)), + fst (destConst (get_squel sigT_rect_term)), get_squel existT_term, get_squel sigT_term) @@ -774,24 +786,40 @@ let minimal_free_rels env sigma (c,cty) = dependencies are of the same sort *) -let sig_clausale_forme env sigma sort_of_ty siglen ty = +let sig_clausale_forme env sigma sort_of_ty siglen ty (dFLT,dFLTty) = let (_,_,_,exist_term,_) = find_sigma_data sort_of_ty in let rec sigrec_clausale_forme siglen ty = if siglen = 0 then - let mv = new_meta() in - (DOP0(Meta mv),(mv,ty),[(mv,ty)]) + (* We obtain the components dependent in dFLT by matching *) + let headpat = nf_betadeltaiota env sigma ty in + let nf_ty = nf_betadeltaiota env sigma dFLTty in + let bindings = + list_try_find + (fun ty -> + try + (* Test inutile car somatch ne prend pas en compte les univers *) + if is_Type headpat & is_Type ty then + [] + else + matches (pattern_of_constr headpat) ty + with e when catchable_exception e -> failwith "caught") + [dFLTty; nf_ty] + in + (bindings,dFLT) else let (a,p) = match whd_stack env sigma (whd_beta env sigma ty) [] with | (_,[a;p]) -> (a,p) | _ -> anomaly "sig_clausale_forme: should be a sigma type" in let mv = new_meta() in let rty = applist(p,[DOP0(Meta mv)]) in - let (rpat,headinfo,mvenv) = sigrec_clausale_forme (siglen-1) rty in - (applist(exist_term,[a;p;DOP0(Meta mv);rpat]), - headinfo, - (mv,a)::mvenv) + let (bindings,tuple_tail) = sigrec_clausale_forme (siglen-1) rty in + let w = + try List.assoc mv bindings + with Not_found -> + anomaly "Not enough components to build the dependent tuple" in + (bindings,applist(exist_term,[a;p;w;tuple_tail])) in - sigrec_clausale_forme siglen ty + snd (sigrec_clausale_forme siglen ty) (* [make_iterated_tuple sigma env DFLT c] @@ -832,25 +860,9 @@ let make_iterated_tuple sigma env (dFLT,dFLTty) (c,cty) = sorted_rels in if not(closed0 tuplety) then failwith "make_iterated_tuple"; - let (tuplepat,(headmv,headpat),mvenv) = + let dfltval = sig_clausale_forme env sigma sort_of_cty (List.length sorted_rels) - tuplety - in - let headpat = nf_betadeltaiota env sigma headpat in - let nf_ty = nf_betadeltaiota env sigma dFLTty in - let dfltval = - list_try_find - (fun ty -> - try - let binding = - if is_Type headpat & is_Type ty then - [] - else - somatch None headpat ty - in - instance ((headmv,dFLT)::binding) tuplepat - with e when catchable_exception e -> failwith "caught") - [dFLTty; nf_ty] + tuplety (dFLT,dFLTty) in (tuple,tuplety,dfltval) @@ -927,7 +939,7 @@ let inj id gls = [<'sTR "Failed to decompose the equality">]; tclMAP (fun (injfun,resty) -> - let pf = applist(get_pat eq.congr, + let pf = applist(get_squel eq.congr, [t;resty;injfun; try_delta_expand env sigma t1; try_delta_expand env sigma t2; @@ -941,7 +953,7 @@ let inj id gls = let injClause cls gls = match cls with | None -> - if somatches (pf_concl gls) not_pattern then + if is_matching (not_pattern ()) (pf_concl gls) then (tclTHEN (tclTHEN hnf_in_concl intro) (onLastHyp (compose inj out_some))) gls else @@ -1004,7 +1016,7 @@ let decompEqThen ntac id gls = [<'sTR "Discriminate failed to decompose the equality">]; ((tclTHEN (tclMAP (fun (injfun,resty) -> - let pf = applist(get_pat lbeq.congr, + let pf = applist(get_squel lbeq.congr, [t;resty;injfun;t1;t2; VAR id]) in let ty = pf_type_of gls pf in @@ -1020,7 +1032,7 @@ let decompEq = decompEqThen (fun x -> tclIDTAC) let dEqThen ntac cls gls = match cls with | None -> - if somatches (pf_concl gls) not_pattern then + if is_matching (not_pattern ()) (pf_concl gls) then (tclTHEN hnf_in_concl (tclTHEN intro (onLastHyp (compose (decompEqThen ntac) out_some)))) gls @@ -1057,7 +1069,7 @@ let swap_equands gls eqn = find_eq_data_decompose eqn with _ -> errorlabstrm "swap_equamds" (rewrite_msg None) in - applist(get_pat lbeq.eq,[t;e2;e1]) + applist(get_squel lbeq.eq,[t;e2;e1]) let swapEquandsInConcl gls = let (lbeq,(t,e1,e2)) = @@ -1065,7 +1077,7 @@ let swapEquandsInConcl gls = find_eq_data_decompose (pf_concl gls) with _-> errorlabstrm "SwapEquandsInConcl" (rewrite_msg None) in - let sym_equal = get_pat lbeq.sym in + let sym_equal = get_squel lbeq.sym in refine (applist(sym_equal,[t;e2;e1;DOP0(Meta(new_meta()))])) gls let swapEquandsInHyp id gls = @@ -1080,15 +1092,15 @@ let swapEquandsInHyp id gls = let find_elim sort_of_gl lbeq = match sort_of_gl with - | DOP0(Sort(Prop Null)) (* Prop *) -> (get_pat lbeq.ind, false) + | DOP0(Sort(Prop Null)) (* Prop *) -> (get_squel lbeq.ind, false) | DOP0(Sort(Prop Pos)) (* Set *) -> (match lbeq.rrec with - | Some eq_rec -> (get_pat eq_rec, false) + | Some eq_rec -> (get_squel eq_rec, false) | None -> errorlabstrm "find_elim" [< 'sTR "this type of elimination is not allowed">]) | _ (* Type *) -> (match lbeq.rect with - | Some eq_rect -> (get_pat eq_rect, true) + | Some eq_rect -> (get_squel eq_rect, true) | None -> errorlabstrm "find_elim" [< 'sTR "this type of elimination is not allowed">]) @@ -1099,7 +1111,7 @@ let find_elim sort_of_gl lbeq = let build_dependent_rewrite_predicate (t,t1,t2) body lbeq gls = let e = pf_get_new_id (id_of_string "e") gls in let h = pf_get_new_id (id_of_string "HH") gls in - let eq_term = get_pat lbeq.eq in + let eq_term = get_squel lbeq.eq in (mkNamedLambda e t (mkNamedLambda h (applist (eq_term, [t;t1;(Rel 1)])) (lift 1 body))) @@ -1156,26 +1168,27 @@ let bareRevSubstInConcl lbeq body (t,e1,e2) gls = *) (* squeletons *) -let comp_carS_squeleton = put_pat mmk "<<x>>(projS1 ? ? (?)@[x])" -let comp_cdrS_squeleton = put_pat mmk "<<x>>(projS2 ? ? (?)@[x])" +let comp_carS_squeleton = put_squel mmk "<<x>>(projS1 ? ? (?)@[x])" +let comp_cdrS_squeleton = put_squel mmk "<<x>>(projS2 ? ? (?)@[x])" -let comp_carT_squeleton = put_pat mmk "<<x>>(projT1 ? ? (?)@[x])" -let comp_cdrT_squeleton = put_pat mmk "<<x>>(projT2 ? ? (?)@[x])" +let comp_carT_squeleton = put_squel mmk "<<x>>(projT1 ? ? (?)@[x])" +let comp_cdrT_squeleton = put_squel mmk "<<x>>(projT2 ? ? (?)@[x])" -let dest_somatch_sigma ex ex_pat = - match dest_somatch ex ex_pat with - | [a;p;car;cdr] -> (a,p,car,cdr) - | _ -> anomaly "dest_somatch_sigma: a sigma pattern should match 4 terms" +let match_sigma ex ex_pat = + match matches (get_pat ex_pat) ex with + | [(1,a);(2,p);(3,car);(4,cdr)] -> (a,p,car,cdr) + | _ -> + anomaly "match_sigma: a successful sigma pattern should match 4 terms" let find_sigma_data_decompose ex = try (comp_carS_squeleton, comp_cdrS_squeleton, - dest_somatch_sigma ex existS_pattern) - with _ -> + match_sigma ex existS_pattern) + with PatternMatchingFailure -> (try (comp_carT_squeleton,comp_cdrT_squeleton, - dest_somatch_sigma ex existT_pattern) - with _ -> + match_sigma ex existT_pattern) + with PatternMatchingFailure -> errorlabstrm "find_sigma_data_decompose" [< >]) let decomp_tuple_term env = @@ -1194,7 +1207,7 @@ let decomp_tuple_term env = let subst_tuple_term env sigma dep_pair b = let sort_of_dep_pair = type_of env sigma (type_of env sigma dep_pair) in - let (proj1_term,proj2_term,sig_elim_term,_,_) = + let (proj1_sp,proj2_sp,sig_elim_sp,_,_) = find_sigma_data sort_of_dep_pair in let e_list = decomp_tuple_term env dep_pair in let abst_B = @@ -1206,9 +1219,6 @@ let subst_tuple_term env sigma dep_pair b = in let app_B = applist(abst_B,(List.map (fun (_,_,c) -> (sAPP c (Rel 1))) e_list)) in - let (proj1_sp,_) = destConst (get_pat proj1_term) - and (proj2_sp,_) = destConst (get_pat proj2_term) - and (sig_elim_sp,_) = destConst (get_pat sig_elim_term) in strong (fun _ _ -> compose (whd_betaiota env sigma) (whd_const [proj1_sp;proj2_sp;sig_elim_sp] env sigma)) diff --git a/tactics/equality.mli b/tactics/equality.mli index 8dc9450d1a..789328f51b 100644 --- a/tactics/equality.mli +++ b/tactics/equality.mli @@ -28,9 +28,9 @@ val eq : leibniz_eq val eqT : leibniz_eq val idT : leibniz_eq -val eq_pattern : marked_term -val eqT_pattern : marked_term -val idT_pattern : marked_term +val eq_pattern : unit -> constr_pattern +val eqT_pattern : unit -> constr_pattern +val idT_pattern : unit -> constr_pattern val find_eq_pattern : sorts -> sorts -> constr diff --git a/tactics/tauto.ml b/tactics/tauto.ml index 334eb304ec..7010aba19f 100644 --- a/tactics/tauto.ml +++ b/tactics/tauto.ml @@ -16,6 +16,7 @@ open Reduction open Tacticals open Tactics open Pattern +open Hipattern open Auto (* Chet's code *) open Proof_trees @@ -44,29 +45,36 @@ let classically cltac = function | (Some _ as cls) -> (tclTHEN (cltac cls) (clear_clause cls)) | None -> cltac None -let somatch m pat = somatch None (get_pat pat) m let module_mark = ["Logic"] (* patterns *) let mmk = make_module_marker ["Prelude"] -let false_pattern = put_pat mmk "False" -let true_pattern = put_pat mmk "True" -let and_pattern = put_pat mmk "(and ? ?)" -let or_pattern = put_pat mmk "(or ? ?)" -let eq_pattern = put_pat mmk "(eq ? ? ?)" +let false_pattern_mark = put_pat mmk "False" +let true_pattern_mark = put_pat mmk "True" +let and_pattern_mark = put_pat mmk "(and ?1 ?2)" +let or_pattern_mark = put_pat mmk "(or ?1 ?2)" +let eq_pattern_mark = put_pat mmk "(eq ?1 ?2 ?3)" let pi_pattern = put_pat mmk "(x : ?)((?)@[x])" let imply_pattern = put_pat mmk "?1 -> ?2" let atomic_imply_bot_pattern = put_pat mmk "?1 -> ?2" -let iff_pattern = put_pat mmk "(iff ? ?)" -let not_pattern = put_pat mmk "(not ?1)" +let iff_pattern_mark = put_pat mmk "(iff ?1 ?2)" +let not_pattern_mark = put_pat mmk "(not ?1)" (* squeletons *) -let imply_squeleton = put_pat mmk "?1 -> ?2" +let imply_squeleton = put_squel mmk "?1 -> ?2" let mkIMP a b = soinstance imply_squeleton [a;b] +let false_pattern () = get_pat false_pattern_mark +let true_pattern () = get_pat true_pattern_mark +let and_pattern () = get_pat and_pattern_mark +let or_pattern () = get_pat or_pattern_mark +let eq_pattern () = get_pat eq_pattern_mark +let iff_pattern () = get_pat iff_pattern_mark +let not_pattern () = get_pat not_pattern_mark + let is_atomic m = (not (is_conjunction m) || (is_disjunction m) || - (somatches m pi_pattern) || - (somatches m not_pattern)) + (is_matching (get_pat pi_pattern) m) || + (is_matching (not_pattern ()) m)) let hypothesis = function Some id -> exact (VAR id) | None -> assert false @@ -126,9 +134,11 @@ let dyck_imply_intro = (dImp None) *) let atomic_imply_step cls gls = - let mvb = somatch (clause_type cls gls) atomic_imply_bot_pattern in - if not (is_atomic (List.assoc 1 mvb)) then - error "atomic_imply_step"; + begin try + let mvb = matches (get_pat atomic_imply_bot_pattern) (clause_type cls gls) in + if not (is_atomic (List.assoc 1 mvb)) then + error "atomic_imply_step" + with PatternMatchingFailure -> error "atomic_imply_step" end; (tclTHENS (dImp cls) ([clear_clause cls;assumption])) gls let dyck_atomic_imply_elim = compose (atomic_imply_step) in_some @@ -140,18 +150,20 @@ let dyck_atomic_imply_elim = compose (atomic_imply_step) in_some *) let and_imply_step cls gls = - let mvb = somatch (clause_type cls gls) imply_pattern in - let a = List.assoc 1 mvb - and b = List.assoc 2 mvb in - let l = match match_with_conjunction a with - | Some (_,l) -> l - | None -> error "and_imply_step" - in - (tclTHENS (cut_intro (List.fold_right mkIMP l b)) - [clear_clause cls ; - (tclTHENS (tclTHEN (tclDO (List.length l) intro) (dImp cls)) - [assumption; - (tclTHEN (dAnd None) assumption)])]) gls + try + match matches (get_pat imply_pattern) (clause_type cls gls) with + | [(1,a);(2,b)] -> + let l = match match_with_conjunction a with + | Some (_,l) -> l + | None -> error "and_imply_step" + in + (tclTHENS (cut_intro (List.fold_right mkIMP l b)) + [clear_clause cls ; + (tclTHENS (tclTHEN (tclDO (List.length l) intro) (dImp cls)) + [assumption; + (tclTHEN (dAnd None) assumption)])]) gls + | _ -> anomaly "Inconsistent pattern-matching" + with PatternMatchingFailure -> error "and_imply_step" let dyck_and_imply_elim = compose (and_imply_step) in_some @@ -162,20 +174,22 @@ let dyck_and_imply_elim = compose (and_imply_step) in_some *) let or_imply_step cls gls = - let mvb = somatch (clause_type cls gls) imply_pattern in - let a = List.assoc 1 mvb - and b = List.assoc 2 mvb in - let l = match match_with_disjunction a with - | Some (_,l) -> l - | None -> error "and_imply_step" - in - (tclTHENS (cut_in_parallel (List.map (fun x -> (mkIMP x b)) l)) - (clear_clause cls:: - (List.map - (fun i -> (tclTHENS (tclTHEN intro (dImp cls)) - [assumption ; - (tclTHEN (one_constructor i []) assumption)])) - (interval 1 (List.length l))))) gls + try + match matches (get_pat imply_pattern) (clause_type cls gls) with + | [(1,a);(2,b)] -> + let l = match match_with_disjunction a with + | Some (_,l) -> l + | None -> error "or_imply_step" + in + (tclTHENS (cut_in_parallel (List.map (fun x -> (mkIMP x b)) l)) + (clear_clause cls:: + (List.map + (fun i -> (tclTHENS (tclTHEN intro (dImp cls)) + [assumption ; + (tclTHEN (one_constructor i []) assumption)])) + (interval 1 (List.length l))))) gls + | _ -> anomaly "Inconsistent pattern-matching" + with PatternMatchingFailure -> error "or_imply_step" let dyck_or_imply_elim = compose (or_imply_step) in_some @@ -197,25 +211,27 @@ let imply_imply_bot_pattern = put_pat mmk "(?1 -> ?2) -> ?3" let imply_imply_step cls gls = let h0 = out_some cls in (* (C->D)->B *) - let mvb = somatch (clause_type cls gls) imply_imply_bot_pattern in - let c = List.assoc 1 mvb - and d = List.assoc 2 mvb - and b = List.assoc 3 mvb - in - tclTHENS (cut_intro b) - [clear_clause cls; (* B |- G *) - tclTHENS (cut_intro (mkIMP (mkIMP d b) (mkIMP c d))) - [onLastHyp - (fun h1opt (*(D->B)->(C->D)*) -> - let h1 = out_some h1opt in - (tclTHENS (refine (back_thru_1 h0)) - [tclTHENS (tclTHEN intro (* C *) (refine (back_thru_2 h1))) - [tclTHENS (tclTHEN intro (* D *) (refine (back_thru_1 h0))) - [tclTHEN intro (* C *) assumption]; - exact_last_hyp]])); - (tclTHEN (clear_clause cls) (intro)) - ] - ] gls + try + match matches (get_pat imply_imply_bot_pattern) (clause_type cls gls) with + | [(1,c);(2,d);(3,b)] -> + tclTHENS (cut_intro b) + [clear_clause cls; (* B |- G *) + tclTHENS (cut_intro (mkIMP (mkIMP d b) (mkIMP c d))) + [onLastHyp + (fun h1opt (*(D->B)->(C->D)*) -> + let h1 = out_some h1opt in + (tclTHENS (refine (back_thru_1 h0)) + [tclTHENS + (tclTHEN intro (* C *) (refine (back_thru_2 h1))) + [tclTHENS + (tclTHEN intro (* D *) (refine (back_thru_1 h0))) + [tclTHEN intro (* C *) assumption]; + exact_last_hyp]])); + (tclTHEN (clear_clause cls) (intro)) + ] + ] gls + | _ -> anomaly "Inconsistent pattern-matching" + with PatternMatchingFailure -> error "imply_imply_bot_step" let dyck_imply_imply_elim = compose (imply_imply_step) in_some @@ -226,21 +242,23 @@ let dyck_imply_imply_elim = compose (imply_imply_step) in_some *) let true_imply_step cls gls = - let mvb = somatch (clause_type cls gls) imply_pattern in - let a = List.assoc 1 mvb - and b = List.assoc 2 mvb in - let l = match match_with_unit_type a with - (* match_with_unit_type retournait un constr list option avec un seul - element dans la liste; maintenant il renvoie un constr option *) - (* Some (_::l) -> l *) - | Some _ -> [] - | None -> error "true_imply_step" - in - let h0 = out_some cls in - (tclTHENS (cut_intro b) - [(clear_clause cls); - (tclTHEN (apply(VAR h0)) (one_constructor 1 []))]) gls - + try + match matches (get_pat imply_pattern) (clause_type cls gls) with + | [(1,a);(2,b)] -> + let l = match match_with_unit_type a with + (* match_with_unit_type retournait un constr list option avec un seul + element dans la liste; maintenant il renvoie un constr option *) + (* Some (_::l) -> l *) + | Some _ -> [] + | None -> error "true_imply_step" + in + let h0 = out_some cls in + (tclTHENS (cut_intro b) + [(clear_clause cls); + (tclTHEN (apply(VAR h0)) (one_constructor 1 []))]) gls + | _ -> anomaly "Inconsistent pattern-matching" + with PatternMatchingFailure -> error "true_imply_step" + let dyck_true_imply_elim = compose (true_imply_step) in_some (* Chet's original algorithm @@ -1652,29 +1670,29 @@ let is_imp_term t = let tauto_of_cci_fmla gls cciterm = let rec tradrec cciterm = - if matches gls cciterm and_pattern then - match dest_match gls cciterm and_pattern with - | [a;b] -> FAnd(tradrec a,tradrec b) + if pf_is_matching gls (and_pattern ()) cciterm then + match pf_matches gls (and_pattern ()) cciterm with + | [(1,a);(2,b)] -> FAnd(tradrec a,tradrec b) | _ -> assert false - else if matches gls cciterm or_pattern then - match dest_match gls cciterm or_pattern with - | [a;b] -> FOr(tradrec a,tradrec b) + else if pf_is_matching gls (or_pattern ()) cciterm then + match pf_matches gls (or_pattern ()) cciterm with + | [(1,a);(2,b)] -> FOr(tradrec a,tradrec b) | _ -> assert false - else if matches gls cciterm iff_pattern then - match dest_match gls cciterm iff_pattern with - | [a;b] -> FEqu(tradrec a,tradrec b) + else if pf_is_matching gls (iff_pattern ()) cciterm then + match pf_matches gls (iff_pattern ()) cciterm with + | [(1,a);(2,b)] -> FEqu(tradrec a,tradrec b) | _ -> assert false - else if matches gls cciterm eq_pattern then - match dest_match gls cciterm eq_pattern with - | [a;b;c] -> FEq(FPred a,FPred b, FPred c) + else if pf_is_matching gls (eq_pattern ()) cciterm then + match pf_matches gls (eq_pattern ()) cciterm with + | [(1,a);(2,b);(3,c)] -> FEq(FPred a,FPred b, FPred c) | _ -> assert false - else if matches gls cciterm not_pattern then - match dest_match gls cciterm not_pattern with - | [a] -> FNot(tradrec a) + else if pf_is_matching gls (not_pattern ()) cciterm then + match pf_matches gls (not_pattern ()) cciterm with + | [(1,a)] -> FNot(tradrec a) | _ -> assert false - else if matches gls cciterm false_pattern then + else if pf_is_matching gls (false_pattern ()) cciterm then FFalse - else if matches gls cciterm true_pattern then + else if pf_is_matching gls (true_pattern ()) cciterm then FTrue else if is_imp_term cciterm then match cciterm with |
