如何将索引存储在Prolog列表中的数字?

时间:2016-10-10 18:05:07

标签: indexing prolog

例如:
positions (X, L, R):- .

其中:

  1. X是我要找的号码。
  2. L是许多数字的列表。
  3. R是存储X出现的索引的列表
  4. 我得到了这个,但它没有“返回”一个列表,它只是给我个人结果:

    pos(X,[X|_],0).
    pos(,[],):- !,fail. pos(X,[_|R],Pos):- pos(X,R,Pos1), Pos is Pos1+1. 
    

3 个答案:

答案 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).

Demo.

positions/3子句用于将当前索引I添加到positions/4规则。

positions/4的三个条款如下:

  • 第一个base,子句用于空列表
  • 第二个子句用于将初始元素与X
  • 匹配
  • 第三个条款是在没有匹配时继续下一个元素(即X \= Y)。

答案 2 :(得分:0)

如果您可以访问nth0/3nth1/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的索引。它几乎与您已有的相同(如您的问题所示)。