+let restrict_universe query =
+ function
+ [] -> query (* no constraints ===> the universe is the library *)
+ | l ->
+ let universe =
+ (*CSC: Usare tante Union e Pattern per fare un insieme di uri mi *)
+ (*CSC: sembra un poco penoso. Inoltre creo un albero completamente *)
+ (*CSC: sbilanciato, aumentando il costo della risoluzione della *)
+ (*CSC: query. *)
+ let rec compose_universe =
+ function
+ [] -> assert false
+ | [uri] -> MQPattern uri
+ | uri::tl -> MQUnion(MQPattern uri, compose_universe tl)
+ in
+ compose_universe !universe
+ in
+ MQSelect (
+ "uri", query,
+ MQSubset (
+ MQSelect (
+ "uri2",
+ MQUsedBy (MQRVarOccur "uri", "pos"),
+ MQOr (
+ MQIs (MQSVar "pos", MQConclusion),
+ MQIs (MQSVar "pos", MQMConclusion)
+ )
+ ),
+ universe
+ )
+ )
+;;
+