Bonjour,
j'ai le type formule suivant:
et j'essaye d'écrire une fonction qui prend une formule en argument, et renvoie sa forme normale comme résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 type formula= |Var of string |Neg of formula |And of formula*formula |Or of formula*formula;;
La forme normale d'une formule de la forme Neg (Neg x) est x
et de Neg (And (x,y)) est Or (Neg x, Neg y)
et de Neg (Or (x,y)) est And (Neg x, Neg y)
j'ai écrit la fonction suivante:
ceci me renvoie un warning que le pattern matching n'est pas exhaustif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 let forme_normale=function |Var "x"->Var "x" (*pour ne plus réduire ce cas*) |Neg (Neg x)->x |Neg (And (x,y))->Or (Neg x, Neg y) |Neg (Or (x,y))->And (Neg x, Neg y) ;;
mais la fonction est acceptée
et un test me renvoit la formule suivante:
comment faire pour que Neg (Neg (Var "x")) se réduise à Var "x" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 # forme_normale (Neg(And(Neg(Var "x"), Or(Var "y", Neg (Var "z")))));; - : formula = Or (Neg (Neg (Var "x")), Neg (Or (Var "y", Neg (Var "z"))))
j'ai essayé de rendre la fonction récursive, et d'appeler la fonction à nouveau dans le cas où le résultat est une formule
comme :
Neg (Neg x)-> forme_normale x
mais cela n'a pas marché
est-ce que qqn peut m'aider à le faire
merci
Partager