info@mp2i-pv
Dans ce TP, on va manipuler des formules de logique propositionnelle
dans le but de les sérialiser pour répondre au problème SAT en
utilisant minisat.
Les variables propositionnelles sont représentées par des entiers strictement positifs.
On considère les types suivants :
type litteral = Pos of int | Neg of int (* entiers > 0 *)
type clause = litteral list (* clause *)
type cnf = clause list (* formule sous forme normale conjonctive *)
type valuation = bool array
(* La case i contient la valuation de la variable propositionnelle i+1 *)
Question 1. Écrire une fonction eval_clause : valuation -> clause
-> bool qui donne la valeur de vérité associée à une clause.
Question 2. Écrire une fonction eval_cnf : valuation -> cnf ->
bool qui donne la valeur de vérité associée à une formule de logique
propositionnelle sous forme normale conjonctive.
On s’intéresse maintenant au problème SAT, et on souhaite déléguer la
résolution de ce problème au programme minisat qui prend en argument
un fichier au format dimacs.
Le format dimacs (sans commentaires) suit le schéma suivant:
p cnf NOMBRE_DE_VARIABLES NOMBRE_DE_CLAUSES0exemple :
p cnf 5 3
1 -5 4 0
-1 5 3 4 0
-3 -4 0
Question 3. Écrire une fonction max_var : cnf -> int qui renvoie
l’entier maximal correspondant à une variable propositionnelle dans la
formule fournie en argument. Ne pas hésiter à écrire une fonction
intermédiaire pour avoir la réponse sur une clause.
Question 4. Écrire une fonction dimacs_of_cnf : string -> cnf ->
unit qui permet de sérialiser une formule sous forme normale
conjonctive au format dimacs.
Question 5. Tester la fonction précédente avec la formule
[[Pos 3; Pos 4; Neg 2]; [Neg 1; Pos 7; Pos 4]] et lancer minisat
sur le fichier obtenu : minisat fichier pour savoir si la formule
est satisfiable, minisat fichier reponse pour obtenir un modèle dans
le fichier reponse si la formule est satisfiable.
On va maintenant vérifier que le modèle donné par minisat en est
vraiment un.
Question 6. Écrire une fonction valuation_of_dimacs : string ->
valuation qui récupère une valuation dans un fichier généré par
minisat. Tester la réponse donnée par minisat à la question 5.
Question 7. Voici le curieux règlement d’un club britannique :
Question 8. Fabriquer son propre solveur sur learn-ocaml.
Question 9. Passer une formule sous forme normale conjonctive sur learn-ocaml.