1. ホーム
  2. list

[解決済み] Prologでリストを追加するにはどうしたらいいですか?

2022-03-09 23:23:08

質問

Prologでリストを追加する方法を教えてください。インターネットで検索したところ、このようなものが見つかりました。 http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html )

append([X|Y],Z,[X|W]) :- append(Y,Z,W).  
append([],X,X).

そのため Z の要素を削除することで [X|Y][X|W] . しかし、2つのリストを一緒に追加するにはどうすればよいのでしょうか?

appendlist([1,2],[3,4,5],X).

その結果、次のようになります。 X = [1,2,3,4,5] .

また、再帰の中で何が起こっているのかわかりません。(トレースしてみたけどよくわからなかった)。

EDITです。 私が知りたいのは、どのようにコーディングすれば、定義済みの append() をPrologで作成しました。

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

投稿されたコードで(ほぼ)OKです。節の順序を入れ替えるだけです(この述語の定義を生成的な方法で使用したときに、生産的にするため)。

append( [], X, X).                                   % (* your 2nd line *)
append( [X | Y], Z, [X | W]) :- append( Y, Z, W).    % (* your first line *) 

これは、3つの引数の関係を定義するもので、仮に A , BC .

最初の行に書いてありますね。 "です。 C を追加した結果です。 AB もし AC が空でないリストである場合,両者は同じ (すなわち、最初の要素)、および テール C の末尾を追加したものです。 A を同じ第2引数で指定します。 B " .

  a        a
  ----------
  b        b
  c        c
  .    d   d
       e   e
       .   .

または左から右へ。

         a | b c .
           |     d e .
         a | b c d e .

append(         [], 
                 Z,
                 Z ).       
append( [X | Y   ],
                 Z,
        [X |         W ] ) :- append(
             Y,  Z,  W).

考えてみてください、完璧に理にかなっています。これは何をするかというと、私たちが定義したいのは append/3 そして、その関係がどうあるべきかがわかっているので、その関係が満たすべき明らかな事実、いわばその関係が従うべき法則を書き記すだけなのです。

では、このコードがすでに定義されていると仮定して、どんな法則に従わなければならないのでしょうか?明らかに、あるリストの末尾と別のリストを足すと、完全なリストとその2番目のリストを足した結果の末尾が得られます。

これは、最初のリストをどのようにスライドさせるかを定義しています。しかし、これ以上スライドさせるところがなかったらどうでしょう?リストの最後に到達したらどうでしょう?その場合、空のリストに到達したことになり、空のリストに別のリストを追加すると、結果としてそのリストが得られます。もちろんです。そして、あなたのコードの2行目は、それを教えてくれているのです。 を追加します。 空リスト と他のリストとの組み合わせは、そのリストを結果として生成する"。 .

驚くべきことに、この2つの法則を書き記すことで append/3 は、定義そのものを書き下ろしたのと同じことです。

を追加しました。 は、宣言的な観点から説明しています。 m09 の回答 は、より運用の観点から見たものです。