Recursion 序言:显示列表的第n个元素

Recursion 序言:显示列表的第n个元素,recursion,prolog,predicate,Recursion,Prolog,Predicate,使用Prolog: 编写谓词dispnth以显示列表的第n个元素。您可以假设输入列表始终有n个或多个元素 例如: ?-dispnth([1,2,3,4,5,2,X)。应返回X=[2,3] 到目前为止,我有: dispnth([X|_], 0, X). dispnth([_|Xs], N, X) :- dispnth(N1, X, Xs), N is N1 + 1. 首先,让我们给谓词一个更具描述性的名称,比如list\n\u element/3。接下来,您可能想考虑一个辅助谓词L

使用Prolog:

编写谓词dispnth以显示列表的第n个元素。您可以假设输入列表始终有n个或多个元素

例如:
?-dispnth([1,2,3,4,5,2,X)。
应返回
X=[2,3]

到目前为止,我有:

dispnth([X|_], 0, X).
dispnth([_|Xs], N, X) :- 
   dispnth(N1, X, Xs),
   N is N1 + 1.

首先,让我们给谓词一个更具描述性的名称,比如list\n\u element/3。接下来,您可能想考虑一个辅助谓词ListNthTyEntEng/ 4,它包含一个附加的参数,它保持当前位置。从你给出的例子中,我假设你从1开始计数,所以这将是第四个参数的起始值。那么谓词可能如下所示:

list_nth_element(L,N,E) :-
   list_nth_element_(L,N,E,1).

list_nth_element_([X|Xs],N,X,N).       % if the 2nd and 4th elements are equal X is the nth element
list_nth_element_([_X|Xs],N,E,P0) :-   % if the 2nd and 4th arguments
   dif(P0,N),                          % differ
   P1 is P0+1,                         % increment current position
   list_nth_element_(Xs,N,E,P1).       % and recurse
因此,基本上第四个参数用作位置指示器,它将递增,直到达到所需的位置。但是,在实际谓词接口中不需要这个附加参数,因此它“隐藏”在辅助谓词的接口中

查询此谓词将生成所需的结果:

   ?- list_nth_element([1, [2, 3], 4, 5], 2, X).
X = [2,3] ? ;
no
你也可以问一些问题,比如哪个元素在什么位置


请展示您迄今为止所做的尝试,并就此提出具体问题。另外,
[2,3]
是列表中的第二个元素,而不是第三个。对此表示抱歉。我认为我的解决方案到目前为止可能只是令人困惑。实际上它一点也不令人困惑,这是一个好的开始。有一件事情看起来很混乱,那就是对
dispnth(N1,X,Xs)
的递归调用。你的论点交换了。它应该是
dispnth(Xs,N1,X)
。顺便说一下,这正是内置的
nth1/3
。@DanielLyons:差不多了。前两个参数被翻转;-)
   ?- list_nth_element([1, [2, 3], 4, 5], N, X).
N = X = 1 ? ;
N = 2,
X = [2,3] ? ;
N = 3,
X = 4 ? ;
N = 4,
X = 5 ? ;
no