1. ホーム
  2. list

[解決済み】Prologでリストを反転させる

2022-02-14 01:38:47

質問

プログラミングの授業の宿題を終えました。 私はリストを反転させるPrologプログラムを作成することになっていました。 しかし、なぜそのようなプログラムができるのかが理解できず困っています。

%1. reverse a list
%[a,b,c]->[c,b,a]

%reverse(list, rev_List).
reverse([],[]).  %reverse of empty is empty - base case
reverse([H|T], RevList):-
    reverse(T, RevT), conc(RevT, [H], RevList).  %concatenation

この場合、RevTとは一体何なのでしょうか? Tまたは与えられたリストの残りの部分の逆を表すことになっているのは知っていますが、私はそれを何かに割り当てていないので、それがどのような値を持つことができるのかわかりません。 RevTはRevListと同じような役割を果たすだけで、再帰的な呼び出しのたびに使うのでしょうか?

また、conc()関数の呼び出しで、なぜHだけでなく[H]を使わなければならないのでしょうか? H はリストの先頭を指すのではないのですか(ex: [H])? それとも、単にリストの先頭の項目(Hだけ)を参照しているのでしょうか?

この点をクリアにするために、ご協力をお願いします。 このようなプログラミングのロジックを理解するのに苦労しています。

どのように解決するのですか?

解答を説明します。 空のリストを反転させると、空のリストが得られます。 リスト[H|T]を反転させると、Tを反転させて[H]と連結したリストが得られます。 この再帰節が正しいことを確認するために、リスト [a,b,c,d] を考えてみよう。このリストの末尾を逆にすると、[d,c,b] が得られる。これを[a]と結合すると[d,c,b,a]となり、[a,b,c,d]の逆順となる。

もう一つの逆解。

プレ reverse([],Z,Z). reverse([H|T],Z,Acc) :- reverse(T,Z,[H|Acc]).

を呼び出します。

?- reverse([a,b,c],X,[]).

詳しくはこちらをご覧ください。 http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse25