27

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).

したがって、 inZの要素を削除して を取得します。しかし、2 つのリストを一緒に追加するにはどうすればよいでしょうか。[X|Y][X|W]

例、

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

結果は になりますX = [1,2,3,4,5]

また、再帰で何が起こっているのかわかりません。(調べたけど分からなかった)

編集:私が知りたいのはappend()、Prolog で定義済みのように機能するようにコーディングする方法です。

4

2 に答える 2

37

投稿したコードは(ほぼ)OKです。節の順序を入れ替える必要があります(生成的な方法で使用される場合、この述語定義を生産的にするために):

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

Aこれは、3つの引数、たとえば、、Bとの間の関係を定義しますC

最初の行は、C追加の結果でAありBACが空でないリストの場合、両方とも同じヘッド(つまり、最初の要素)を持ち、の末尾は、同じ2番目の引数でCの末尾を追加した結果です。 "AB

  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行目が私たちに伝えていることであり、空のリストを別のリストに追加すると、結果としてそのリストが生成されます」と書かれています。

驚くべきことに、append/3従わなければならないこれら2つの法則を書き留めたことは、定義自体を書き留めることと同じです。

さらに、これは宣言的な観点から説明します。運用の観点からより多くを示しているm09による回答をチェックしてください。

于 2012-07-18T21:59:07.420 に答える
11

しかし、2 つのリストを一緒に追加するにはどうすればよいでしょうか。

あなたはあなた自身の質問に答えました: あなたは を使用しますappend/3

に結果を追加XYて保存する場合はZ、次のようにします。

append(X, Y, Z)

たとえばX = [1, 2]、 and Y = [3, 4, 5]thenZが次のようにバインドされる場合[1, 2, 3, 4, 5]:

| ?- append([1,2],[3,4,5], X).

X = [1,2,3,4,5]

yes
| ?- 
于 2012-07-18T10:24:47.690 に答える