List 在Prolog中查找嵌套列表中元素的位置

List 在Prolog中查找嵌套列表中元素的位置,list,prolog,List,Prolog,例如: ?- position([[b,c,f],[a,d,g],[h,e]],c,P) P=1 ?- position([[b,c,f],[a,d,g],[h,e]],g,P) P=2 ?- position([[b,c,f],[a,d,g],[h,e]],b,P) P=0 我一直在研究nth0/3谓词,但我不确定这是否是正确的方法。任何指点都将不胜感激 我试图找到嵌套列表中每个元素的位置 position(LL,E,N):- nth1(N,LL,L), member(E,

例如:

?- position([[b,c,f],[a,d,g],[h,e]],c,P)
P=1
?- position([[b,c,f],[a,d,g],[h,e]],g,P)
P=2 
?- position([[b,c,f],[a,d,g],[h,e]],b,P)
P=0
我一直在研究nth0/3谓词,但我不确定这是否是正确的方法。任何指点都将不胜感激

我试图找到嵌套列表中每个元素的位置

position(LL,E,N):-
    nth1(N,LL,L),
    member(E,L).

?- position([[b,c,f],[a,d,g],[h,e]],c,P).
P = 1 ;
false.

?- position([[b,c,f],[a,d,g],[h,e]],g,P).
P = 2 ;
false.
假设允许您使用
member/2
nth1/3
,请参见下面的实现

谓词只是通过inputlist
LL
的所有成员
L
,通过
nth1/3
(并跟踪位置
N
),检查您搜索的元素
E
是否是列表
L
的成员

此谓词适用于简单嵌套列表,其中搜索的元素是子列表的直接成员。它将不适用于进一步嵌套的子列,例如:
位置([[b,c,f],[a],[d,g]],[h,e]],g,P)

如果不允许您使用内置谓词:

my_nth1(1,[X|_],X).
my_nth1(Idx,[_|List],X) :-
    my_nth1(Idx1,List,X),
    Idx is Idx1+1.

my_member(X, [X|_]). 
my_member(X, [_|T]):- 
    my_member(X, T).
您甚至不能仅通过编写来使用成员谓词

position(LL,E,N):-
    mynth1(N,LL,L),
    mynth1(_,L,E).

如果您对子列表的编号不感兴趣,但对子列表中元素的编号不感兴趣:

position(LL,E,N):-
    member(L,LL),
    nth0(N,L,E).

?- position([[b,c,f],[a,d,g],[h,e]],c,P).
P = 1 ; 
false.

?- position([[b,c,f],[a,d,g],[h,e]],g,P).
P = 2 ;
false.
以下是我的方法:

1。第一个位置谓词是基本情况(如果未找到元素,则停止条件保持检查,直到列表为空)

2.第二个谓词获取要检查的元素列表,并使用if-else技术给出p中的最终位置。如果元素是H的一个成员(意思是H=[b,c,f]),那么使用nth0给出元素的位置。否则,以相同的方式检查剩余的T(尾部:[[a,d,g],[h,e]])

position([],_,_).
position([H|T],Element,P):-
    (   member(Element,H)->  
        nth0(P,H,Element);
        position(T,Element,P)).
示例:

?-position([[b,c,f],[a,d,g],[h,e]],c,P).
P = 1
false
?-position([[b,c,f],[a,d,g],[h,e]],e,P).
P = 1
?-position([[b,c,f],[a,d,g],[h,e]],g,P).
P = 2
?-position([[b,c,f],[a,d,g],[h,e]],b,P).
P = 0
false

很抱歉,我的问题不够清楚。我希望在嵌套列表中找到元素的位置(即b=0,c=1,f=2)。不过,您的解决方案非常适合查找它所在的列表。很抱歉造成混淆,我已对问题进行了编辑以使其更清楚。@Joe修复了该问题。我想知道,如果您显然需要nth1/3 XD,为什么要使用nth0/3是的,很抱歉不够清楚。我的错!谢谢你的回答,谢谢你。带有“e”的示例不应该返回P=1吗?既然这是它在名单上的位置?我可能弄错了。@Joe给了1分。