(* * implementazione del comando SELECT *) open Mathql;; open Func;; open Utility;; (* * valutazione di una stringa *) let stringeval s l = match s with MQCons s -> s | MQFunc (f, rvar) -> ( match f with MQName -> func_name (List.assoc rvar l) ) | MQRVar rvar -> List.assoc rvar l | MQSVar svar -> List.assoc svar l | MQMConclusion -> "MainConclusion" | MQConclusion -> "InConclusion" ;; (* * *) let rec is_good l abool = match abool with MQAnd (b1, b2) -> (is_good l b1) && (is_good l b2) | MQOr (b1, b2) -> (is_good l b1) || (is_good l b2) | MQNot b1 -> not (is_good l b1) | MQTrue -> true | MQFalse -> false | MQIs (s1, s2) -> (stringeval s1 l) = (stringeval s2 l) ;; (* * *) let rec replace avar newval l = match l with MQAnd (b1, b2) -> MQAnd (replace avar newval b1, replace avar newval b2) | MQOr (b1, b2) -> MQOr (replace avar newval b1, replace avar newval b2) | MQNot b1 -> MQNot (replace avar newval b1) | MQIs (s1, s2) -> let ns1 = ( match s1 with MQRVar v when v = avar -> MQRVar newval | MQFunc (f, v) when v = avar -> MQFunc (f, newval) | _ -> s1 ) and ns2 = ( match s2 with MQRVar v when v = avar -> MQRVar newval | MQFunc (f, v) when v = avar -> MQFunc (f, newval) | _ -> s2 ) in MQIs (ns1, ns2) | _ -> l (* i casi non compresi sono MQTrue e MQFalse *) ;; let rec print_booltree b = match b with MQAnd (b1, b2) -> let i = print_booltree b1 in let j = print_string " AND " in print_booltree b2 | MQOr (b1, b2) -> let i = print_booltree b1 in let j = print_string " OR " in print_booltree b2 | MQNot b1 -> let j = print_string " NOT " in print_booltree b1 | MQTrue -> print_string " TRUE " | MQFalse -> print_string " FALSE " | MQIs (s1, s2) -> let s1v = match s1 with MQCons s -> "'" ^ s ^ "'" | MQFunc (f, rvar) -> ( match f with MQName -> "NAME " ^ rvar ) | MQRVar rvar -> rvar | MQSVar svar -> svar | MQMConclusion -> "MainConclusion" | MQConclusion -> "InConclusion" and s2v = match s2 with MQCons s -> s | MQFunc (f, rvar) -> ( match f with MQName -> "NAME " ^ rvar ) | MQRVar rvar -> rvar | MQSVar svar -> svar | MQMConclusion -> "MainConclusion" | MQConclusion -> "InConclusion" in print_string (s1v ^ " = " ^ s2v) ;; (* * implementazione del comando SELECT *) let select_ex avar alist abool = let wrt = replace avar "retVal" abool in (*let j = print_booltree wrt in*) [List.hd alist] @ List.find_all (fun l -> is_good (List.combine (List.hd alist) l) wrt) (List.tl alist) ;;