+
+
+
+
+ let rec q_where_rel n cr_r= (*function*)
+ (* Some l ->*)
+ let q0 =
+ M.Sub
+ (M.Property
+ (false, M.RefineExact, ("refRel", ["position"]),
+ M.RefOf(M.RVar "uri0")),
+ M.VVar ("rel_position" ^ string_of_int n))
+ in
+ match cr_r with
+ Some [] -> M.True
+ | Some [(p,None)] -> q0
+ | Some [(p,d)] ->
+ M.And
+ (q0,
+ M.Sub
+ (M.Property
+ (false, M.RefineExact, ("refRel", ["depth"]),
+ M.RefOf(M.RVar "uri0")),
+ M.VVar ("rel_depth" ^ string_of_int n)))
+ | Some ((p,None)::tl) ->
+ M.Or
+ (q0,
+ q_where_rel (n+1) (Some tl))
+ | Some ((p,d)::tl) ->
+ M.Or
+ (M.And
+ (q0,
+ M.Sub
+ (M.Property
+ (false, M.RefineExact, ("refRel", ["depth"]),
+ M.RefOf(M.RVar "uri0")),
+ M.VVar ("rel_depth" ^ string_of_int n))),
+ q_where_rel (n+1) (Some tl))
+ | None -> M.True
+ in
+
+ let rec q_where_sort n cr_s = (*function *)
+ (* Some l ->*)
+ let q0 =
+ M.And
+ (M.Sub
+ (M.Property
+ (false, M.RefineExact, ("refSort", ["position"]),
+ M.RefOf(M.RVar "uri0")
+ ),
+ M.VVar ("sort_position" ^ string_of_int n)),
+ M.Sub
+ (M.Property
+ (false, M.RefineExact, ("refSort", ["sort"]),
+ M.RefOf(M.RVar "uri0")),
+ M.VVar ("sort" ^ string_of_int n)))
+ in
+ match cr_s with
+ Some [] -> M.True
+ | Some [(p,None,s)] -> q0
+
+ | Some [(p,d,s)] ->
+ M.And
+ (q0,
+ M.Sub
+ (M.Property
+ (false, M.RefineExact, ("refSort", ["depth"]),
+ M.RefOf(M.RVar "uri0")),
+ M.VVar ("sort_depth" ^ string_of_int n)))
+
+ | Some ((p,None,s)::tl) ->
+ M.Or
+ (q0,
+ q_where_sort (n+1) (Some tl))
+
+ | Some((p,d,s)::tl) ->
+ M.Or
+ (M.And
+ (q0,
+ M.Sub
+ (M.Property
+ (false, M.RefineExact, ("refSort", ["depth"]),
+ M.RefOf(M.RVar "uri0")),
+ M.VVar ("sort_depth" ^ string_of_int n))),
+ q_where_sort (n+1) (Some tl))
+ | None -> M.True
+ in
+
+
+
+