X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Ftactics%2FmetadataQuery.ml;h=abe192b94b9341b98ac05647c27985517bdabb91;hb=ca2a604c2817deb118d595611b94a0d77978eab6;hp=cd14f3f5eb8d6be766c272b73e5af3fd9aa730fa;hpb=041ad23b567b9844ec187ad436595868441802f4;p=helm.git diff --git a/helm/software/components/tactics/metadataQuery.ml b/helm/software/components/tactics/metadataQuery.ml index cd14f3f5e..abe192b94 100644 --- a/helm/software/components/tactics/metadataQuery.ml +++ b/helm/software/components/tactics/metadataQuery.ml @@ -109,7 +109,7 @@ let filter_uris_backward ~dbd ~facts signature uris = intersect uris siguris let compare_goal_list proof goal1 goal2 = - let _,metasenv,_,_ = proof in + let _,metasenv, _subst, _,_, _ = proof in let (_, ey1, ty1) = CicUtil.lookup_meta goal1 metasenv in let (_, ey2, ty2) = CicUtil.lookup_meta goal2 metasenv in let ty_sort1,_ = @@ -192,7 +192,26 @@ let cmatch' = *) let apply_tac_verbose = PrimitiveTactics.apply_tac_verbose let cmatch' = Constr.cmatch' - + +(* used only by te old auto *) +let signature_of_goal ~(dbd:HSql.dbd) ((proof, goal) as _status) = + let (_, metasenv, _subst, _, _, _) = proof in + let (_, context, ty) = CicUtil.lookup_meta goal metasenv in + let main, sig_constants = Constr.signature_of ty in + let set = signature_of_hypothesis context metasenv in + let set = + match main with + None -> set + | Some (main,l) -> + List.fold_right Constr.UriManagerSet.add (main::l) set in + let set = Constr.UriManagerSet.union set sig_constants in + let all_constants_closed = close_with_types set metasenv context in + let uris = + sigmatch ~dbd ~facts:false ~where:`Statement (None,all_constants_closed) in + let uris = List.filter nonvar (List.map snd uris) in + let uris = List.filter Hashtbl_equiv.not_a_duplicate uris in + uris + let is_predicate u = let ty, _ = try CicTypeChecker.type_of_aux' [] [] @@ -212,26 +231,56 @@ let only constants uri = let t = CicUtil.term_of_uri uri in (* FIXME: write ty_of_term *) let ty,_ = CicTypeChecker.type_of_aux' [] [] t CicUniv.empty_ugraph in let consts = Constr.constants_of ty in +(* + prerr_endline ("XXX " ^ UriManager.string_of_uri uri); + Constr.UriManagerSet.iter (fun u -> prerr_endline (" - " ^ + UriManager.string_of_uri u)) consts; + Constr.UriManagerSet.iter (fun u -> prerr_endline (" + " ^ + UriManager.string_of_uri u)) constants;*) Constr.UriManagerSet.subset consts constants ;; -let universe_of_goals ~(dbd:HMysql.dbd) proof goals = - let (_, metasenv, _, _) = proof in - let add_uris_for acc goal = - let (_, context, ty) = CicUtil.lookup_meta goal metasenv in - let main, sig_constants = Constr.signature_of ty in - let set = signature_of_hypothesis context metasenv in - let set = - match main with - None -> set - | Some (main,l) -> - List.fold_right Constr.UriManagerSet.add (main::l) set in - let set = Constr.UriManagerSet.union set sig_constants in - let all_constants_closed = close_with_types set metasenv context in - Constr.UriManagerSet.union all_constants_closed acc - in - let all_constants_closed = - List.fold_left add_uris_for Constr.UriManagerSet.empty goals in +let rec types_of_equality = function + | Cic.Appl [Cic.MutInd (uri, _, _); ty; _; _] + when (LibraryObjects.is_eq_URI uri) -> + let uri_set = Constr.constants_of ty in + if Constr.UriManagerSet.equal uri_set Constr.UriManagerSet.empty then + Constr.SetSet.empty + else Constr.SetSet.singleton uri_set + | Cic.Prod (_, s, t) -> + Constr.SetSet.union (types_of_equality s) (types_of_equality t) + | _ -> Constr.SetSet.empty +;; + +let types_for_equality metasenv goal = + let (_, context, ty) = CicUtil.lookup_meta goal metasenv in + let all = types_of_equality ty in + let _, all = + List.fold_left + (fun (i,acc) _ -> + let ty, _ = + CicTypeChecker.type_of_aux' + metasenv context (Cic.Rel i) CicUniv.empty_ugraph in + let newty = types_of_equality ty in + (i+1,Constr.SetSet.union newty acc)) + (1,all) context + in all +;; + +let signature_of metasenv goal = + let (_, context, ty) = CicUtil.lookup_meta goal metasenv in + let ty_set = Constr.constants_of ty in + let hyp_set = signature_of_hypothesis context metasenv in + let set = Constr.UriManagerSet.union ty_set hyp_set in + close_with_types set metasenv context + + +let universe_of_goal ~(dbd:HSql.dbd) apply_only metasenv goal = + let (_, context, ty) = CicUtil.lookup_meta goal metasenv in + let ty_set = Constr.constants_of ty in + let hyp_set = signature_of_hypothesis context metasenv in + let set = Constr.UriManagerSet.union ty_set hyp_set in + let all_constants_closed = close_with_types set metasenv context in (* we split predicates from the rest *) let predicates, rest = Constr.UriManagerSet.partition is_predicate all_constants_closed @@ -239,11 +288,34 @@ let universe_of_goals ~(dbd:HMysql.dbd) proof goals = let uris = Constr.UriManagerSet.fold (fun u acc -> - let uris = - sigmatch ~dbd ~facts:false ~where:`Statement - (Some (u,[]),all_constants_closed) - in - acc @ uris) + prerr_endline ("processing "^(UriManager.string_of_uri u)); + let set_for_sigmatch = + Constr.UriManagerSet.remove u all_constants_closed in + if LibraryObjects.is_eq_URI (UriManager.strip_xpointer u) then + (* equality has a special treatment *) + (prerr_endline "special treatment"; + let tfe = + Constr.SetSet.elements (types_for_equality metasenv goal) + in + List.fold_left + (fun acc l -> + let tyl = Constr.UriManagerSet.elements l in + prerr_endline ("tyl: "^(String.concat "\n" + (List.map UriManager.string_of_uri tyl))); + let set_for_sigmatch = + Constr.UriManagerSet.diff set_for_sigmatch l in + let uris = + sigmatch ~dbd ~facts:false ~where:`Statement + (Some (u,tyl),set_for_sigmatch) in + acc @ uris) + acc tfe) + else + (prerr_endline "normal treatment"; + let uris = + sigmatch ~dbd ~facts:false ~where:`Statement + (Some (u,[]),set_for_sigmatch) + in + acc @ uris)) predicates [] in (* @@ -253,23 +325,26 @@ let universe_of_goals ~(dbd:HMysql.dbd) proof goals = *) let uris = List.filter nonvar (List.map snd uris) in let uris = List.filter Hashtbl_equiv.not_a_duplicate uris in - let uris = List.filter (only all_constants_closed) uris in - uris + if apply_only then + List.filter (only all_constants_closed) uris + else uris ;; let filter_out_predicate set ctx menv = Constr.UriManagerSet.filter (fun u -> not (is_predicate u)) set ;; -let equations_for_goal ~(dbd:HMysql.dbd) ?signature ((proof, goal) as _status) = -(* let to_string set = - "{ " ^ - (String.concat ", " +let equations_for_goal ~(dbd:HSql.dbd) ?signature ((proof, goal) as _status) = +(* + let to_string set = + "{\n" ^ + (String.concat "\n" (Constr.UriManagerSet.fold - (fun u l -> (UriManager.string_of_uri u)::l) set [])) - ^ " }" - in *) - let (_, metasenv, _, _) = proof in + (fun u l -> (" "^UriManager.string_of_uri u)::l) set [])) + ^ "\n}" + in +*) + let (_, metasenv, _subst, _, _, _) = proof in let (_, context, ty) = CicUtil.lookup_meta goal metasenv in let main, sig_constants = match signature with @@ -306,18 +381,20 @@ let equations_for_goal ~(dbd:HMysql.dbd) ?signature ((proof, goal) as _status) = (* Printf.printf "\ndopo close_with_types: %s\n\n" (to_string set); *) let set = close_with_constructors set metasenv context in (* Printf.printf "\ndopo close_with_constructors: %s\n\n" (to_string set); *) - let set = List.fold_right Constr.UriManagerSet.remove l set in + let set_for_sigmatch = List.fold_right Constr.UriManagerSet.remove l set in let uris = - sigmatch ~dbd ~facts:false ~where:`Statement (main,set) in + sigmatch ~dbd ~facts:false ~where:`Statement (main,set_for_sigmatch) in let uris = List.filter nonvar (List.map snd uris) in let uris = List.filter Hashtbl_equiv.not_a_duplicate uris in + let set = List.fold_right Constr.UriManagerSet.add l set in + let uris = List.filter (only set) uris in uris (* ) *) (* else raise Goal_is_not_an_equation *) let experimental_hint - ~(dbd:HMysql.dbd) ?(facts=false) ?signature ((proof, goal) as status) = - let (_, metasenv, _, _) = proof in + ~(dbd:HSql.dbd) ?(facts=false) ?signature ((proof, goal) as status) = + let (_, metasenv, _subst, _, _, _) = proof in let (_, context, ty) = CicUtil.lookup_meta goal metasenv in let (uris, (main, sig_constants)) = match signature with @@ -398,10 +475,10 @@ let experimental_hint (aux uris) let new_experimental_hint - ~(dbd:HMysql.dbd) ?(facts=false) ?signature ~universe + ~(dbd:HSql.dbd) ?(facts=false) ?signature ~universe ((proof, goal) as status) = - let (_, metasenv, _, _) = proof in + let (_, metasenv, _subst, _, _, _) = proof in let (_, context, ty) = CicUtil.lookup_meta goal metasenv in let (uris, (main, sig_constants)) = match signature with