Functional Programming & Proofs


Trees and languages

  1. (parametric types)
    How to generalize boolean expressions into any kind of expressions with, for instance, float expressions used in fuzzy logic ?
type 't Exp = EVal of 't | ENot of ('t Exp) | EAnd of ('t Exp)*('t Exp);;

let e1 = EAnd (EVal True,ENot (EVal False));;
let e2 = EAnd (EVal 1.0,ENot (EVal 0.0));;
let e3 = EAnd (EVal (set [1;2;3]),ENot (EVal (set [3;4])));;

let rec eval fval fnot fand e = // fold/reduce
  match e with
  | EVal v         -> fval v
  | ENot be1       -> fnot (eval fval  fnot fand be1)
  | EAnd (be1,be2) -> fand (eval fval fnot fand be1) (eval fval fnot fand be2);;

eval id Not And e1;;
eval id ((-) 1.0) min e2;;
eval id (Set.difference (set [1..5])) Set.intersect e3;;

5 - 10