X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Ftactics%2Fparamodulation%2Findexing.ml;h=7ff0dfd2cc6560dd0b7cfefbb8d088122875283c;hb=ba5f2cc720dd8fbb74214cfd99d63fb7330ffce3;hp=99f66f1d11ccef7c114c5b4c0b93549c04641421;hpb=b8934a9598d747662139c74c751b8223bcc19d03;p=helm.git diff --git a/helm/software/components/tactics/paramodulation/indexing.ml b/helm/software/components/tactics/paramodulation/indexing.ml index 99f66f1d1..7ff0dfd2c 100644 --- a/helm/software/components/tactics/paramodulation/indexing.ml +++ b/helm/software/components/tactics/paramodulation/indexing.ml @@ -723,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 = @@ -1096,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 = @@ -1249,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 = @@ -1266,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 @@ -1287,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 @@ -1299,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