]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/mathql_interpreter/mQueryInterpreter.ml
functor added
[helm.git] / helm / ocaml / mathql_interpreter / mQueryInterpreter.ml
index b66228581c9a66ab56a6c47e08c51782cd836d0a..cc85c78111ae4024b63820fd590e1837de8e02d1 100644 (file)
 
 exception Found
 
+module U = AvsUtil
 module M = MathQL
+module I = M.I
 module P = MQueryUtil 
 module C = MQIConn
-module U = MQIUtil
 module L = MQILib
 module F = MQueryIO
 
 (* contexts *****************************************************************)
 
-type svar_context = (M.svar * M.resource_set) list
+type svar_context = (M.svar * M.result) list
 
-type avar_context = (M.avar * M.resource) list
+type avar_context = (M.avar * (string * M.group list)) list
 
-type group_context = (M.avar * M.attribute_group) list
+type group_context = (M.avar * M.group) list
 
 type context = {svars: svar_context;   
                 avars: avar_context;   
@@ -58,19 +59,21 @@ let execute h x =
        F.text_of_query (C.log h) "\n" q
      end
    in
-   let proj v = List.map fst v in
    let rec eval_query c = function
-      | M.Const r -> c, r
-      | M.Dot i p -> 
+      | M.Const r -> 
+         let aux2 s g = I.make s (eval_list c g) in
+         let aux (s, gl) = U.iter (aux2 s) gl in  
+         c, U.iter aux r
+      | M.Dot (i, p) -> 
          begin
-            try c, U.mql_subj (List.assoc p (List.assoc i c.groups)) 
-           with Not_found -> warn (M.Dot i p); c, [] 
+            try c, I.grp_read (List.assoc i c.groups) p 
+           with Not_found -> warn (M.Dot (i, p)); c, I.empty 
         end
-      | M.Ex l y -> 
+      | M.Ex (l, y) -> 
          let rec ex_aux h = function
            | []        -> 
               let d = {c with groups = h} in
-               if snd (eval_query d y) = U.mql_false then () else raise Found 
+               if snd (eval_query d y) = U.val_false then () else raise Found 
            | i :: tail -> 
                begin
                  try 
@@ -83,55 +86,58 @@ let execute h x =
                  with Not_found -> ()
               end
          in
-        begin try ex_aux [] l; c, U.mql_false with Found -> c, U.mql_true end
+        begin try ex_aux [] l; c, U.val_false with Found -> c, U.val_true end
       | M.SVar i -> 
          begin
             try c, List.assoc i c.svars 
-           with Not_found -> warn (M.SVar i); c, []
+           with Not_found -> warn (M.SVar i); c, I.empty
         end  
       | M.AVar i -> 
          begin
-            try c, [List.assoc i c.avars] 
-           with Not_found -> warn (M.AVar i); c, []
+            try 
+              let s, gl = List.assoc i c.avars in
+              c, U.make_x s gl  
+           with Not_found -> warn (M.AVar i); c, I.empty
         end
-      | M.Let (Some i) x1 x2 ->
+      | M.Let (Some i, x1, x2) ->
         let d, r = eval_query c x1 in
         let d = {d with svars = P.add_assoc (i, r) d.svars} in
          eval_query d x2
-      | M.Let None x1 x2 ->
+      | M.Let (None, x1, x2) ->
         let d, r = eval_query c x1 in eval_query d x2
-      | M.For k i x1 x2 ->
+      | M.For (k, i, x1, x2) ->
          let f = match k with
-           | M.GenFJoin -> U.mql_union
-           | M.GenFMeet -> U.mql_intersect
+           | M.GenFJoin -> I.union
+           | M.GenFMeet -> I.intersect
         in
-         let rec for_aux (d, r) = match r with
-           | []     -> d, []
-           | h :: t ->
-              let d = {d with avars = P.add_assoc (i, h) d.avars} in
-              let d, r = eval_query d x2 in
-              let d, s = for_aux (d, t) in
-              d, f r s
-        in
-        for_aux (eval_query c x1)
-      | M.While k x1 x2 ->
+         let for_aux (d, r) s gl _ =
+           let d = {d with avars = P.add_assoc (i, (s, gl)) d.avars} in
+           let d, s = eval_query d x2 in
+           d, f r s
+        in 
+        let d, r = eval_query c x1 in
+        I.x_iter for_aux (d, I.empty) r
+      | M.While (k, x1, x2) ->
          let f = match k with
-           | M.GenFJoin -> U.mql_union
-           | M.GenFMeet -> U.mql_intersect
+           | M.GenFJoin -> I.union
+           | M.GenFMeet -> I.intersect
         in
          let rec while_aux (d, r) = 
            let d, b = eval_query d x1 in
-           if b = U.mql_false then d, r else 
+           if b = U.val_false then d, r else 
            let d, s = eval_query d x2 in
            while_aux (d, f r s)
         in
-        while_aux (c, U.mql_false)
-      | M.Add b z x ->
-         let f = if b then U.mql_prod else U.set_union in
-        let g a s = (fst a, f (snd a) (eval_grp c z)) :: s in
+        while_aux (c, U.val_false)
+      | M.Add (b, z, x) ->
+         let f = if b then I.d_union else I.union in
+        let agl = eval_grp c z in       
+        let aux r sj gl _ = 
+           I.append (f (U.make_x sj gl) (U.make_x sj agl)) r
+        in
         let _, r = eval_query c x in
-        c, List.fold_right g r []
-      | M.Property q0 q1 q2 mc ct cfl el pat y ->
+        c, I.x_iter aux I.empty r
+      | M.Property (q0, q1, q2, mc, ct, cfl, el, pat, y) ->
         let _, r = eval_query c y in
         let subj, mct = 
            if q0 then [], (pat, q2 @ mc, r) else (q2 @ mc), (pat, [], r)  
@@ -147,32 +153,32 @@ let execute h x =
         let r = MQIProperty.exec h q1 subj cons_true cons_false exp in 
         let s = P.stop_time t in
          if C.set h C.Stat then 
-           C.log h (Printf.sprintf "Property: %s,%i\n" s (List.length r));
+           C.log h (Printf.sprintf "Property: %s,%i\n" s (U.count r));
         c, r 
-      | M.Select i x y ->
-         let rec select_aux (d, r) = match r with
-           | []     -> d, []
-           | h :: t ->
-              let d = {d with avars = P.add_assoc (i, h) d.avars} in
-              let d, r = eval_query d y in
-              let d, s = select_aux (d, t) in
-              if r = U.mql_false then d, s else d, (h :: s)
+      | M.Select (i, x, y) ->
+         let aux (d, r) sj gl _ =
+           let d = {d with avars = P.add_assoc (i, (sj, gl)) d.avars} in
+           let d, s = eval_query d y in
+           if s = U.val_false then d, r else d, (I.append (U.make_x sj gl) r)
         in
-        select_aux (eval_query c x)
-      | M.Fun p pl xl ->        
+        let d, r = eval_query c x in
+         I.x_iter aux (d, I.empty) r 
+      | M.Fun (p, pl, xl) ->        
         let e = {L.eval = (fun x -> snd (eval_query c x)); L.conn = h} in
          c, L.fun_eval e (F.text_out_spec (C.log h) "\n") F.text_in_spec 
             p pl xl
-      | M.Gen p xl -> 
+      | M.Gen (p, xl) -> 
          let e = {L.eval = (fun x -> snd (eval_query c x)); L.conn = h} in
         eval_query c (L.gen_eval e p xl)
+   and eval_list c l =
+      let aux (p, y) = 
+         let _, r = eval_query c y in
+         U.x_grp_make_x p r
+      in
+      U.grp_iter aux l
    and eval_grp c = function
       | M.Attr gs ->
-         let attr_aux g (p, y) = 
-           let _, r = eval_query c y in
-           U.mql_union g [p, proj r]
-        in
-        let attr_auxs s l = U.set_union s [List.fold_left attr_aux [] l] in
+        let attr_auxs s l = I.grps_make s (eval_list c l) in
         List.fold_left attr_auxs [] gs
       | M.From i ->
          try snd (List.assoc i c.avars)