-let rec exec_set_exp = function
- | MathQL.Ref vexp -> List.map (fun s -> (s,[])) (exec_val_exp vexp)
- | MathQL.Intersect sexp1 sexp2 -> intersect_ex (exec_set_exp sexp1) (exec_set_exp sexp2)
+let rec exec_set_exp c = function
+ |MathQL.SVar svar -> List.assoc svar c.svars
+ |MathQL.RVar rvar -> [List.assoc rvar c.rvars]
+ | MathQL.Ref vexp -> List.map (fun s -> (s,[])) (exec_val_exp c vexp)
+ | MathQL.Intersect (sexp1, sexp2) -> intersect_ex (exec_set_exp c sexp1) (exec_set_exp c sexp2)
+ | MathQL.Union (sexp1, sexp2) -> union_ex (exec_set_exp c sexp1) (exec_set_exp c sexp2)
+ | MathQL.LetSVar (svar, sexp1, sexp2) -> let _ = (svar, (exec_set_exp c sexp1)):: (List.remove_assoc svar c.svars)
+ in (exec_set_exp c sexp2)
+ | MathQL.LetVVar (vvar, vexp, sexp) -> let _ = (vvar, (exec_val_exp c vexp)):: (List.remove_assoc vvar c.vvars)
+ in (exec_set_exp c sexp)
+ | MathQL.Relation (rop, path, sexp, attl) -> relation_ex rop path (exec_set_exp c sexp) attl
+ | MathQL.Select (rvar, sexp, bexp) -> let rset = (exec_set_exp c sexp) in
+ let rec select_ex rset =
+ match rset with
+ [] -> []
+ | r::tl -> upd_rvars c ((rvar,r)::c.rvars);
+ if (exec_boole_exp c bexp) then r::(select_ex tl)
+ else select_ex tl
+ in select_ex rset
+
+
+
+ | MathQL.Diff (sexp1, sexp2) -> diff_ex (exec_set_exp c sexp1) (exec_set_exp c sexp2)