2

我必须在列表中找到给定元素的所有索引并将其作为列表返回。例如:

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

当我跟踪这个时,我得到一个列表,其中每个位置都在其中(在最后一步之前的步骤中)。但是在最后的步骤中,他以某种方式对其进行了更改并返回了真值。

4

2 回答 2

2

你在第一行犯了一个小错误。您正在调用positions(E, L, 0, Rs),但最后一个参数应该是P, 以便与从子句开头同名的最后一个参数进行绑定。所以第一行应该是这样的:

positions(E, L, P) :- positions(E, L, 0, P).
于 2012-07-10T16:10:00.960 回答
2

您的问题是,而不是使用Rs来返回您正在使用的职位列表P。您应该已经看到了一个 lint 警告(单例变量 P 和 Rs),positions/3其中应该警告过您这一点。

此外,在您的第三个子句中,positions/4您应该检查 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 ).
于 2012-07-10T16:10:26.457 回答