我的任务是:编写一个读取整数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]
但我不确定如何将值收集到列表中。
这是一项学校作业,所以我很欣赏正确的方向。
答案 0 :(得分:1)
轻推:你找到指数,但你不能收集它们。
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中列表的元素,这两个子句中只有一个是真的。
编辑:
另一种方法是使用findall
和nth1
:
indices(List, E, Is) :-
findall(N, nth1(N, List, E), Is).