type variables = char;;
type formule =
  | Var of variables
  | Non of formule
  | Implique of formule*formule
  | Equivaut of formule*formule
  | Et of formule list
  | Ou of formule list;;

let f = Implique (Et [Var 'p';Non (Var 'q')], Ou [Var 'p';Non (Var 'r')]);;

let exemple_de_contexte v = match v with
	|'p' -> true
	|'q' -> false
	|'r' -> false
	|_ -> true;;

let rec interpretation contexte formule = match formule with
	| Var v-> contexte v
	| Non f -> not (interpretation contexte f)
	| Implique (a,b) -> not (interpretation contexte a) || (interpretation contexte b)
	| Equivaut (a,b) -> not (interpretation contexte a) = (interpretation contexte b)
	| Et [] -> true
	| Et (h::t) -> (interpretation contexte h) && (interpretation contexte (Et t))
	| Ou [] -> false
	| Ou (h::t) -> (interpretation contexte h) || (interpretation contexte (Ou t));;

interpretation (exemple_de_contexte) (Et [Var 'q'; Non (Var 'r')]);;