1. (* We represent variables as strings containing a name *)
  2. type variable = string;
  3.  
  4. (* equality on variable names *)
  5. fun eqVar (v0:variable) (v1:variable) = (v0 = v1);
  6.  
  7. (* Formulas are either... *)
  8. datatype formula =
  9. True (* boolean True *)
  10. | False (* boolean False *)
  11. | Var of variable (* a simple variable *)
  12. | Not of formula (* a negation of a single formula *)
  13. | And of (formula list) (* a conjunction of several formulas *)
  14. | Or of (formula list) (* a disjunction of several formulas *)
  15. | Implies of formula * formula; (* an implication between one formula
  16. * and another *)
  17.  
  18. fun getValue ((variable, value)::taila) b =
  19. if variable = b then value
  20. else getValue (taila) b
  21. | getValue (_) b = raise valueNotFound b;
  22. getValue : (variable * 'a) list -> variable -> 'a;
  23.  
  24. fun evaluate a (Var part) = getValue a part
  25. | evaluate a (Not part) = not (evaluate a part)
  26. | evaluate a (Or part) = (evaluate a (hd part)) orelse (evaluate a (tl part))
  27. | evaluate a (And part) = (evaluate a (hd part)) andalso (evaluate a (tl part))
  28. | evaluate a (Implies part) = not(evaluate a (hd part)) orelse (evaluate a (tl part));