在Prolog的列表中查找值的所有位置

在Prolog的列表中查找值的所有位置,prolog,Prolog,我的任务是:编写一个程序,读取整数x和整数列表L;然后将x的所有位置列表定位到L,并返回结果列表。例如,对于x=2和L=[1,2,3,4,2,5,2,6]程序应返回列表R=[2,5,7] 到目前为止,我已经能够编写一个indexOf谓词: indexOf([E|_], E, 1). indexOf([_|T], E, I) :- indexOf(T, E, I2), I is I2 + 1. 但是,这不会“返回”列表。因此: indexOf([a,b,c,a,d], a, R). R = 1;

我的任务是:编写一个程序,读取整数
x
和整数列表
L
;然后将
x
的所有位置列表定位到
L
,并返回结果列表。例如,对于
x=2
L=[1,2,3,4,2,5,2,6]
程序应返回列表
R=[2,5,7]

到目前为止,我已经能够编写一个
indexOf
谓词:

indexOf([E|_], E, 1).
indexOf([_|T], E, I) :- indexOf(T, E, I2), I is I2 + 1.
但是,这不会“返回”列表。因此:

indexOf([a,b,c,a,d], a, R).
R = 1;
R = 4
我想这样做:

findAll([a,b,c,a,d], a, R).
R = [1, 4]
但我不知道如何将这些值收集到列表中


这是一项学校作业,所以我希望你能朝着正确的方向轻推一下。

轻推:你找到了索引,但你没有收集它们

indices(List, E, Is) :-
    indices_1(List, E, Is, 1).
对于空列表,索引列表为空, 元素也不重要

indices_1([], _, [], _).
如果元素类似于头,则收集索引

indices_1([E|Xs], E, [I|Is], I) :-
    I1 is I + 1,
    indices_1(Xs, E, Is, I1).
这需要另一个条款才能正常工作

编辑:

一种方法是:

indices_1([X|Xs], E, Is, I) :- dif(X, E),
    I1 is I + 1,
    indices_1(Xs, E, Is, I1).
在上一个子句中,列表的头和元素是统一的。在本条款中,它们明显不同。这意味着对于第一个arguemnt中的列表元素,这两个子句中只能有一个为true

编辑:

另一种方法是使用
findall
nth1

indices(List, E, Is) :-
    findall(N, nth1(N, List, E), Is).

谢谢我添加了这个子句:
索引u1([u124; T],E,Is,I):-I1是I+1,索引u1(T,E,Is,I1)。
您的解决方案只“返回”完整列表(例如
R=1,3]
),而我的解决方案“返回”它的每一步(例如
R=[1,3];R=[1];R=[3],R=[
。为什么不使用
dif/2
代替
)/2
?总有一些丑陋的案件潜伏着。