按列表列表中的索引获取元素/元素的索引

时间:2013-11-19 22:19:46

标签: list loops indexing prolog

如何在列表列表中实现与nth0/3谓词类似的内容?

我希望能够告诉列表列表中元素的索引是什么,但只对内部列表索引感兴趣。我的意思是假设我有以下谓词indexOf([[a,b,c], [d,e,f], [g,h]], d, Index)并返回Index=0,因为d是内部列表的第一个元素。 indexOf([[a,b,c], [d,e,f], [g,h]], c, Index)应该返回Index=2,因为它是内部列表的第3个元素。

到目前为止,我所做的工作如下:

iterateOuter([]).

iterateOuter([[H|T]|LIST], Elem,Idx):-indexOf([H|T],Elem, Idx2),(Idx is Idx2;iterateOuter(LIST, Elem,Idx)).

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

indexOf([Element|_], Element, 0).

如果我调用iterateOuter([[a,b,c],[r,t,o]],c,Ind).

它会给我Ind = 2,这很好,但如果我说: iterateOuter([[a,b,c],[r,t,o]],r,Ind).

它只会给我错误,因为它只是在第一个内部列表上给出结果。

2 个答案:

答案 0 :(得分:1)

如果您已经nth0/3,那么您就拥有了所需的一切:

| ?- Xss = [[a,b,c],[r,t,o]], nth0(I, Xss, Xs), nth0(J, Xs, c).
I = 0,
J = 2,
Xs = [a,b,c],
Xss = [[a,b,c],[r,t,o]] ? ;
no

| ?- Xss = [[a,b,c],[r,t,o]], nth0(I, Xss, Xs), nth0(J, Xs, r).
I = 1,
J = 0,
Xs = [r,t,o],
Xss = [[a,b,c],[r,t,o]] ? ;
no

答案 1 :(得分:1)

由于您只对内部列表的索引感兴趣,因此您只需使用member/2而不是nth0/3来获取子列表,如False建议的那样。每个子列表都是Ls列表的成员,因此您只需要查找E是否是成员的第n个元素:

nth_of_a_sublist(N, Ls, E) :-
    member(L, Ls),
    nth0(N, L, E).

要检查所有列表上的nth_of_a_sublist,您可以使用findall/3

但我认为False的解决方案更好,因为它为您提供了包含该元素的列表的索引,如果您不需要它,您可以忽略它。