0

我遇到了这个问题我想列出目标位置,就像我输入

?- extractIndices([5,6,7,8,9,5,6],6,List).

它应该返回

List = [1,6]

这给出了该列表中 6 的所有位置。我写了这样的代码:

extractIndices(List , Item, [Index | Indecis]) :- 
    indexOf(List , Item, Index).

indexOf([Item | _], Item, 0).
indexOf([_ |Tail], Item, Index):-
    indexOf(Tail, Item, Index1),
    Index is Index1+1.

这给了我

?- extractIndices([5,6,7,8,9,5,6],6,L).
L = [1|_G2870] ;
L = [6|_G2870] ;
false.

如果有人能帮我解决这个问题,将非常感激......谢谢。

4

2 回答 2

1

您为 提供了两条规则indexOf,一条处理列表的头部,忽略尾部,另一条处理尾部,忽略头部。这会为您的查询产生两种不同的解决方案,如图所示。

谓词nth0可用于将位置映射到列表中的项目。

使用它的最简单方法是findall

extractIndices(List , Item, Indices) :-
     findall(N, nth0(N, List, Item), Indices).

您还可以使用类似indexOf. 但是您可能想要提供两种不同的规则:一种用于基本情况(通常是一个空列表),另一种用于解决头部问题的递归情况,然后indexOf在尾部再次调用。

于 2012-12-05T20:54:30.410 回答
1

我将使用与 Edmund 相同的代码(即 findall + nth0),但为了学习目的,对您的代码进行更正是值得展示的:

extractIndices(List , Item, Indices) :- 
    indexOf(List, Item, 0, Indices).

indexOf([X|Items], Item, I, Is) :-
    ( X == Item -> Is = [I|Rs] ; Is = Rs ),
    J is I + 1,
    indexOf(Items, Item, J, Rs).
indexOf([], _, _, []).

测试:

?- extractIndices([5,6,7,8,9,5,6],6,L).
L = [1, 6].
于 2012-12-05T21:06:00.747 回答