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

时间:2018-12-03 20:27:36

标签: recursion prolog predicate

使用Prolog:

写一个谓词显示以显示列表的第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.

1 个答案:

答案 0 :(得分:2)

首先让我们给谓词一个更具描述性的名称,例如list_nth_element / 3。接下来,您可能要考虑带有附加参数的辅助谓词list_nth_element_ / 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

您还可以问类似哪个元素在什么位置?

   ?- 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