type cardinality_condition =
| Eq of int
| Gt of int
+ | Lt of int
let tbln n = "table" ^ string_of_int n
(positions :> MetadataTypes.position list)) ^
")"
+let explode_card_constr = function
+ | Eq card -> "=", card
+ | Gt card -> ">", card
+ | Lt card -> "<", card
+
let add_card_constr tbl (n,from,where) = function
| None -> (n,from,where)
- | Some (Eq card) ->
+ | Some constr ->
let cur_tbl = tbln n in
+ let op, card = explode_card_constr constr in
(n+1,
(sprintf "%s as %s" tbl cur_tbl :: from),
- (sprintf "%s.no=%d" cur_tbl card ::
+ (sprintf "%s.no %s %d" cur_tbl op card ::
(if n=0 then []
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 cur_tbl :: from),
- (sprintf "%s.no>%d" cur_tbl card ::
- (if n=0 then []
- else [sprintf "table0.source = %s.source" cur_tbl]) @
+
+let add_diff_constr conclno_tbl hypno_tbl (n,from,where) = function
+ | None -> (n,from,where)
+ | Some constr ->
+ let cur_tbl1, cur_tbl2 = tbln n, tbln (n+1) in
+ let op, card = explode_card_constr constr in
+ (n+2,
+ (sprintf "%s as %s" conclno_tbl cur_tbl1 ::
+ sprintf "%s as %s" hypno_tbl cur_tbl2 :: from),
+ (sprintf "%s.no - %s.no %s %d" cur_tbl2 cur_tbl1 op card ::
+ (if n=0 then assert false
+ else [sprintf "table0.source = %s.source" cur_tbl1;
+ sprintf "table0.source = %s.source" cur_tbl2]) @
where))
-let at_least ~(dbd:Mysql.dbd) ?concl_card ?full_card tables
+let add_constraint tables (n,from,where) metadata =
+ let obj_tbl,rel_tbl,sort_tbl,conclno_tbl,fullno_tbl,hypno_tbl = tables in
+ let cur_tbl = tbln n in
+ match metadata with
+ | `Obj (uri, positions) ->
+ let from = (sprintf "%s as %s" obj_tbl cur_tbl) :: from in
+ let where =
+ (sprintf "(%s.h_occurrence = \"%s\")" cur_tbl uri) ::
+ mk_positions positions cur_tbl ::
+ (if n=0 then []
+ else [sprintf "table0.source = %s.source" cur_tbl]) @
+ where
+ in
+ ((n+2), from, where)
+ | `Rel positions ->
+ let from = (sprintf "%s as %s" rel_tbl cur_tbl) :: from in
+ let where =
+ mk_positions positions cur_tbl ::
+ (if n=0 then []
+ else [sprintf "table0.source = %s.source" cur_tbl]) @
+ where
+ in
+ ((n+2), from, where)
+ | `Sort (sort, positions) ->
+ let sort_str = CicPp.ppsort sort in
+ let from = (sprintf "%s as %s" sort_tbl cur_tbl) :: from in
+ let where =
+ (sprintf "%s.h_sort = \"%s\"" cur_tbl sort_str ) ::
+ mk_positions positions cur_tbl ::
+ (if n=0 then
+ []
+ else
+ [sprintf "table0.source = %s.source" cur_tbl ]) @ where
+ in
+ ((n+2), from, where)
+
+let at_least ~(dbd:Mysql.dbd) ?concl_card ?full_card ?diff tables
(metadata: MetadataTypes.constr list)
=
+ let obj_tbl,rel_tbl,sort_tbl,conclno_tbl,fullno_tbl,hypno_tbl = tables in
if (metadata = []) && concl_card = None && full_card = None then
failwith "MetadataQuery.at_least: no constraints given";
- let obj_tbl,rel_tbl,sort_tbl,conclno_tbl,conclno_hyp_tbl = tables in
- let add_constraint (n,from,where) metadata =
- let cur_tbl = tbln n in
- match metadata with
- | `Obj (uri, positions) ->
- let from = (sprintf "%s as %s" obj_tbl cur_tbl) :: from in
- let where =
- (sprintf "(%s.h_occurrence = \"%s\")" cur_tbl uri) ::
- mk_positions positions cur_tbl ::
- (if n=0 then []
- else [sprintf "table0.source = %s.source" cur_tbl]) @
- where
- in
- ((n+2), from, where)
- | `Rel positions ->
- let from = (sprintf "%s as %s" rel_tbl cur_tbl) :: from in
- let where =
- mk_positions positions cur_tbl ::
- (if n=0 then []
- else [sprintf "table0.source = %s.source" cur_tbl]) @
- where
- in
- ((n+2), from, where)
- | `Sort (sort, positions) ->
- let sort_str = CicPp.ppsort sort in
- let from = (sprintf "%s as %s" sort_tbl cur_tbl) :: from in
- let where =
- (sprintf "%s.h_sort = \"%s\"" cur_tbl sort_str ) ::
- mk_positions positions cur_tbl ::
- (if n=0 then
- []
- else
- [sprintf "table0.source = %s.source" cur_tbl ]) @ where
- in
- ((n+2), from, where)
+ let (n,from,where) =
+ List.fold_left (add_constraint tables) (0,[],[]) metadata
in
- let (n,from,where) = List.fold_left add_constraint (0,[],[]) metadata in
let (n,from,where) =
add_card_constr conclno_tbl (n,from,where) concl_card
in
let (n,from,where) =
- add_card_constr conclno_hyp_tbl (n,from,where) full_card
+ add_card_constr fullno_tbl (n,from,where) full_card
+ in
+ let (n,from,where) =
+ add_diff_constr conclno_tbl hypno_tbl (n,from,where) diff
in
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
+ let query =
+(*
+ sprintf
+ ("select table0.source from %s, %s where %s and %s.source = table0.source"
+ ^^ " order by %s.no")
+ from fullno_tbl where fullno_tbl fullno_tbl
+ *)
+ sprintf "select table0.source from %s where %s" from where
+ in
+ prerr_endline query;
let result = Mysql.exec dbd query in
Mysql.map result
(fun row -> match row.(0) with Some s -> s | _ -> assert false)
let at_least
- ~(dbd:Mysql.dbd) ?concl_card ?full_card (metadata: MetadataTypes.constr list)
+ ~(dbd:Mysql.dbd) ?concl_card ?full_card ?diff
+ (metadata: MetadataTypes.constr list)
=
let module MT = MetadataTypes in
if MT.are_tables_ownerized () then
- (at_least ~dbd ?concl_card ?full_card
+ (at_least ~dbd ?concl_card ?full_card ?diff
(MT.obj_tbl (),MT.rel_tbl (),MT.sort_tbl (),
- MT.conclno_tbl (),MT.conclno_hyp_tbl ())
+ MT.conclno_tbl (),MT.fullno_tbl (),MT.hypno_tbl ())
metadata)
@
- (at_least ~dbd ?concl_card ?full_card
+ (at_least ~dbd ?concl_card ?full_card ?diff
(MT.library_obj_tbl,MT.library_rel_tbl,MT.library_sort_tbl,
- MT.library_conclno_tbl,MT.library_conclno_hyp_tbl)
+ MT.library_conclno_tbl,MT.library_fullno_tbl,MT.library_hypno_tbl)
metadata)
else
- at_least ~dbd ?concl_card ?full_card
+ at_least ~dbd ?concl_card ?full_card ?diff
(MT.library_obj_tbl,MT.library_rel_tbl,MT.library_sort_tbl,
- MT.library_conclno_tbl,MT.library_conclno_hyp_tbl)
+ MT.library_conclno_tbl,MT.library_fullno_tbl,MT.library_hypno_tbl)
metadata
in
aux pos S.empty term
+module OrderedInt =
+struct
+ type t = int
+ let compare = Pervasives.compare
+end
+
+module IntSet = Set.Make (OrderedInt)
+
+let compute_metas term =
+ let rec aux in_hyp ((concl_metas, hyp_metas) as acc) cic =
+ match cic with
+ | Cic.Rel _
+ | Cic.Sort _
+ | Cic.Var _ -> acc
+ | Cic.Meta (no, local_context) ->
+ let acc =
+ if in_hyp then
+ (concl_metas, IntSet.add no hyp_metas)
+ else
+ (IntSet.add no concl_metas, hyp_metas)
+ in
+ List.fold_left
+ (fun set context ->
+ match context with
+ | None -> set
+ | Some term -> aux in_hyp set term)
+ acc
+ local_context
+ | Cic.Implicit _ -> assert false
+ | Cic.Cast (term, ty) ->
+ (* TODO consider also ty? *)
+ aux in_hyp acc term
+ | Cic.Prod (_, source, target) ->
+ if in_hyp then
+ let acc = aux in_hyp acc source in
+ aux in_hyp acc target
+ else
+ let acc = aux true acc source in
+ aux in_hyp acc target
+ | Cic.Lambda (_, source, target) ->
+ let acc = aux in_hyp acc source in
+ aux in_hyp acc target
+ | Cic.LetIn (_, term, target) ->
+ aux in_hyp acc (CicSubstitution.subst term target)
+ | Cic.Appl [] -> assert false
+ | Cic.Appl (hd :: tl) ->
+ let acc = aux in_hyp acc hd in
+ List.fold_left (fun acc term -> aux in_hyp acc term) acc tl
+ | Cic.Const (_, subst)
+ | Cic.MutInd (_, _, subst)
+ | Cic.MutConstruct (_, _, _, subst) ->
+ List.fold_left (fun acc (_, term) -> aux in_hyp acc term) acc subst
+ | Cic.MutCase (uri, _, outtype, term, pats) ->
+ let acc = aux in_hyp acc term in
+ let acc = aux in_hyp acc outtype in
+ List.fold_left (fun acc term -> aux in_hyp acc term) acc pats
+ | Cic.Fix (_, funs) ->
+ List.fold_left
+ (fun acc (_, _, ty, body) ->
+ let acc = aux in_hyp acc ty in
+ aux in_hyp acc body)
+ acc funs
+ | Cic.CoFix (_, funs) ->
+ List.fold_left
+ (fun acc (_, ty, body) ->
+ let acc = aux in_hyp acc ty in
+ aux in_hyp acc body)
+ acc funs
+ in
+ aux false (IntSet.empty, IntSet.empty) term
+
let compute_type uri typeno (name, _, ty, constructors) =
let consno = ref 0 in
let type_metadata =
let rel_tbl_original = "refRel"
let obj_tbl_original = "refObj"
let conclno_tbl_original = "no_inconcl_aux"
-let conclno_hyp_tbl_original = "no_concl_hyp"
+let fullno_tbl_original = "no_concl_hyp"
+let hypno_tbl_original = "no_hyp"
let name_tbl_original = "objectName"
(** the names currently used *)
let rel_tbl_real = ref rel_tbl_original
let obj_tbl_real = ref obj_tbl_original
let conclno_tbl_real = ref conclno_tbl_original
-let conclno_hyp_tbl_real = ref conclno_hyp_tbl_original
+let fullno_tbl_real = ref fullno_tbl_original
+let hypno_tbl_real = ref hypno_tbl_original
let name_tbl_real = ref name_tbl_original
(** the exported symbols *)
let rel_tbl () = ! rel_tbl_real ;;
let obj_tbl () = ! obj_tbl_real ;;
let conclno_tbl () = ! conclno_tbl_real ;;
-let conclno_hyp_tbl () = ! conclno_hyp_tbl_real ;;
+let fullno_tbl () = ! fullno_tbl_real ;;
+let hypno_tbl () = ! hypno_tbl_real ;;
let name_tbl () = ! name_tbl_real ;;
(** to use the owned tables *)
rel_tbl_real := ( rel_tbl_original ^ "_" ^ owner) ;
obj_tbl_real := ( obj_tbl_original ^ "_" ^ owner) ;
conclno_tbl_real := ( conclno_tbl_original ^ "_" ^ owner) ;
- conclno_hyp_tbl_real := ( conclno_hyp_tbl_original ^ "_" ^ owner) ;
+ fullno_tbl_real := ( fullno_tbl_original ^ "_" ^ owner) ;
+ hypno_tbl_real := ( hypno_tbl_original ^ "_" ^ owner) ;
name_tbl_real := ( name_tbl_original ^ "_" ^ owner)
;;
let library_rel_tbl = rel_tbl_original
let library_obj_tbl = obj_tbl_original
let library_conclno_tbl = conclno_tbl_original
-let library_conclno_hyp_tbl = conclno_hyp_tbl_original
+let library_fullno_tbl = fullno_tbl_original
+let library_hypno_tbl = hypno_tbl_original
let library_name_tbl = name_tbl_original
let are_tables_ownerized () =