Adloun

n'est pas , et le programme s'en aperçoit

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 20 — Logique propositionnelle

Énoncé

On travaille avec le type formule du cours.

Corrigé

1. L'expression rend false — mesuré. L'égalité structurelle d'OCaml compare les arbres, et ceux de et diffèrent : leurs sous-arbres gauches ne portent pas la même variable. C'est le = syntaxique du cours.

2. L'équivalence est sémantique : elle se lit sur les valuations, pas sur les arbres.


(* Liste sans doublon des variables de f, par ordre de première rencontre.
   Complexité : O(|f| * v) avec v le nombre de variables distinctes. *)
let variables f =
  let rec aux vus = function
    | Var p -> if List.mem p vus then vus else p :: vus
    | Non g -> aux vus g
    | Et (a, b) | Ou (a, b) | Implique (a, b) -> aux (aux vus a) b
  in
  List.rev (aux [] f)

(* Toutes les valuations sur vs, comme listes d'association.
   Il y en a 2^|vs| : la liste est de taille exponentielle, par nature. *)
let rec valuations = function
  | [] -> [[]]
  | p :: reste ->
      List.concat_map (fun l -> [(p, true) :: l; (p, false) :: l])
                      (valuations reste)

(* Vrai si f et g ont la même valeur sous TOUTE valuation de leurs variables
   réunies. Précondition : aucune. *)
let equivalentes f g =
  let vs = List.sort_uniq compare (variables f @ variables g) in
  List.for_all
    (fun l ->
       let v p = try List.assoc p l with Not_found -> false in
       evalue v f = evalue v g)
    (valuations vs)

Complexité : valuations, chacune évaluée en multiplié par le coût de List.assoc, soit . Le total est — exponentiel, et le cours le dit : « tester l'équivalence coûte, dans l'état des connaissances, un temps exponentiel ».

La ligne à ne pas manquer est variables f @ variables g. Si l'on n'énumérait que les variables de f, on déclarerait et équivalentes dès que n'apparaît pas à gauche — une faute qui ne se voit sur aucun exemple symétrique.

3. Non, et l'écart peut être arbitraire : et sont équivalentes, de tailles et ; plus généralement et négations devant ont pour tailles et . De même et sont équivalentes (toutes deux tautologiques) sans partager la moindre variable. L'équivalence ne dit rien de la forme. C'est précisément ce qui rend la mise en forme normale utile — et dangereuse : elle change la taille sans changer le sens (exercice 20.10).

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.