我遇到了这个问题 我想列出一个目标位置列表,就像我输入
一样?- 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.
如果有人可以帮助我解决这个问题,那将会非常感激... 谢谢。
答案 0 :(得分:1)
您为indexOf
提供了两个规则,一个处理列表的 head ,忽略尾部,另一个处理 tail ,忽略头部。这会为您的查询提供两种不同的解决方案,如图所示。
谓词nth0
可用于将位置映射到列表中的项目。
使用它的最简单方法是使用findall
:
extractIndices(List , Item, Indices) :-
findall(N, nth0(N, List, Item), Indices).
您还可以使用indexOf
之类的内容制作自己的解决方案。但是你可能想要提供两个不同的规则:一个用于基本情况(通常是一个空列表),一个用于解决头部的递归情况,然后调用indexOf
再次在尾巴上。
答案 1 :(得分: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].