例如:
positions (X, L, R):-
.
其中:
我得到了这个,但它没有“返回”一个列表,它只是给我个人结果:
pos(X,[X|_],0).
pos(,[],):- !,fail. pos(X,[_|R],Pos):- pos(X,R,Pos1), Pos is Pos1+1.
答案 0 :(得分:0)
我认为你需要一个索引和creare R
来累积匹配的索引。
以示例
positionH(_, _, [], []).
positionH(I, X, [Y | Tl], Tr):-
Y \= X,
Ip1 is I+1,
positionH(Ip1, X, Tl, Tr).
positionH(I, X, [X | Tl], [I | Tr]):-
Ip1 is I+1,
positionH(Ip1, X, Tl, Tr).
position(X, L, R):-
positionH(0, X, L, R).
答案 1 :(得分:0)
您可以像这样修改代码:
positions(X, L, R) :- positions(X, L, R, 1).
positions(_, [], [], _).
positions(X, [X|T], [I|R], I) :- plus(I, 1, N), positions(X, T, R, N).
positions(X, [Y|T], R, I) :- X \= Y, plus(I, 1, N), positions(X, T, R, N).
positions/3
子句用于将当前索引I
添加到positions/4
规则。
positions/4
的三个条款如下:
X
X \= Y
)。答案 2 :(得分:0)
如果您可以访问nth0/3
或nth1/3
,则可以使用它来查找"列表中元素的位置。例如:
?- 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.
您只需要在列表中收集所有答案。只需使用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].
您可以将其定义为这样的谓词:
positions(X, L, R) :-
bagof(N, nth0(N, L, X), R).
与其他解决方案不同,您可以使用此方法在回溯时查找列表中任何元素的位置:
?- positions(X, [0,1,2,0,2], R).
X = 0,
R = [0, 3] ;
X = 1,
R = [1] ;
X = 2,
R = [2, 4].
如果您不想使用nth0/3
,请继续使用您自己的pos/3
定义,只需确保它能做到应有的效果。例如,请参阅answer to the third of the 99 Prolog problems:它是nth1/3
的直接实现。您只需将1更改为0即可获得基于0的索引。它几乎与您已有的相同(如您的问题所示)。