2

有没有办法定义一个行为(或多或少)像这样的谓词:

% nths(?Indices, ?List, ?Nths)
nths([], _, []).
nths([N|Ns], List, [E|Es]) :-
    nth0(N, List, E),
    nths(Ns, List, Es).

但没有显式循环,也没有 lambda?我有一种感觉,应该可以用maplist也许,或者findall,但我想不通......

(当然,这仅适用于作为列表的 List 、整数索引[0, list_length) 以及List的所有Nths成员)

另一方面,这是一个非常简短而明显的定义......

4

1 回答 1

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).
于 2013-05-28T20:39:31.210 回答