2

ターボプロローグは初めてです。ネストされたリストを追加する際に問題に直面しています。こんなゴールが欲しい――

ゴール:mega_append([[1,3],[2,4,6],[0]],X)

出力はX=[1,3,2,4,6,0]

次のコードを使用しました。

domains 

list=integer*

predicates

    mega_append(list,list)
    append(list,list,list)

clauses

    mega_append([],[]).

    mega_append([H|T],L3):-
        mega_append(H,L1),
        mega_append(T,L2),
        append(L1,L2,L3).

    mega_append(X,[X]).

    append([],ListB,ListB).

    append([X|List1],List2,[X|List3]):-
        append(List1,List2,List3).

プログラムでエラーが発生します。「この位置の変数の型が不正です。」次に、mega_append(H,L1) 行の H の位置を示します。どうすればこの問題を解決できますか? 私のプログラムに間違いはありますか?私を助けてください。

4

2 に答える 2

1

整数のリストではなく、リストのリストを操作しています。試す

listlist = list*
mega_append(listlist,list)

次に、再帰を修正します。あなたが書いたバージョンは、静的に型付けされたPrologのバリアントでは機能しません。TurboPrologはmega_append、最初の引数の先頭で再帰的に呼び出されます。これは、引数自体とは異なる型です(型の場合T*、その場合、そのヘッドはタイプである必要がありますT)。

mega_append([], []).
mega_append([H|T], R) :-
    mega_append(T, R0),
    append(H, R0, R).

そしてところで、この述語の一般名はですconcat/2

于 2011-04-26T19:07:14.130 に答える
0

mega_append([],[]).
mega_append([[A|R0]|R1],[A|R2]) :-
        mega_append([R0|R1],R2).
mega_append([[]|R1],R2) :-
        mega_append(R1,R2).
于 2011-04-27T08:29:15.690 に答える