使用prolog将元素添加到List中

时间:2012-12-05 20:38:29

标签: prolog

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

一样
?- 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.

如果有人可以帮助我解决这个问题,那将会非常感激... 谢谢。

2 个答案:

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