let add_card_constr tbl (n,from,where) = function
| None -> (n,from,where)
| Some (Eq card) ->
+ let cur_tbl = tbln n in
(n+1,
- (sprintf "%s as %s" tbl (tbln n) :: from),
- (sprintf "no=%d" card ::
+ (sprintf "%s as %s" tbl cur_tbl :: from),
+ (sprintf "%s.no=%d" cur_tbl card ::
(if n=0 then []
- else [sprintf "table0.source = %s.source" (tbln n)]) @
+ else [sprintf "table0.source = %s.source" cur_tbl]) @
where))
| Some (Gt card) ->
+ let cur_tbl = tbln n in
(n+1,
- (sprintf "%s as %s" tbl (tbln n) :: from),
- (sprintf "no>%d" card ::
+ (sprintf "%s as %s" tbl cur_tbl :: from),
+ (sprintf "%s.no>%d" cur_tbl card ::
(if n=0 then []
- else [sprintf "table0.source = %s.source" (tbln n)]) @
+ else [sprintf "table0.source = %s.source" cur_tbl]) @
where))
let at_least ~(dbh:Dbi.connection) ?concl_card ?full_card
let from = String.concat ", " from in
let where = String.concat " and " where in
let query = sprintf "select table0.source from %s where %s" from where in
-prerr_endline query;
let query = dbh#prepare query in
query#execute [];
List.map (function [`String s] -> s | _ -> assert false) (query#fetchall ())
(SetSet.singleton (StringSet.singleton root))
and inspect_conclusion n t =
-if n = 0 then SetSet.empty
-else match t with
+ if n = 0 then SetSet.empty
+ else match t with
Cic.Rel _
| Cic.Meta _
| Cic.Sort _
| u::l -> u::(drop_repetitions l) in
drop_repetitions (List.sort Pervasives.compare (List.concat l))
-let must_of_prefix m s =
- let s' = List.map (fun u -> `Obj (u, [`InConclusion])) s in
+let must_of_prefix ?(where = `Conclusion) m s =
+ let positions =
+ match where with
+ | `Conclusion -> [`InConclusion]
+ | `Statement -> [`InConclusion; `InHypothesis; `MainHypothesis None]
+ in
+ let s' = List.map (fun u -> `Obj (u, positions)) s in
`Obj (m, [`MainConclusion None]) :: s'
let escape = Str.global_replace (Str.regexp_string "\'") "\\'"
-let get_inconcl (dbh:Dbi.connection) uri =
+let get_constants (dbh:Dbi.connection) ~where uri =
let uri = escape uri in
+ let positions =
+ match where with
+ | `Conclusion -> ["\"MainConclusion\""; "\"InConclusion\""]
+ | `Statement ->
+ ["\"MainConclusion\""; "\"InConclusion\""; "\"InHypothesis\"";
+ "\"MainHypothesis\""]
+ in
let query =
- dbh#prepare (sprintf "select h_occurrence from refObj where source=\"%s\" and (h_position=\"MainConclusion\" or h_position=\"InConclusion\")"
- uri)
+ dbh#prepare
+ (sprintf "select h_occurrence from refObj where source=\"%s\" and (%s)"
+ uri (String.concat " or " positions))
in
query#execute [];
query#fold_left (* transform the result in a set *)
StringSet.add uri set)
StringSet.empty
-let test_only ~(dbh:Dbi.connection) only u =
- let inconcl = get_inconcl dbh u in
+let at_most ~(dbh:Dbi.connection) ?(where = `Conclusion) only u =
+ let inconcl = get_constants dbh ~where u in
StringSet.subset inconcl only
(* Special handling of equality. The problem is filtering out theorems just
0,"cic:/Coq/Init/Logic/f_equal2.con";
0,"cic:/Coq/Init/Logic/f_equal3.con"]
-let compute_exactly ~(dbh:Dbi.connection) main prefixes =
+let compute_exactly ~(dbh:Dbi.connection) where main prefixes =
List.concat
(List.map
(fun (m,s) ->
myspeciallist
else
let res =
- at_least ~dbh ~concl_card:(Eq (m+1)) (must_of_prefix main s)
+ let must = must_of_prefix ~where main s in
+ match where with
+ | `Conclusion -> at_least ~dbh ~concl_card:(Eq (m+1)) must
+ | `Statement -> at_least ~dbh ~full_card:(Eq (m+1)) must
in
List.map (fun uri -> (m, uri)) res)
prefixes)
(* critical value reached, fallback to "only" constraints *)
-let compute_with_only ~(dbh:Dbi.connection) main prefixes constants =
+let compute_with_only ~(dbh:Dbi.connection) ?(where = `Conclusion) main
+ prefixes constants
+=
let max_prefix_length =
match prefixes with
| [] -> assert false
union
(List.map
(fun (m,s) ->
+ let must = must_of_prefix ~where main s in
(let res =
- at_least ~dbh ~concl_card:(Gt (m+1)) (must_of_prefix main s)
+ match where with
+ | `Conclusion -> at_least ~dbh ~concl_card:(Gt (m+1)) must
+ | `Statement -> at_least ~dbh ~full_card:(Gt (m+1)) must
in
(* we tag the uri with m+1, for sorting purposes *)
List.map (fun uri -> (m+1, uri)) res))
maximal_prefixes)
in
- List.filter (function (_,uri) -> test_only ~dbh constants uri) all in
- let equal_to = compute_exactly ~dbh main prefixes in
+ List.filter (function (_,uri) -> at_most ~dbh ~where constants uri) all in
+ let equal_to = compute_exactly ~dbh where main prefixes in
greater_than @ equal_to
(* real match query implementation *)
in
compute_with_only ~dbh main all_concl all_constants
| _, _ -> [])
- else if constants_no = 0 then []
else
(* in this case we compute all prefixes, and we do not need
to apply the only constraints *)
- let prefixes = prefixes constants_no t in
+ let prefixes =
+ if constants_no = 0 then
+ Some main, [0, []; List.length types, types]
+ else
+ prefixes constants_no t
+ in
(match prefixes with
- Some main, all_concl ->
- List.concat
- (List.map
- (fun (m,s) ->
- (let res =
- at_least ~dbh ~concl_card:(Eq (m+1))
- (must_of_prefix main s)
- in
- List.map (fun uri -> (m, uri)) res))
- all_concl)
- | _, _ -> [])
+ Some main, all_concl ->
+ List.concat
+ (List.map
+ (fun (m,s) ->
+ let must = must_of_prefix ~where:`Conclusion main s in
+ let res = at_least ~dbh ~concl_card:(Eq (m+1)) must in
+ List.map (fun uri -> (m, uri)) res)
+ all_concl)
+ | _, _ -> [])
let power_upto upto consts =
let l = StringSet.elements consts in
(fun res a -> res@(List.map (function (n,l) -> (n+1,a::l)) res))
[(0,[])] l)
-let sigmatch ~(dbh:Dbi.connection) (main, constants) =
+type where = [ `Conclusion | `Statement ]
+
+let sigmatch ~(dbh:Dbi.connection) ?(where = `Conclusion) (main, constants) =
match main with
None -> []
| Some (main, types) ->
let all_constants =
List.fold_right StringSet.add types (StringSet.add main constants)
in
- compute_with_only ~dbh main subsets all_constants
+ compute_with_only ~dbh ~where main subsets all_constants
else
let subsets =
let subsets = power constants in
let types_no = List.length types in
- List.map (function (n,l) -> (n+types_no,types@l)) subsets
+ (0,[]) :: List.map (function (n,l) -> (n+types_no,types@l)) subsets
in
- compute_exactly ~dbh main subsets
+ compute_exactly ~dbh where main subsets
(* match query wrappers *)
let cmatch' = cmatch
open Printf
+open MetadataTypes
+
let pp_position = function
| `MainConclusion (Some d) -> sprintf "MainConclusion(%d)" d
| `MainConclusion None -> sprintf "MainConclusion"
| `InBody -> "InBody"
let pp_position_tag = function
- | `MainConclusion _ -> "MainConclusion"
- | `MainHypothesis _ -> "MainHypothesis"
- | `InConclusion -> "InConclusion"
- | `InHypothesis -> "InHypothesis"
- | `InBody -> "InBody"
+ | `MainConclusion _ -> mainconcl_pos
+ | `MainHypothesis _ -> mainhyp_pos
+ | `InConclusion -> inconcl_pos
+ | `InHypothesis -> inhyp_pos
+ | `InBody -> inbody_pos
let columns_of_position = function
- | `MainConclusion (Some d) -> `String "MainConclusion", `Int d
- | `MainConclusion None -> `String "MainConclusion", `Null
- | `MainHypothesis (Some d) -> `String "MainHypothesis", `Int d
- | `MainHypothesis None -> `String "MainHypothesis", `Null
- | `InConclusion -> `String "InConclusion", `Null
- | `InHypothesis -> `String "InHypothesis", `Null
- | `InBody -> `String "InBody", `Null
+ | `MainConclusion (Some d) -> `String mainconcl_pos, `Int d
+ | `MainConclusion None -> `String mainconcl_pos, `Null
+ | `MainHypothesis (Some d) -> `String mainhyp_pos, `Int d
+ | `MainHypothesis None -> `String mainhyp_pos, `Null
+ | `InConclusion -> `String inconcl_pos, `Null
+ | `InHypothesis -> `String inhyp_pos, `Null
+ | `InBody -> `String inbody_pos, `Null
(*
let metadata_ns = "http://www.cs.unibo.it/helm/schemas/schema-helm"