(* Copyright (C) 2000, HELM Team. * * This file is part of HELM, an Hypertextual, Electronic * Library of Mathematics, developed at the Computer Science * Department, University of Bologna, Italy. * * HELM is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * HELM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HELM; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * For details, see the HELM World-Wide-Web page, * http://cs.unibo.it/helm/. *) (* * 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) -> apply_func f (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 | MQTheory -> "THEORY" ^ rvar | MQTitle -> "TITLE" ^ rvar | MQContributor -> "contributor" ^ rvar | MQCreator -> "creator" ^ rvar | MQPublisher -> "publisher" ^ rvar | MQSubject -> "subject" ^ rvar | MQDescription -> "description" ^ rvar | MQDate -> "date" ^ rvar | MQType -> "type" ^ rvar | MQFormat -> "format" ^ rvar | MQIdentifier -> "identifier" ^ rvar | MQLanguage -> "language" ^ rvar | MQRelation -> "relation" ^ rvar | MQSource -> "source" ^ rvar | MQCoverage -> "coverage" ^ rvar | MQRights -> "rights" ^ rvar | MQInstitution -> "institution" ^ rvar | MQContact -> "contact" ^ rvar | MQFirstVersion -> "firstversion" ^ rvar | MQModified -> "modified" ^ 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 | MQTheory -> "THEORY" ^ rvar | MQTitle -> "TITLE" ^ rvar | MQContributor -> "contributor" ^ rvar | MQCreator -> "creator" ^ rvar | MQPublisher -> "publisher" ^ rvar | MQSubject -> "subject" ^ rvar | MQDescription -> "description" ^ rvar | MQDate -> "date" ^ rvar | MQType -> "type" ^ rvar | MQFormat -> "format" ^ rvar | MQIdentifier -> "identifier" ^ rvar | MQLanguage -> "language" ^ rvar | MQRelation -> "relation" ^ rvar | MQSource -> "source" ^ rvar | MQCoverage -> "coverage" ^ rvar | MQRights -> "rights" ^ rvar | MQInstitution -> "institution" ^ rvar | MQContact -> "contact" ^ rvar | MQFirstVersion -> "firstversion" ^ rvar | MQModified -> "modified" ^ 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) ;;