web-dev-qa-db-ja.com

Prologでリストを追加するにはどうすればよいですか?

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

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

例、

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

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

また、再帰で何が起こっているのかもわかりません。 (トレースしましたが、理解できませんでした)

EDIT:私が知りたいのは、Prologの事前定義されたappend()のように機能するようにコーディングする方法です。

21
Zik

投稿したコードは(ほとんど)OKです。句の順序を交換するだけです(生成的な方法で使用する場合、この述部の定義を生産的にするために):

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

これは、3つの引数間の関係を定義します。たとえば、AB、およびCです。

あなたの最初の行は言う、 "CABを追加した結果です。ACが空でないリストの場合、両方とも同じです  (つまり、最初の要素)、および  of 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は後に続く必要があり、定義自体を書き留めることと同じです。

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

27
Will Ness

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

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

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

append(X, Y, Z)

たとえば、X = [1, 2]Y = [3, 4, 5]の場合、Z[1, 2, 3, 4, 5]にバインドされます。

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

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

yes
| ?- 
10
aioobe