OCaml (option informatique) · Chapitre 17 · Exercice de TD
Trouver un modèle
Logique propositionnelle · niveau 3 (difficile)
Énoncé
Écrire trouve_modele f : bool array option qui renvoie une valuation satisfaisant f (Some v), ou None si f est insatisfiable.
Corrigé
let trouve_modele f =
let n = nb_variables f in
let v = Array.make n false in
let rec essaie i =
if i = n then (if evalue v f then Some (Array.copy v) else None)
else begin
v.(i) <- false;
match essaie (i + 1) with
| Some m -> Some m
| None -> v.(i) <- true; essaie (i + 1)
end
in
essaie 0
C'est satisfiable qui, au lieu de renvoyer true, rapporte la valuation trouvée — d'où le Array.copy v (chapitre 5) pour figer une copie indépendante de v (qui, mutable, continue d'évoluer). C'est le squelette d'un solveur SAT : explorer, et reconstruire la solution le long des choix réussis (chapitre 11).
Exercices semblables
- Tautologie corrigé
- Nombre de modèles corrigé
- Équivalence corrigé
- Implication et contraposée corrigé
- Substitution corrigé