J'ai un prédicat appelé araignée avec le code suivant:prédicat Prolog retourne un seul résultat
person(ada).
person(beda).
person(calle).
knows(ada,beda).
knows(ada,calle).
knows(beda,calle).
% Returns true for arguments X and Y if either knows(X,Y) or knows(Y,X) is true.
xknowsy(X,Y) :- knows(X,Y).
xknowsy(X,Y) :- knows(Y,X).
subsetsof([],[]).
subsetsof([A|B],[A|D]) :- subsetsof(B,D).
subsetsof([A|B],D) :- subsetsof(B,D).
dontknowlist([]).
dontknowlist([A]).
dontknowlist([A,B|C]) :- not(xknowsy(A,B)), dontknowlist([A|C]), dontknowlist([B|C]).
listknowsconspirator([],C).
listknowsconspirator([A|B],C) :- knowssomeone(A,C), listknowsconspirator(B,C).
knowssomeone(A,[]).
knowssomeone(A,[B|C]) :- xknowsy(A,B).
knowssomeone(A,[B,C|D]) :- knowssomeone(A,[C|D]).
spider(X) :- person(X), findall(A,xknowsy(X,A),B), subsetsof(B,C), dontknowlist(C),!,
findall(E,person(E),F), removespider(F,X,G), removeconspirators(G,C,L),!,
listknowsconspirator(L,C),!.
removespider([],X,L) :- L = [].
removespider([A|B],X,L) :- A = X, L = B.
removespider([A|B],X,L) :- not(A = X), removespider(B,X,M), L = [A|M].
removeconspirators([],D,L) :- L = [].
removeconspirators(E,[],L) :- L = E.
removeconspirators([A],[B],L) :- A = B, L = [].
removeconspirators([A],[B],L) :- not(A = B), L = [A].
removeconspirators([A,B|C],[D],L) :- A = D, L = [B|C].
removeconspirators([A,B|C],[D],L) :- not(A = D), removeconspirators([B|C],[D],M), L = [A|M].
removeconspirators([A|B],[S,T|U],L) :- removeconspirators([A|B],[S],M),
removeconspirators(M,[T|U],N), L = N.
appels à l'araignée (ada), araignée (Beda) et araignée (rue) tout retour séparément vrai. Mais quand j'appelle spider (X), je n'ai pas les trois solutions pour X. Je viens d'obtenir la première solution, c'est-à-dire X = ada. Je ne comprends pas pourquoi parce que personne (X) s'assure que j'obtiens les trois valeurs X possibles pour exécuter le reste du prédicat. Appeler spider (X) en mode trace ne semble pas révéler d'explications évidentes, mais mon compilateur SWI-Prolog semble simplement ignorer les autres cas. Pourquoi les trois solutions ne sont-elles pas imprimées lors de l'appel de spider (X)?
Vous pouvez également utiliser ['setof/3'] (http://www.swi-prolog.org/pldoc/doc_for?object=setof/3) au lieu de' findall/3' + 'sort/2' . – user3389669