2

次のように (多かれ少なかれ) 動作する述語を定義する方法はありますか。

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

しかし、明示的なループもラムダもありませんか? maplistたぶん、またはでできるはずなのですが、わかりfindallませんでした...

(もちろん、リストであるList 、整数 [0, list_length) である Indices 、および List のすべてのN 番目メンバーにのみ当てはまります)

一方、これは非常に短くて明白な定義です....

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 に答える