2010-10-15 4 views
0

Dire que j'ai le morceau de code suivant:Comment obtenir la liste des valeurs pendant le retour en arrière de Prolog?

edge(a, b). 
edge(a, c). 
edge(a, d). 

Maintenant, quand je fais

neighbors(V, N) :- edge(V, N), writeln(N), fail. 

Je peux obtenir une liste des voisins imprimés sur la console. Mais comment puis-je l'obtenir comme une liste de résultats? Quelque chose comme

neighbors(V, Vs) :- 
    edge(V, N), 
    not(member(N, Vs)), 
    neighbors(V, [N|Vs]). 

(la pièce ci-dessus ne fonctionne pas vraiment en raison de la façon dont est gérée member. Toute suggestion s'il vous plaît?

Répondre

1

Vous pouvez utiliser bagof/3 pour créer une liste de vos vertices qui répondent à l'objectif, « Vs est tout N qui est un bord de V. »

neighbors(V, Vs) :- bagof(N, edge(V, N), Vs). 

neighbors(a, Vs). % Vs = [b, c, d]. 
3

en savoir plus sur findall, bagof et setof dans le manuel de votre application préférée Prolog, ou par exemple la section « 11 .2 Collecter des solutions "dans Learn Prolog Now! (Malheureusement, il est difficile de lier directement ces ressources.)

Questions connexes