2. Résolution (premier ordre) 3. Prolog : coloriage de cartes

Transcription

2. Résolution (premier ordre) 3. Prolog : coloriage de cartes
2. Résolution (premier ordre)
a. Mettre sous forme clausale et réfuter par Résolution l’ensemble de formules suivant :
(1)
∀x (P(x) → ∃y R(y,y))
(2)
∃x Q(x)
(3)
∀x (Q(x) → P(x))
(4)
(∃x Q(x)) → ¬ ∃y R(y,y))
Vous présenterez la réfutation sous forme d’arbre, en indiquant les unificateurs utilisés, selon
le format vu en cours.
b. Expliquez comment, à partir du résultat du a, on peut déduire la relation de conséquence
logique suivante :
{∀x (P(x) → ∃y R(y,y)), ∃x Q(x), ∀x (Q(x) → P(x)) } |= ∃y R(y,y)
c. Par un raisonnement « intuitif », retrouvez et justifiez cette relation de conséquence.
3. Prolog : coloriage de cartes
NB. Veillez à bien exposer en quelques lignes le principe de vos programmes.
Le but est de colorier un carte avec un ensemble de couleurs données de manière à ce que
deux pays adjacents ne soient pas de la même couleur. (On sait que 4 couleurs suffisent
toujours). La figure ci-dessous donne une carte « schématique » à 5 pays (a,b,c,d,e,f) et un
coloriage à 4 couleurs.
a : bleu
b : rouge c : vert
e : jaune
d : rouge
f : bleu
On représente l’ensemble de ces données à l’aide de prédicats suivants :
% pays(L) :- L est la liste des pays considérés
% voisin(P,Q) :- le pays P est voisin du pays Q
% couleurs(L) :- L est la liste des couleurs possibles
1. Définir les clauses permettant de représenter les données de l’exemple ci-dessus (prédaicats
pays, voisins, couleurs)
2. Ecrire un prédicat vérifiant que chaque pays possède un voisin (autrement dit : pas de pays
isolé), et que tous les pays notés comme ayant un voisin sont bien dans la liste des pays.
NB. Il existe une solution concise et élégante avec le not.
3. On représente un « coloriage » par une liste de couples (Pays,Couleur). Ecrire un
programme qui affecte une couleur à chaque pays, en respectant la contrainte sur les
voisinages.
Exemple :
?- colorieCarte(L).
L = [ (a, jaune), (b, bleu), (c, vert), (d, rouge), (e, rouge), (f, bleu)] ;
NB. L’expression (a,b) est admis par Prolog et représente le couple de termes, a et b.
4. On veut maintenant colorier la carte avec un minimum de couleurs (parmi les couleurs
données).
Par exemple pour la carte ci-dessus privée de la région a 3 couleurs suffisent.
Modifier le programme pour trouver un coloriage avec un minimum de couleurs.
SOLUTION
2. Résolution
Forme clausale :
C1
¬P(x) ∨ R(f(x),f(x))
C2
Q(a)
C3
¬Q(x) ∨ P(x)
C4
¬Q(x) ∨ ¬R(y,y)
Réfutation
Q(a) ¬Q(x) ∨ P(x) {x/a}
P(a)
¬P(x) ∨ R(f(x),f(x)) {x/a}
Q(a)
R(f(a),f(a)
¬Q(x) ∨ ¬R(y,y) {x/a}
¬R(y,y) {y/f(a)}
[]
On a donc, {1,2,3,4} insat. Donc : 1,2,3 |= ¬4.
¬4 = ¬[(∃x Q(x)) → ¬ ∃y R(y,y))] ⇔ [∃x Q(x) ∧ ∃y R(y,y)]
Donc encore : 1,2,3 |= ∃y R(y,y)
Intuitivement : D’après (2) il existe un élément satisfaisant Q. Appelons a cet élément.
D’après (3), les éléments satisfaisant Q satisfont P. Donc P(a) et vraie. De (1) on peut déduire
l’instance par a : P(a) → ∃y R(y,y). Comme P(a) est vraie, nous avons bien ∃y R(y,y).
4. Prolog
% Question 1
pays([a,b,c,d,e,f]).
couleurs([bleu,rouge,vert,jaune]).
% couleurs([bleu,rouge,vert]).
% Voisins comme graphe dirigé
voisin(a,b).
voisin(a,c).
voisin(a,d).
voisin(b,c).
voisin(b,e).
voisin(c,d).
voisin(c,e).
voisin(c,f).
voisin(d,f).
%voisin(e,f). % => 3 couleurs suffisent
% voisin(e,g).
% Question 2
correct :pays(Ps),
not((member(P,Ps), not(voisin2(P,_)))), % pas de pays sans voisin
not((voisin2(P,_), not(member(P,Ps)))).
voisin2(P,Q) :- voisin(P,Q);voisin(Q,P).
% Question 3
colorieCarte(L) :pays(Ps),
couleurs(Cs),
colorie(Ps,Cs,L).
colorie([P|Ps],Cs,[(P,C)|L]) :colorie(Ps,Cs,L),
member(C,Cs),
permis(P,C,L).
colorie([],_,[]).
permis(P,C,L) :- not((voisin2(P,Q),member((Q,C),L))).
% Question 4
minCouleurs(L) :pays(Ps),
couleurs(Cs),
prefixe(Cs1,Cs),
colorie(Ps,Cs1,L).
prefixe(L1,L) :- append(L1,_,L).

Documents pareils