Wenn Sie Zugriff auf nth0/3
oder nth1/3
haben, kann es verwendet werden, um „zu finden“ die Positionen eines Elements in einer Liste. Zum Beispiel:
?- List = [0,1,2,3,0,4,5,0], nth0(N, List, 0).
List = [0, 1, 2, 3, 0, 4, 5, 0],
N = 0 ;
N = 4 ;
N = 7.
Alles was Sie brauchen, ist alle Antworten in einer Liste zu sammeln. Verwenden Sie einfach bagof/3
:
?- List = [0,1,2,3,0,4,5,0], bagof(N, nth0(N, List, 0), Ns).
List = [0, 1, 2, 3, 0, 4, 5, 0],
Ns = [0, 4, 7].
definieren Sie können es als ein Prädikat wie folgt aus:
positions(X, L, R) :-
bagof(N, nth0(N, L, X), R).
Im Gegensatz zu den anderen Lösungen, können Sie diese verwenden, um die Positionen von jedem Element in der Liste zu finden auf Rückzieher:
?- positions(X, [0,1,2,0,2], R).
X = 0,
R = [0, 3] ;
X = 1,
R = [1] ;
X = 2,
R = [2, 4].
Wenn Sie nicht wollen, nth0/3
zu verwenden, gehen Sie einfach weiter und Ihre eigene definiti verwenden von pos/3
, stellen Sie einfach sicher, dass es tut, was es sollte. Siehe zum Beispiel die answer to the third of the 99 Prolog problems: es ist eine geradlinige Implementierung von . Sie müssen nur die 1 zu 0 ändern, um 0-basierte Indizes zu erhalten.Es ist fast identisch mit dem, was Sie bereits hatten (wie in Ihrer Frage gezeigt).
Haben Sie schon etwas probiert? – dasblinkenlight
Nun, ich habe das, aber es gibt keine Liste zurück, es gibt mir nur einzelne Ergebnisse: 'pos (X, [X | _], 0). pos (_, [], _): - !, Fehlgeschlagen. pos (X, [_ | R], Po): - pos (X, R, Pos1), Pos sind Pos1 + 1.' '- po (0, [1,2, 0,1,0], R). R = 2; R = 4; false.' – Pablisky
Das ist perfekt! Bei SO geht es darum, Code zu posten, der noch nicht funktioniert. – dasblinkenlight