3

Prologに自分のマップリストを実装したい。

次の場合:

myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
        apply(Goal, [Elem1, Elem2]), 
        myMaplist(Goal, Tail1, Tail2).

演算子とは何ですか?ライブラリシステムコールではないapplyものに置き換えるにはどうすればよいですか?

4

2 に答える 2

3

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]] .
于 2013-01-12T09:16:35.043 に答える
1

純粋なプロローグは一階述語論理に基づいています。つまり、他の述語の引数として述語を持つことはできません。したがって、マッピング述部を実装することはできません。

に関してapply/2swiplマニュアル

于 2013-01-12T10:21:51.210 に答える