X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Ftactics%2Fparamodulation%2Findexing.ml;h=7ff0dfd2cc6560dd0b7cfefbb8d088122875283c;hb=d40ad33ad3d075c5dd74b6a67131683b0ebe32d6;hp=97e45522d04cf83886b485c53bbeab8335d21272;hpb=821485bdc469482d0f29ac2d1e6c6dd1a6a94661;p=helm.git diff --git a/helm/software/components/tactics/paramodulation/indexing.ml b/helm/software/components/tactics/paramodulation/indexing.ml index 97e45522d..7ff0dfd2c 100644 --- a/helm/software/components/tactics/paramodulation/indexing.ml +++ b/helm/software/components/tactics/paramodulation/indexing.ml @@ -145,7 +145,7 @@ let not_unit_eq ctx eq = List.exists (fun (_,_,ty) -> try - let s,_ = CicTypeChecker.type_of_aux' metas ctx ty CicUniv.empty_ugraph + let s,_ = CicTypeChecker.type_of_aux' metas ctx ty CicUniv.oblivion_ugraph in s = Cic.Sort(Cic.Prop) with _ -> prerr_endline ("ERROR typing " ^ CicPp.ppterm ty); assert false) metas @@ -313,7 +313,8 @@ let rec find_matches bag metasenv context ugraph lift_amount term termty = Founif.matching metasenv metas context term (S.lift lift_amount c) ugraph in - check_metasenv "founif :" metasenv'; + if Utils.debug_metas then + check_metasenv "founif :" metasenv'; Some (Cic.Rel(1+lift_amount),subst',metasenv',ugraph',candidate) in let c, other = @@ -517,7 +518,8 @@ let subsumption_aux_all use_unification env table target = let _, _, (ty, left, right, _), tmetas, _ = Equality.open_equality target in let _, context, ugraph = env in let metasenv = tmetas in - check_for_duplicates metasenv "subsumption_aux_all"; + if Utils.debug_metas then + check_for_duplicates metasenv "subsumption_aux_all"; let predicate, unif_fun = if use_unification then Unification, Founif.unification @@ -576,12 +578,13 @@ let rec demodulation_aux bag ?from ?(typecheck=false) let module S = CicSubstitution in let module M = CicMetaSubst in let module HL = HelmLibraryObjects in - check_for_duplicates metasenv "in input a demodulation aux"; + if Utils.debug_metas then + check_for_duplicates metasenv "in input a demodulation aux"; let candidates = get_candidates ~env:(metasenv,context,ugraph) (* Unification *) Matching table term - in let candidates = List.filter (fun _,x -> not (not_unit_eq context x)) candidates - in + in +(* let candidates = List.filter (fun _,x -> not (not_unit_eq context x)) candidates in *) let res = match term with | C.Meta _ -> None @@ -720,10 +723,11 @@ let rec demodulation_equality bag ?from eq_uri env table target = let pos, equality = eq_found in let (_, proof', (ty, what, other, _), menv',id') = Equality.open_equality equality in + (* let ty = - try fst (CicTypeChecker.type_of_aux' metasenv context what ugraph) - with CicUtil.Meta_not_found _ -> ty - in + try fst (CicTypeChecker.type_of_aux' menv' context what ugraph) + with CicUtil.Meta_not_found _ -> ty + in *) let ty, eq_ty = apply_subst subst ty, apply_subst subst eq_ty in let what, other = if pos = Utils.Left then what, other else other, what in let newterm, newproof = @@ -899,8 +903,8 @@ let rec betaexpand_term | C.Meta (i, l) -> res, lifted_term | term -> let termty, ugraph = -(* C.Implicit None, ugraph *) - CicTypeChecker.type_of_aux' metasenv context term ugraph + C.Implicit None, ugraph +(* CicTypeChecker.type_of_aux' metasenv context term ugraph *) in let candidates = get_candidates Unification table term in (* List.iter (fun (_,e) -> debug_print (lazy (Equality.string_of_equality e))) candidates; *) @@ -1093,7 +1097,7 @@ let build_newg bag context goal rule expansion = let rec demod bag env table goal = let _,menv,t = goal in let _, context, ugraph = env in - let res = demodulation_aux bag menv context ugraph table 0 t (~typecheck:true)in + let res = demodulation_aux bag menv context ugraph table 0 t (~typecheck:false)in match res with | Some newt -> let newg = @@ -1246,6 +1250,7 @@ let rec demodulation_goal bag env table goal = (* returns all the 1 step demodulations *) module C = Cic;; module S = CicSubstitution;; + let rec demodulation_all_aux metasenv context ugraph table lift_amount term = @@ -1263,17 +1268,22 @@ let rec demodulation_all_aux in match term with | C.Appl l -> - let res, _, _ = + let res, _, _, _ = List.fold_left - (fun (res,l,r) t -> - res @ - List.map - (fun (rel, s, m, ug, c) -> - (Cic.Appl (l@[rel]@List.tl r), s, m, ug, c)) - (demodulation_all_aux - metasenv context ugraph table lift_amount t), - l@[List.hd r], List.tl r) - (res, [], List.map (S.lift 1) l) l + (fun (res,b,l,r) t -> + if not b then res,b,l,r + else + let demods_for_t = + demodulation_all_aux + metasenv context ugraph table lift_amount t + in + let b = demods_for_t = [] in + res @ + List.map + (fun (rel, s, m, ug, c) -> + (Cic.Appl (l@[rel]@List.tl r), s, m, ug, c)) + demods_for_t, b, l@[List.hd r], List.tl r) + (res, true, [], List.map (S.lift 1) l) l in res | t -> res @@ -1284,10 +1294,10 @@ let demod_all steps bag env table goal = let is_visited l (_,_,t) = List.exists (fun (_,_,s) -> Equality.meta_convertibility s t) l in - let rec aux steps visited bag = function - | _ when steps = 0 -> visited, bag, [] - | [] -> visited, bag, [] - | goal :: rest when is_visited visited goal -> aux steps visited bag rest + let rec aux steps visited nf bag = function + | _ when steps = 0 -> visited, bag, nf + | [] -> visited, bag, nf + | goal :: rest when is_visited visited goal-> aux steps visited nf bag rest | goal :: rest -> let visited = goal :: visited in let _,menv,t = goal in @@ -1296,12 +1306,57 @@ let demod_all steps bag env table goal = let new_goals = List.map (build_newg bag context goal Equality.Demodulation) res in - let visited, bag, res = aux steps visited bag (new_goals @ rest) in - visited, bag, goal :: res + let nf = if new_goals = [] then goal :: nf else nf in + aux steps visited nf bag (new_goals @ rest) + in + aux steps [] [] bag [goal] +;; + +let combine_demodulation_proofs bag env goal (pl,ml,l) (pr,mr,r) = + let proof,m,eq,ty,left,right = open_goal goal in + let pl = + List.map + (fun (rule,pos,id,subst,pred) -> + let pred = + match pred with + | Cic.Lambda (name,src,tgt) -> + Cic.Lambda (name,src, + Cic.Appl[eq;ty;tgt;CicSubstitution.lift 1 right]) + | _ -> assert false + in + rule,pos,id,subst,pred) + pl in - aux steps [] bag [goal] + let pr = + List.map + (fun (rule,pos,id,subst,pred) -> + let pred = + match pred with + | Cic.Lambda (name,src,tgt) -> + Cic.Lambda (name,src, + Cic.Appl[eq;ty;CicSubstitution.lift 1 l;tgt]) + | _ -> assert false + in + rule,pos,id,subst,pred) + pr + in + (pr@pl@proof, m, Cic.Appl [eq;ty;l;r]) ;; +let demodulation_all_goal bag env table goal maxnf = + let proof,menv,eq,ty,left,right = open_goal goal in + let v1, bag, l_demod = demod_all maxnf bag env table ([],menv,left) in + let v2, bag, r_demod = demod_all maxnf bag env table ([],menv,right) in + let l_demod = if l_demod = [] then [ [], menv, left ] else l_demod in + let r_demod = if r_demod = [] then [ [], menv, right ] else r_demod in + List.fold_left + (fun acc (_,_,l as ld) -> + List.fold_left + (fun acc (_,_,r as rd) -> + combine_demodulation_proofs bag env goal ld rd :: acc) + acc r_demod) + [] l_demod +;; let solve_demodulating bag env table initgoal steps = let proof,menv,eq,ty,left,right = open_goal initgoal in