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

时间:2014-10-06 18:13:25

标签: prolog

我的任务是:编写一个读取整数x的程序和一个整数列表L;然后找到x的所有位置列表到L,并返回结果列表。例如,对于x=2L=[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]

但我不确定如何将值收集到列表中。

这是一项学校作业,所以我很欣赏正确的方向。

1 个答案:

答案 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中列表的元素,这两个子句中只有一个是真的。

编辑:

另一种方法是使用findallnth1

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