Prologに自分のマップリストを実装したい。
次の場合:
myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
apply(Goal, [Elem1, Elem2]),
myMaplist(Goal, Tail1, Tail2).
演算子とは何ですか?ライブラリシステムコールではないapply
ものに置き換えるにはどうすればよいですか?
Prologにcall/Nがある場合は、それを使用します。
myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
call(Goal, Elem1, Elem2),
myMaplist(Goal, Tail1, Tail2).
それ以外の場合は、univを使用して呼び出しを作成し、call/1を使用します
myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
Pred =.. [Goal, Elem1, Elem2],
call(Pred),
myMaplist(Goal, Tail1, Tail2).
修正する必要があることを指摘してくれた@falseに感謝します。本当のところ、私はテストなしでそのコードを投稿しましたが、それでも私は確かにバグを見落としていました...ここで修正
myMapList(_, [], []).
myMapList(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
Goal =.. [P|A],
append(A, [Elem1, Elem2], Ac),
Pred =.. [P|Ac],
call(Pred),
myMapList(Goal, Tail1, Tail2).
テスト:
?- myMapList(myMapList(=),[[1,2,3],[a,b,c]],L).
L = [[1, 2, 3], [a, b, c]] .
純粋なプロローグは一階述語論理に基づいています。つまり、他の述語の引数として述語を持つことはできません。したがって、マッピング述部を実装することはできません。
に関してapply/2
:swiplマニュアル