1/ Pour les formules logiques, normalement je pense qu´une calculatrice de calcul formel type ti 89 peut opérer ce genre de simplification, sinon voici un extrait d´un TP caml que j´ai eu... j´aurais voulu le paster sur un wall mais j´en trouve pas... tant pis pour le formatage et l´indentation -_-
(* Type formule *)
type formule = Const of bool
|Var of string
|Non of formule
|Et of formule*formule
|Ou of formule*formule
;;
(* Constantes et opérateurs *)
let Vrai = Const true and Faux = Const false;;
let prefix + p q = Ou (p,q);;
let prefix * p q = Et (p,q);;
let prefix ++ p q = (p*(Non q))+((Non p)*q);;
let prefix => p q = (Non p) + q;;
let prefix <=> p q = p*q + (Non p)*(Non q);;
(* déclaration des variables utilisées dans les formules logiques *)
let p = Var "p" and q = Var "q" and r = Var "r";;
(* distribution de véritée *)
let l=[("p", true);("q", true);("r", true)];;
(* simplifie la formule logique spécifiée *)
let rec simplifie f = match f with
| Const _ -> f
| Var _ -> f
| Non g -> ( let h= simplifie g in
match h with
| Const true -> Faux
| Const false -> Vrai
| Non u -> u
| _ -> Non (h) )
| Et(g,h) -> ( let g´=simplifie g and h´=simplifie h in
match (g´,h´) with
| (Const true, v) -> h´
| (Const false, v) -> Faux
| (u, Const true) -> g´
| (u, Const false) -> Faux
| (u,v) -> Et (g´,h´) )
| Ou(g,h) -> ( let g´=simplifie g and h´=simplifie h in
match (g´,h´) with
| (Const true, v) -> Vrai
| (Const false, v) -> h´
| (u, Const true) -> Vrai
| (u, Const false) -> g´
| (u,v) -> Ou(g,h) )
;;
(* évalue la formule logique spécifiée *)
let rec evalue f l = match f with
| Const x -> x
| Var p -> assoc p l
| Non p -> not (evalue p l)
| Et(p,q) -> (evalue p l) & (evalue q l)
| Ou(p,q) -> (evalue p l) or (evalue q l)
;;
(* formules logiques de test *)
let f = (p+q)++((Non q)*r);;
let g = (p=>q)=>(q=>((Non p)*r));;
let h = (p=>q)<=>((Non q)=>(Non p));;
2/ Il me semble qu´il est payant, mais je n´en suis pas sûr.
Jette un oeil à http://www.compilers.net peut être...