web-dev-qa-db-ja.com

述語をリスト要素に適用するプロローグマッププロシージャ

述語map(List, PredName, Result)Listの要素に適用し、結果をリストResultに返すPrologプロシージャPredName(Arg, Res)をどのように記述しますか?

例えば:

test(N,R) :- R is N*N.

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
36
General_9

これは通常_maplist/3_と呼ばれ、 Prologプロローグ の一部です。引数の順序が異なることに注意してください!

_:- meta_predicate maplist(2, ?, ?).

maplist(_C_2, [], []).
maplist( C_2, [X|Xs], [Y|Ys]) :-
   call(C_2, X, Y),
   maplist( C_2, Xs, Ys).
_

引数の順序が異なるため、いくつかのmaplist- goalsを簡単にネストできます。

_?- maplist(maplist(test),[[1,2],[3,4]],Rss).
Rss = [[1,4],[9,16]].
_

maplistにはさまざまなアリティがあり、 関数型言語では次の構文 に対応していますが、すべてのリストが同じ長さである必要があります。 PrologにはZip/zipWithunzipの非対称性がないことに注意してください。目標maplist(C_3, Xs, Ys, Zs)は両方を包括し、さらに一般的な用途も提供します。

  • _maplist/2_はallに対応します
  • _maplist/3_はmapに対応します
  • _maplist/4_はzipWithに対応しますが、unzipにも対応します
  • _maplist/5_は_zipWith3_および_unzip3_に対応します
  • ...
44
false