X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2FsearchEngine%2FsearchEngine.ml;h=e4e33c629c4f808204dd2b48dcb03057fc6b8240;hb=1c7fb836e2af4f2f3d18afd0396701f2094265ff;hp=ca507663511a7696d2b182064c3ba4ab94d783cb;hpb=4a3b0f60b4e7c9808b8552d9fb295ce34be4dddb;p=helm.git diff --git a/helm/searchEngine/searchEngine.ml b/helm/searchEngine/searchEngine.ml index ca5076635..e4e33c629 100644 --- a/helm/searchEngine/searchEngine.ml +++ b/helm/searchEngine/searchEngine.ml @@ -23,6 +23,11 @@ * http://cs.unibo.it/helm/. *) +module T = MQGTypes +module U = MQGUtil +module G = MQueryGenerator +module C = MQIConn + open Http_types ;; let debug = true;; @@ -72,41 +77,29 @@ let int_of_string' = function failwith ("Can't parse an int option from string: " ^ s) ;; -let is_concl_pos pos = - pos = "http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion" - or - pos = "http://www.cs.unibo.it/helm/schemas/schema-helm#InConclusion" -;; - -let is_main_pos pos = - pos = "http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion" - or - pos = "http://www.cs.unibo.it/helm/schemas/schema-helm#MainHypothesis" -;; - (* HTML pretty printers for mquery_generator types *) -let html_of_r_obj (uri, pos, depth) = +let html_of_r_obj (pos, uri) = sprintf "%s%s%s" - uri (Str.string_after pos ((String.rindex pos '#') + 1)) - (if is_main_pos pos then + uri (U.text_of_position pos) + (if U.is_main_position pos then sprintf "" - (match depth with Some i -> string_of_int i | None -> "") + (U.text_of_depth pos "") else "") ;; -let html_of_r_rel (pos, depth) = +let html_of_r_rel pos = sprintf "%s" - pos (match depth with Some i -> string_of_int i | None -> "") + (U.text_of_position (pos:>T.full_position)) (U.text_of_depth (pos:>T.full_position) "") ;; -let html_of_r_sort (pos, depth, sort) = +let html_of_r_sort (pos, sort) = sprintf "%s%s" - sort pos (match depth with Some i -> string_of_int i | None -> "") + (U.text_of_sort sort) (U.text_of_position (pos:>T.full_position)) (U.text_of_depth (pos:>T.full_position) "") ;; (** pretty print a MathQL query result to an HELM theory file *) @@ -184,66 +177,35 @@ let contype = "Content-Type", "text/html";; (* SEARCH ENGINE functions *) -let whole_statement_universe = - ["http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion" ; - "http://www.cs.unibo.it/helm/schemas/schema-helm#InConclusion" ; - "http://www.cs.unibo.it/helm/schemas/schema-helm#MainHypothesis" ; - "http://www.cs.unibo.it/helm/schemas/schema-helm#InHypothesis"] -;; - -let only_conclusion_universe = - ["http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion" ; - "http://www.cs.unibo.it/helm/schemas/schema-helm#InConclusion"] -;; - -let refine_constraints (constr_obj, constr_rel, constr_sort) = - function - "/searchPattern" -> - whole_statement_universe, - (constr_obj, constr_rel, constr_sort), - (Some constr_obj, Some constr_rel, Some constr_sort) - | "/matchConclusion" -> - let constr_obj' = - List.map - (function (uri,pos,_) -> (uri,pos,None)) - (List.filter - (function (uri,pos,depth) as constr -> is_concl_pos pos) - constr_obj) - in - only_conclusion_universe, - (*CSC: we must select the must constraints here!!! *) - (constr_obj',[],[]),(Some constr_obj', None, None) - | _ -> assert false -in - let get_constraints term = function - "/locateInductivePrinciple" -> + | "/locateInductivePrinciple" -> let uri = match term with Cic.MutInd (uri,t,_) -> MQueryUtil.string_of_uriref (uri,[t]) | _ -> raise NotAnInductiveDefinition in let constr_obj = - [uri,"http://www.cs.unibo.it/helm/schemas/schema-helm#InHypothesis", - None ; - uri,"http://www.cs.unibo.it/helm/schemas/schema-helm#MainHypothesis", - Some 0 - ] - in - let constr_rel = - ["http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion", - None] in - let constr_sort = - ["http://www.cs.unibo.it/helm/schemas/schema-helm#MainHypothesis", - Some 1, "Prop"] + [(`InHypothesis, uri); (`MainHypothesis (Some 0), uri)] in - whole_statement_universe, + let constr_rel = [`MainConclusion None] in + let constr_sort = [(`MainHypothesis (Some 1), T.Prop)] in + U.universe_for_search_pattern, (constr_obj, constr_rel, constr_sort), (None,None,None) - | req_path -> - let must = MQueryLevels2.get_constraints term in - refine_constraints must req_path -in + | "/searchPattern" -> + let constr_obj, constr_rel, constr_sort = + CGSearchPattern.get_constraints term in + U.universe_for_search_pattern, + (constr_obj, constr_rel, constr_sort), + (Some constr_obj, Some constr_rel, Some constr_sort) + | "/matchConclusion" -> + let list_of_must, only = CGMatchConclusion.get_constraints [] [] term in +(* FG: there is no way to choose the block number ***************************) + let block = pred (List.length list_of_must) in + U.universe_for_match_conclusion, + (List.nth list_of_must block, [], []), (Some only, None, None) + | _ -> assert false +;; (* format: @@ -270,20 +232,21 @@ let add_user_constraints ~constraints (* to be used on "obj" *) let add_user_must33 user_must must = List.map2 - (fun (b, i) (p1, p2, p3) -> if b then (p1, p2, i) else (p1, p2, None)) - user_must must + (fun (b, i) (p, u) -> + if b then Some (U.set_full_position p i, u) else None) + user_must must in (* to be used on "rel" *) let add_user_must22 user_must must = List.map2 - (fun (b, i) (p1, p2) -> if b then (p1, i) else (p1, None)) - user_must must + (fun (b, i) p -> if b then Some (U.set_main_position p i) else None) + user_must must in (* to be used on "sort" *) let add_user_must32 user_must must = List.map2 - (fun (b, i) (p1, p2, p3) -> if b then (p1, i, p3) else (p1, None, p3)) - user_must must + (fun (b, i) (p, s)-> if b then Some (U.set_main_position p i, s) else None) + user_must must in match Pcre.split ~pat:":" constraints with | [user_obj;user_rel;user_sort;user_only_obj;user_only_rel;user_only_sort] -> @@ -303,9 +266,15 @@ let add_user_constraints ~constraints (if user_only_sort then only_sort else None) in let must' = - add_user_must33 user_obj obj, - add_user_must22 user_rel rel, - add_user_must32 user_sort sort + let rec filter_some = + function + [] -> [] + | None::tl -> filter_some tl + | (Some x)::tl -> x::(filter_some tl) + in + filter_some (add_user_must33 user_obj obj), + filter_some (add_user_must22 user_rel rel), + filter_some (add_user_must32 user_sort sort) in (must', only') | _ -> failwith ("Can't parse constraint string: " ^ constraints) @@ -318,20 +287,28 @@ let callback (req: Http_types.request) outchan = debug_print (sprintf "Received request: %s" req#path); (match req#path with | "/execute" -> - let mqi_handle = MQIConn.init mqi_flags debug_print in + let mqi_handle = C.init mqi_flags debug_print in let query_string = req#param "query" in let lexbuf = Lexing.from_string query_string in let query = MQueryUtil.query_of_text lexbuf in let result = MQueryInterpreter.execute mqi_handle query in let result_string = pp_result result in - MQIConn.close mqi_handle; + C.close mqi_handle; Http_daemon.respond ~body:result_string ~headers:[contype] outchan | "/locate" -> - let mqi_handle = MQIConn.init mqi_flags debug_print in + let mqi_handle = C.init mqi_flags debug_print in let id = req#param "id" in - let query = MQueryGenerator.locate id in + let query = G.locate id in + let result = MQueryInterpreter.execute mqi_handle query in + C.close mqi_handle; + Http_daemon.respond ~headers:[contype] ~body:(pp_result result) outchan + | "/unreferred" -> + let mqi_handle = C.init mqi_flags debug_print in + let target = req#param "target" in + let source = req#param "source" in + let query = G.unreferred target source in let result = MQueryInterpreter.execute mqi_handle query in - MQIConn.close mqi_handle; + C.close mqi_handle; Http_daemon.respond ~headers:[contype] ~body:(pp_result result) outchan | "/getpage" -> (* TODO implement "is_permitted" *) @@ -388,7 +365,7 @@ let callback (req: Http_types.request) outchan = | "/searchPattern" | "/matchConclusion" | "/locateInductivePrinciple" -> - let mqi_handle = MQIConn.init mqi_flags debug_print in + let mqi_handle = C.init mqi_flags debug_print in let term_string = req#param "term" in let lexbuf = Lexing.from_string term_string in let (context, metasenv) = ([], []) in @@ -613,7 +590,7 @@ List.iter (fun u -> prerr_endline ("<" ^ Netencoding.Url.decode u ^ ">")) tail; raise Chat_unfinished) in let query = - MQueryGenerator.query_of_constraints (Some universe) must'' only' + G.query_of_constraints (Some universe) must'' only' in let results = MQueryInterpreter.execute mqi_handle query in Http_daemon.send_basic_headers ~code:200 outchan ; @@ -651,7 +628,7 @@ List.iter (fun u -> prerr_endline ("<" ^ Netencoding.Url.decode u ^ ">")) tail; ~headers:[contype] ~body:"some implicit variables are still unistantiated :-(" outchan); - MQIConn.close mqi_handle + C.close mqi_handle | invalid_request -> Http_daemon.respond_error ~status:(`Client_error `Bad_request) outchan); debug_print (sprintf "%s done!" req#path)