有没有办法定义一个行为(或多或少)的谓词:
% nths(?Indices, ?List, ?Nths)
nths([], _, []).
nths([N|Ns], List, [E|Es]) :-
nth0(N, List, E),
nths(Ns, List, Es).
但没有显式循环,没有lambda?我觉得应该可以使用maplist
或findall
进行此操作,但我无法理解......
(当然只有 List 是一个列表, Indices 是整数[0,list_length]和所有 Nths List 的成员)
另一方面,这是一个非常简短明确的定义......
答案 0 :(得分:1)
一个简单的findall/3
就足够了:
nths(Ns, List, Es) :-
findall(E, (member(N, Ns), nth0(N, List, E)), Es).
maplist
也可以这样做,但它需要一个辅助谓词:
nth0r(L, N, X) :- nth0(N, L, X).
nths(Ns, List, Es) :-
maplist(nth0r(List), Ns, Es).