使用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.
答案 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