-
- let rec build_intersect_sort = function
- [] -> M.Ref(M.Const [])
- | [hd] -> build_select_sort hd
- | hd :: tl -> M.Intersect (build_select_sort hd, build_intersect_sort tl)
- in
-
- let build_intersect = function
-(* let tostring_sort (a,b,c) =
- let b1 = string_of_int b in
- (a,b1,c)
- in
- let tostring_rel (a,b) =
- let b1 = string_of_int b in
- (a,b1)
- in*)
-
-(* let (l1,l2,l3) = must in
- match (l1,l2,l3) with *)
- l1,[],[] -> build_intersect_obj l1
- | [],l2,[] -> (*let lrel = List.map tostring_rel l2 in*)
- build_intersect_rel l2
- | [],[],l3 ->(* let lsort = List.map tostring_sort l3 in*)
- build_intersect_sort l3
- | l1,l2,[] -> (*let lrel = List.map tostring_rel l2 in*)
- M.Intersect (build_intersect_obj l1, build_intersect_rel l2)
- | l1,[],l3 ->(* let lsort = List.map tostring_sort l3 in *)
- M.Intersect (build_intersect_obj l1, build_intersect_sort l3)
- | [],l2,l3 ->(* let lrel = List.map tostring_rel l2 in
- let lsort = List.map tostring_sort l3 in*)
- M.Intersect (build_intersect_rel l2, build_intersect_sort l3)
- | l1,l2,l3 ->(* let lrel = List.map tostring_rel l2 in
- let lsort = List.map tostring_sort l3 in *)
- M.Intersect (M.Intersect (build_intersect_obj l1, build_intersect_rel l2), build_intersect_sort l3)
- in
-
- let q_in = build_intersect must_use in
- let q_select = M.Select ("uri0", q_in, q_where can_use) in
-
-(* variables for can restrictions *)
-
- let q_let_u = M.LetVVar ("universe", M.Const universe, q_select) in
-
- let rec q_let_s sor n =
- match sor with
- [] -> q_let_u
- | [s] -> M.LetVVar ("sort" ^ (string_of_int n), M.Const [s], q_let_u)
- | s::tl -> M.LetVVar ("sort" ^ (string_of_int n), M.Const [s], q_let_s tl (n+1))
- in
-
-(* let q_let_s = M.LetVVar ("sorts", M.Const sor, q_let_u) in *)
-
- let rec q_let_ds sdep n =
- match sdep with
- []
- | [None] -> q_let_s sor 1
- | (None)::tl -> q_let_ds tl (n+1)
- | [Some d] -> M.LetVVar ("sort_depth" ^ (string_of_int n), M.Const [(string_of_int d)], q_let_s sor 1)
- | (Some d)::tl -> M.LetVVar ("sort_depth" ^ (string_of_int n), M.Const [(string_of_int d)], q_let_ds tl (n+1))
- in
-
-(* let q_let_ds = M.LetVVar ("sort_depths", M.Const sdep, q_let_s) in *)
-
- let rec q_let_dr rdep n =
- match rdep with
- []
- | [None] -> q_let_ds sdep 1
- | (None)::tl -> q_let_dr tl (n+1)
- | [Some d] -> M.LetVVar ("rel_depth" ^ (string_of_int n), M.Const [(string_of_int d)], q_let_ds sdep 1)
- | (Some d)::tl -> M.LetVVar ("rel_depth" ^ (string_of_int n), M.Const [(string_of_int d)], q_let_dr tl (n+1))
- in
-
-
- (*let q_let_dr = M.LetVVar ("rel_depths", M.Const rdep, q_let_ds) in*)
-
- let rec q_let_do odep n =
- match odep with
- []
- | [None] -> q_let_dr rdep 1
- | (None)::tl -> q_let_do tl (n+1)
- | [Some d] -> M.LetVVar ("obj_depth" ^ (string_of_int n), M.Const [(string_of_int d)], q_let_dr rdep 1)
- | (Some d)::tl -> M.LetVVar ("obj_depth" ^ (string_of_int n), M.Const [(string_of_int d)], q_let_do tl (n+1))
- in
-
-
-(* let q_let_do = M.LetVVar ("obj_depths", M.Const odep, q_let_dr) in *)
-
-
- let rec q_let_ps spos n =
- match spos with
- [] -> q_let_do odep 1
- | [p] -> M.LetVVar ("sort_position" ^ (string_of_int n), M.Const [p], q_let_do odep 1)
- | p::tl -> M.LetVVar ("sort_position" ^ (string_of_int n), M.Const [p], q_let_ps tl (n+1))
- in
-
-
-(* let q_let_ps = M.LetVVar ("sort_positions", M.Const spos, q_let_do) in *)
-
-
- let rec q_let_pr rpos n =
- match rpos with
- [] -> q_let_ps spos 1
- | [p] -> M.LetVVar ("rel_position" ^ (string_of_int n), M.Const [p], q_let_ps spos 1)
- | p::tl -> M.LetVVar ("rel_position" ^ (string_of_int n), M.Const [p], q_let_pr tl (n+1))
- in
-
-
-
-(* let q_let_pr = M.LetVVar ("rel_positions", M.Const rpos, q_let_ps) in *)
-
- let rec q_let_po opos n =
- match opos with
- [] -> q_let_pr rpos 1
- | [p] -> M.LetVVar ("obj_position" ^ (string_of_int n), M.Const [p], q_let_pr rpos 1)
- | p::tl -> M.LetVVar ("obj_position" ^ (string_of_int n), M.Const [p], q_let_po tl (n+1))