2009-11-08 6 views

Répondre

7

Utilisez une boucle axée sur l'échec:

test(X, 1, 4, 5), writeln(X), fail ; true. 

ou même d'une manière plus lisible, en utilisant forall/2:

forall(test(X, 1, 4, 5), writeln(X)). 

Il n'y a pas besoin de construire une liste de toutes les solutions (c'est ce que findall/3 est pour), sauf si vous avez besoin de cette liste pour quelque chose d'autre que de l'imprimer.

Si votre Prolog n'a pas forall/2 puis la mettre en œuvre vous-même de la manière suivante:

forall(A, B) :- 
    \+ (call(A), \+ call(B)). 
+0

forall ne semble pas exister dans GNU-Prolog, mais la boucle pilotée par les défaillances fonctionne correctement. Merci. – Kutzi

+0

@Kutzi: J'ai ajouté l'implémentation de forall/2 – Kaarel

2

Voulez-vous dire automatiquement? Vous pouvez émettre une commande backtrack avec; et il fait marche arrière et obtient la prochaine valeur. Mais si vous voulez imprimer plusieurs résultats dans le programme, vous utilisez la récursivité. Donnez plus de détails sur ce que vous essayez de faire.

MISE À JOUR: Vous ne pouvez pas émettre;. Vous devez écrire une procédure pour "faire une boucle" à travers les résultats, ainsi vous pouvez vouloir les résultats dans une liste.

printList([]) :- write(""). 
    printList([H|T]) :- write(H), printList(T). 
+0

Je veux l'application à délivrer à; commande de boucler si les résultats. –

+0

L'exemple contient une erreur de syntaxe: remplacez ';' avec '.'. Mais même après avoir corrigé cette erreur, le programme ne fonctionne pas correctement, par ex. "? - printList ([a, b, c])." sorties "abc []" où le "[]" n'est probablement pas recherché. – Kaarel

2

Si vous voulez obtenir toutes les solutions pour une variable dans un appel sans avoir à appuyer continuellement sur ';' pour la solution suivante, vous pouvez utiliser le prédicat findall comme ceci:

findall(X,test(X,1,4,5),L). 

Le premier argument spécifie quelle variable vous souhaitez collecter toutes les valeurs, le second argument est le prédicat et ses arguments que vous voulez pour trouver toutes les solutions pour, et le troisième argument sera une liste de toutes les valeurs de X à partir de toutes les solutions. Donc à partir de là, vous pouvez simplement imprimer les valeurs de L si vous êtes satisfait du formatage du résultat sous forme de liste. Sinon, vous aurez besoin d'écrire un prédicat récursif pour imprimer le contenu de L comme vous le souhaitez, comme le souligne Vincent Ramdhanie.

Questions connexes