let out_svar s = sep "$" ^ sym s
+let out_lvar s = sep "%" ^ sym s
+
let out_tref r = pat (str_tref r)
let out_pat p = out_tref p
| MQModified -> key "modified"
let out_str = function
- | MQCons s -> str s
- | MQSRVar s -> out_rvar s
- | MQSSVar s -> out_svar s
- | MQFunc (f, r) -> out_func f ^ out_rvar r
- | MQMConclusion -> key "mainconclusion"
- | MQConclusion -> key "inconclusion"
+ | MQCons s -> str s
+ | MQStringRVar s -> out_rvar s
+ | MQStringSVar s -> out_svar s
+ | MQFunc (f, r) -> out_func f ^ out_rvar r
+ | MQMConclusion -> key "mainconclusion"
+ | MQConclusion -> key "inconclusion"
let rec out_bool = function
| MQTrue -> key "true"
| MQUnion (l1, l2) -> sep "(" ^ out_list l1 ^ sub "union" ^ out_list l2 ^ sep ")"
| MQIntersect (l1, l2) -> sep "(" ^ out_list l1 ^ sub "intersect" ^ out_list l2 ^ sep ")"
| MQDiff (l1, l2) -> sep "(" ^ out_list l1 ^ sub "diff" ^ out_list l2 ^ sep ")"
- | MQLRVar s -> out_rvar s
+ | MQListRVar v -> out_rvar v
| MQSortedBy (l, o, f) -> sep "(" ^ out_list l ^ sub "sortedby" ^ out_func f ^ out_order o ^ sep ")"
+ | MQListLVar v -> out_lvar v
+ | MQLetIn (v, l1, l2) -> key "let" ^ out_lvar v ^ sub "be" ^ out_list l1 ^ sub "in" ^ out_list l2
+ | MQReference s -> key "reference" ^ str s
+ | MQMinimize l -> key "minimize" ^ out_list l
let out_query = function
| MQList l -> out_list l
(* Input types **************************************************************)
(* main type is mquery *)
-type mqrvar = string (* name *)
+type mqrvar = string (* name *)
-type mqsvar = string (* name *)
+type mqsvar = string (* name *)
-type mqlvar = string (* name *)
+type mqlvar = string (* name *)
-type mqpt = string option (* PROTOCOL TOKENS *)
- (* Some = constant string *)
- (* None = single star: '*' *)
+type mqpt = string option (* PROTOCOL TOKENS *)
+ (* Some = constant string *)
+ (* None = single star: '*' *)
-type mqbt = (* BODY TOKENS *)
- | MQBC of string (* a constant string *)
- | MQBD (* a slash: '/' *)
- | MQBQ (* a question mark: '?' *)
- | MQBS (* a single star: '*' *)
- | MQBSS (* a double star: '**' *)
+type mqbt = (* BODY TOKENS *)
+ | MQBC of string (* a constant string *)
+ | MQBD (* a slash: '/' *)
+ | MQBQ (* a question mark: '?' *)
+ | MQBS (* a single star: '*' *)
+ | MQBSS (* a double star: '**' *)
-type mqft = (* FRAGMENT TOKENS *)
- | MQFC of int (* a constant integer *)
- | MQFS (* a single star: '*' *)
- | MQFSS (* a double star: '**' *)
+type mqft = (* FRAGMENT TOKENS *)
+ | MQFC of int (* a constant integer *)
+ | MQFS (* a single star: '*' *)
+ | MQFSS (* a double star: '**' *)
-type mqtref = mqpt * (mqbt list) * (mqft list) (* tokenized reference *)
+type mquref = UriManager.uri * (int list) (* uri, fragment identifier *)
-type mqpattern = mqtref (* constant pattern *)
+type mqtref = mqpt * (mqbt list) * (mqft list) (* tokenized pattern reference *)
+
+type mqref = string (* format for references (helper) *)
type mqfunc =
- | MQName (* NAME *)
- | MQTheory
- | MQTitle
+ | MQName (* Name *)
+ | MQTheory (* theory *)
+ | MQTitle (* DC properties *)
| MQContributor
| MQCreator
| MQPublisher
| MQRights
| MQInstitution
| MQContact
- | MQFirstVersion
+ | MQFirstVersion
| MQModified
type mqstring =
- | MQCons of string (* constant *)
- | MQFunc of mqfunc * mqrvar (* function, rvar *)
- | MQSRVar of mqrvar (* rvar *)
- | MQSSVar of mqsvar (* svar *)
- | MQMConclusion (* main conclusion *)
- | MQConclusion (* inner conclusion *)
+ | MQCons of string (* constant *)
+ | MQFunc of mqfunc * mqrvar (* function, rvar *)
+ | MQStringRVar of mqrvar (* rvar *)
+ | MQStringSVar of mqsvar (* svar *)
+ | MQMConclusion (* main conclusion *)
+ | MQConclusion (* inner conclusion *)
type mqorder =
- | MQAsc
- | MQDesc
+ | MQAsc (* ascending order *)
+ | MQDesc (* descending order *)
type mqbool =
- | MQTrue
- | MQFalse
- | MQAnd of mqbool * mqbool
- | MQOr of mqbool * mqbool
- | MQNot of mqbool
- | MQIs of mqstring * mqstring (* operands *)
- | MQSetEqual of mqlist * mqlist (* the two lists denote the *)
- (* same set *)
- | MQSubset of mqlist * mqlist (* the two lists denote two *)
- (* sets, the first one *)
- (* subsect of the second one. *)
+ | MQTrue (* true *)
+ | MQFalse (* false *)
+ | MQAnd of mqbool * mqbool (* conjunction *)
+ | MQOr of mqbool * mqbool (* disjunction *)
+ | MQNot of mqbool (* negation *)
+ | MQIs of mqstring * mqstring (* case-sensitive comparison *)
+ | MQSetEqual of mqlist * mqlist (* the two lists denote the same set *)
+ | MQSubset of mqlist * mqlist (* the two lists denote two sets, the 1st subset of the 2nd *)
and mqlist =
- | MQSelect of mqrvar * mqlist * mqbool (* rvar, list, boolean *)
- | MQUse of mqlist * mqsvar (* list, Position attribute *)
- | MQUsedBy of mqlist * mqsvar (* list, Position attribute *)
- | MQPattern of mqpattern (* pattern *)
- | MQUnion of mqlist * mqlist (* operands *)
- | MQIntersect of mqlist * mqlist (* operands *)
- | MQSortedBy of mqlist * mqorder * mqfunc (* *)
- | MQLRVar of mqrvar
- | MQDiff of mqlist * mqlist (* *)
- | MQLetIn of mqrvar * mqlist * mqlist
- | MQLetRef of mqrvar
-
+ | MQReference of mqref (* reference *)
+ | MQPattern of mqtref (* pattern *)
+ | MQListLVar of mqlvar (* lvar *)
+ | MQListRVar of mqrvar (* rvar *)
+ | MQSelect of mqrvar * mqlist * mqbool (* rvar, list, boolean *)
+ | MQUse of mqlist * mqsvar (* list, Position attribute *)
+ | MQUsedBy of mqlist * mqsvar (* list, Position attribute *)
+ | MQUnion of mqlist * mqlist (* operands *)
+ | MQIntersect of mqlist * mqlist (* operands *)
+ | MQSortedBy of mqlist * mqorder * mqfunc (* ordering *)
+ | MQDiff of mqlist * mqlist (* set difference *)
+ | MQLetIn of mqlvar * mqlist * mqlist (* explicit lvar assignment *)
+ | MQMinimize of mqlist (* list minimization *)
+
type mquery =
| MQList of mqlist
(* Output types *************************************************************)
(* main type is mqresult *)
-type mquref = UriManager.uri * (int list) (* uri, fragment identifier *)
-
-type mqrefs = string list (* list of references (helper) *)
-
type mqresult =
- | MQRefs of mqrefs
+ | MQRefs of mqref list