Compte tenu des faits suivants:Prolog (Sicstus) - non membres et les questions SETOF
route(TubeLine, ListOfStations).
route(green, [a,b,c,d,e,f]).
route(blue, [g,b,c,h,i,j]).
...
Je suis obligé de trouver toutes les paires de tubes Les lignes qui n'ont pas de stations en commun, produisant les éléments suivants:
| ?- disjointed_lines(Ls).
Ls = [(yellow,blue),(yellow,green),(yellow,red),(yellow,silver)] ? ;
no
je suis venu avec la réponse ci-dessous, mais il ne me donne pas seulement mauvaise réponse, mais il ne s'applique pas mon X^état - ie il encore imprime les résultats par membre des stations distingue:
disjointed_lines(Ls) :-
route(W, Stations1),
route(Z, Stations2),
setof(
(W,Z),X^
(member(X, Stations1),nonmember(X, Stations2)),
Ls).
C'est la sortie que la définition produit:
| ?- disjointed_lines(L).
L = [(green,green)] ? ;
L = [(green,blue)] ? ;
L = [(green,silver)] ? ;
...
Je crois que ma logique relative à l'adhésion est incorrecte, mais je ne peux pas comprendre ce qui est faux. Quelqu'un peut-il voir où je vais échouer? J'ai également lu Learn Prolog Now chapitre 11 sur la collecte des résultats comme suggéré here, mais il semble que je suis toujours incapable d'utiliser correctement l'opérateur ^. Toute aide serait appréciée!
MISE À JOUR:
Comme suggéré par l'utilisateur CapelliC, j'ai changé le code dans les éléments suivants:
disjointed_lines(Ls) :-
setof(
(W,Z),(Stations1, Stations2)^
((route(W, Stations1),
route(Z, Stations2),notMembers(Stations1,Stations2))),
Ls).
notMembers([],_).
notMembers([H|T],L):- notMembers(T,L), nonmember(H,L).
qui suit, cependant, me donne des copies de (X, Y) et (Y, X), mais l'étape suivante consistera à supprimer ces éléments dans une règle distincte. Merci pour l'aide!
Merci beaucoup! J'ai ajouté la définition suivante pour résoudre le problème suite à votre suggestion: notMembers ([], _). notMembers ([H | T], L): - notMembers (T, L), non membre (H, L). La solution complète me donne des doublons de [(X, Y), (Y, X)] donc la suppression de ces doublons serait la dernière étape pour moi :) – qwerty
Pour supprimer les doublons, vous pouvez utiliser 'W @