2

プロローグ コードに問題があります。リストのすべてのアトミック要素を逆にする必要があります。

例: [1,2,[3,4]] -> [[4,3],2,1]

私の解決策:

myReverse([], []).
myReverse([H|T], X) :- myReverse(T, RT), myAppend(RT, H, X).

[[3,4],2,1] アトミックでない場合は、 is_list 関数と再帰呼び出しリストを使用する必要があると思います...しかし、私は立ち往生しています...皆さん、方法を知っていますか書いてください?

4

2 に答える 2

3

ほぼ。この解決策を検討してください。

myReverse([], []) :- !.

myReverse([H|T], X) :-
    !,
    myReverse(H, NewH),
    myReverse(T, NewT),
    append(NewT, [NewH], X).

myReverse(X, X).

!最初の句は基本ケースで、最後の句のために残された選択肢を除外するためのカット ( ) が含まれています。

2 番目の句はH、アトムまたはリストの head を逆にします。がアトムの場合H、カット後の再帰サブゴールは最後の句で評価され、アトムは変更されずに渡されます。がリストの場合H、2 番目の句で評価され、すべての要素が逆になります。次のサブゴールは、リストの残りの部分 (末尾のT) と同じことを行い、最後に組み込みの を使用して連結されappend/3ます。新しい head 要素は特異であるため、リストで動作するの定義に従ってNewH、単一のリスト構造に追加する必要があることに注意してください。[NewH]append/3

最後の句は、他のすべてのもの (つまり、アトム、数値など - リストでも変数でもないもの) を変更せずに渡します。

于 2012-04-10T02:37:51.113 に答える
2
revall(L, Y) :-
    revall(L, [], Y).
revall([], Y, Y).
revall([H|T], T2, Y) :-
    is_list(H),!,
    revall(H, Hr),
    revall(T, [Hr|T2], Y).
revall([H|T], T2, Y) :-
    revall(T, [H|T2], Y).

ここに追加せずに

于 2012-04-10T07:27:03.517 に答える