Adloun

Trouver un modèle

Exercice · OCaml (option informatique), chapitre 17 — Logique propositionnelle

É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 \textsc{SAT} : explorer, et reconstruire la solution le long des choix réussis (chapitre 11).

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.