如何在列表列表中实现与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).
它只会给我错误,因为它只是在第一个内部列表上给出结果。
答案 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的解决方案更好,因为它为您提供了包含该元素的列表的索引,如果您不需要它,您可以忽略它。