2012-05-23 2 views
2

J'étudie ce code, et il y a un + dans la fonction couleur dont je n'ai aucune idée. Je suis très confus par cela et je suis fondamentalement bloqué sur ceci parce que je ne peux pas comprendre ce qu'il fait.Que fait le + dans Prolog?

/* prolog tutorial 2.9 Map coloring redux */ 
adjacent(X,Y,Map) :- member([X,Y],Map) ; member([Y,X],Map). 
find_regions([],R,R). 
find_regions([[X,Y]|S], R,A) :- 
(member(X,R) -> 
    (member(Y,R) -> find_regions(S,R,A) ; find_regions(S,[Y|R],A)) ; 
    (member(Y,R) -> find_regions(S,[X|R],A) ; find_regions(S,[X,Y|R],A))). 

color(Map,Colors,Coloring) :- 
    find_regions(Map,[],Regions), 
    color_all(Regions,Colors,Coloring), 
    \+ conflict(Map,Coloring). 
color_all([R|Rs],Colors,[[R,C]|A]) :- 
    member(C,Colors), 
    color_all(Rs,Colors,A). 
color_all([],_,[]). 


conflict(Map,Coloring) :- 
    member([R1,C],Coloring), 
    member([R2,C],Coloring), 
    adjacent(R1,R2,Map). 

map1([[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[3,4],[4,5]]). 

Répondre

3

Il est une négation, voir here pour une explication détaillée avec des exemples. Vous pouvez simplement le lire comme équivalent à «non», ou plus exactement, «non prouvable».

+0

Alors pourriez-vous m'expliquer plus précisément ce qu'il fait sur ce morceau de code? Ce code est censé résoudre le problème de coloration du graphique, où 2 nœuds adjacents ne peuvent pas avoir la même couleur. Donc ce que les couleurs font, c'est d'abord d'obtenir une liste des nœuds, puis d'attribuer une couleur à chacun en s'assurant qu'il n'y a pas de conflit entre les couleurs. Quel est le but de/+ conflit sur ce code alors? –

+0

'conflict (Map, Coloring)' est ** true ** s'il y a un conflit dans la couleur. Vous ne voulez pas de conflits, donc 'color()' a besoin de 'conflict()' pour échouer. Comme vous l'avez dit, il s'assure qu'il n'y a pas de conflit. Si vous omettez le '\ +', il s'assurera que ** est ** un conflit. – Junuxx

+0

Donc, fondamentalement, cela signifie que le code ne sera résolu que si la coloration n'est pas (true), donc fausse? Je peux être confus ici mais je pense qu'il y a des itérations qui se passent mais je ne peux pas voir où et cela me perturbe. –

2

« Dans la norme Prolog l'opérateur + signifie la négation comme un échec »

Il ist un bon tutoriel trouvé here.