2012-07-10 3 views
2

Je dois trouver tous les index d'un élément donné dans une liste et le renvoyer sous forme de liste. Ainsi, par exemple:Prolog - IndexofElement

?- indexList(a,[a,b,c,a,b],Rs). 
Rs = [0,3] 

Mon idée est:

positions(E, L, P) :- positions(E, L, 0, Rs). 
positions(E, [], _, []). 
positions(E, [E|Xs], P, [P|PT]) :- P1 is P + 1, positions(E, Xs, P1, PT). 
positions(E, [X|Xs], P, PT) :- P1 is P+1, positions(E, Xs, P1, PT). 

Quand je trace ce que j'obtenir une liste dans laquelle chaque position est (à l'étape avant la dernière étape). Mais dans les dernières étapes, il change d'une manière ou d'une autre et revient juste vrai.

Répondre

2

Votre problème est qu'au lieu d'utiliser Rs pour retourner la liste des positions que vous utilisez P. Vous devriez avoir vu un avertissement de charpie (singleton variables P et Rs) dans positions/3 qui aurait dû vous en avertir.

En outre, dans la troisième clause de positions/4 vous devriez vérifier que E est différent de X:

positions(E, L, Rs) :- positions(E, L, 0, Rs). 
positions(E, [], _, []). 
positions(E, [E|Xs], P, [P|PT]) :- P1 is P + 1, positions(E, Xs, P1, PT). 
positions(E, [X|Xs], P, PT) :- E\=X, P1 is P+1, positions(E, Xs, P1, PT). 
2

Vous avez fait une petite erreur en première ligne. Vous appelez positions(E, L, 0, Rs), mais le dernier paramètre doit être P, afin de faire une liaison avec le dernier paramètre avec le même nom de l'en-tête de la clause. La première ligne devrait ressembler à ceci:

positions(E, L, P) :- positions(E, L, 0, P). 
+1

observation de gusbro, en ce qui concerne la vérification des E étant différent de X, est nécessaire que lorsque vous demandez plus juste la première solution, qui sera la bonne dans les deux cas. Essayez d'exécuter votre code avec et sans la modification et voir ce qui se passe. – Mihai