2012-07-10 9 views
2

목록에서 지정된 요소의 모든 색인을 찾아서 목록으로 반환해야합니다. 그래서 예를 들면 :Prolog - IndexofElement

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

내 아이디어입니다 :이 추적하면

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). 

나는 모든 위치가 (마지막 단계 이전 단계)에있는 목록을 가져옵니다. 그러나 마지막 단계에서 그는 어떻게 든 그것을 바꾸고 진실을 되 돌린다.

답변

2

귀하의 문제는 대신 Rs를 사용하면 P를 사용하는 위치의 목록을 반환하는 것입니다. positions/3에 경고해야 할 보풀 경고 (싱글 톤 변수 P와 R)가 있어야합니다. 당신이 이상 요구하는 경우에만 필요, E는 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

첫 번째 줄에서 실수를 한 것입니다. positions(E, L, 0, Rs)을 호출하고 있지만 마지막 매개 변수는 절의 헤드와 동일한 이름을 가진 마지막 매개 변수와의 바인딩을 만들기 위해 P이어야합니다. 그래서 첫 번째 줄은 다음과 같아야합니다

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

gusbro의 관찰 : 당신이 E를 확인해야합니다 positions/4의 세 번째 절에 또한

는 X와 다른 두 경우 모두 올바른 솔루션 일 것입니다. 수정 작업을하거나하지 않고 코드를 실행하고 어떤 일이 일어나는지보십시오. – Mihai