]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/mathql_interpreter/mqint.ml
First very-very-very-very-alfa release of a MathQL Interpreter implemented
[helm.git] / helm / ocaml / mathql_interpreter / mqint.ml
diff --git a/helm/ocaml/mathql_interpreter/mqint.ml b/helm/ocaml/mathql_interpreter/mqint.ml
new file mode 100644 (file)
index 0000000..62c12d4
--- /dev/null
@@ -0,0 +1,95 @@
+
+(*
+ * implementazione del'interprete MathQL
+ *)
+open Mathql;;
+open Eval;;
+open Utility;;
+open Dbconn;;
+open Pattern;;
+open Union;;
+open Intersect;;
+open Use;;
+open Select;;
+
+(*
+ * inizializzazione della connessione al database
+ *)
+let init () = Dbconn.init ();;
+
+(*
+ * esecuzione di una query
+ *
+ * parametri:
+ * q
+ *
+ * output: string list list; risultato internto formato da uri + contesto.
+ *)
+let rec execute_ex q =
+   match q with
+      MQSelect (apvar, alist, abool) ->
+       select_ex apvar (execute_ex alist) abool
+   |  MQUsedBy (alist, asvar) ->
+       use_ex (execute_ex alist) asvar "refObj"
+   |  MQUse (alist, asvar) ->
+       use_ex (execute_ex alist) asvar "backPointer"
+   |  MQPattern (apreamble, apattern, ext, afragid) ->
+       pattern_ex apreamble apattern ext afragid
+   |  MQUnion (l1, l2) ->
+       union_ex (execute_ex l1) (execute_ex l2)
+   |  MQIntersect (l1, l2) ->
+       intersect_ex (execute_ex l1) (execute_ex l2)
+;;
+
+(*
+ * converte il risultato interno di una query (uri + contesto)
+ * in un risultato di sole uri
+ *
+ * parametri:
+ * l: string list list;
+ *
+ * output: mqresult;
+ *
+ * note:
+ * il tipo del risultato mantenuto internamente e' diverso dal tipo di risultato
+ * restituito in output poiche', mentre chi effettua le query vuole come risultato
+ * solo le eventuali uri che soddisfano le query stesse, internamente ad una uri
+ * sono associati anche i valori delle variabili che ancora non sono state valutate
+ * perche', ad esempio, si trovano in altri rami dell'albero.
+ *
+ * Esempio:
+ * SELECT x IN USE PATTERN "cic:/**.con" POSITION $a WHERE $a IS MainConclusion
+ * L'albero corrispondente a questa query e':
+ *
+ *                  SELECT
+ *                /   |    \
+ *               x   USE    IS
+ *                  /   \    /\
+ *           PATTERN    $a  $a MainConclusion
+ *
+ * Nel momento in cui si esegue il ramo USE non sono noti i vincoli sullla variabile $a
+ * percui e' necessario considerare, oltre alle uri, i valori della variabile per i quali
+ * la uri puo' far parte del risultato.
+ *)
+let xres_to_res l =
+ MQStrUri
+  (
+   List.map
+    List.hd
+    (List.tl l)
+  )
+;;
+
+(*
+ * 
+ *)
+let execute q =
+ match q with
+    MQList qq -> xres_to_res (execute_ex qq)
+;;
+
+(*
+ * chiusura della connessione al database
+ *)
+let close () = Dbconn.close ();;
+