私は SWI-prolog を使用しており、リストをマップし、各要素を特定の整数で乗算するヘルパー関数を作成しようとしています。私の意図は、Haskell 関数に対応する述語を作成し、次のmultByN x n = x * n意味で使用することです。
map (multByN 3) [1,2,3]これにより、すべての要素が 3 倍され、[3,6,9]
Prologで対応する述語を検索したところmaplist/2、実際に新しい処理されたリストを返すのではなく、リスト内の各要素に対してブール条件が保持されているかどうかを確認するためにしか使用できませんでした。これがどのように機能するかを理解しています:
isEven(X) :- 0 is X mod 2
maplist(isEven, [2,4,6])を与えtrueます。
maplist(multByN(3), [1,2,3])ただし、実際にいくつかの変数を で統一するようなことをする方法がわかりません[3,6,9]。これを理解できなかったので、述語をリストにマップする独自のマッピング関数を実装しようとしmultByNましたが、正しいように見えるものを取得していますが、実際にはそうではありません。私はこれを持っています:
multByN(X, N, Y) :- Y is N*X.
mapFunc(_, [], L) :-
write(L), nl.
mapFunc(N, [H|T], L) :-
multByN(H, N, Z),
mapFunc(N, T, [Z|L]).
この述語を使用すると、次のようになります。
?- mapFunc(3, [1,2,3], X).
[9,6,3|_1746]
true ;
ここでは実際に最終的なリストを印刷して、それがどのように見えるかを確認していますが、クエリが実際にはX = [9,6,3|_1746]何も言っていないことがわかります。それを印刷しました-そしてそれは私が何をしているのかではありません。ここでのもう 1 つの問題は、削除_1746したいインスタンス化されていない変数です。特に、リストを逆にしようとすると、無限の回答とインスタンス化されていない変数が得られるためです。
maplist/2理想的には、問題を解決する方法と自分の述語の両方を見つけたいと思いますが、他の人は使い方を学ぶことにもっと興味があるmaplist/2と思いますし、それで十分だと思います。