3

私の例では、追加ファンクターを使用しています。

append([],L,L). 
append([H|T],L2,[H|L3])  :-  append(T,L2,L3).

//append([123],[abc],L3). this is the query

私を本当に混乱させているのは [H|L3] リストです。私が読んだものを形成すると、それは頭を脱ぐので、それをリストに追加するのはどうですか。リストを再帰して戻ってきたとき、それはどのように追加されますか? 前もって感謝します。

4

3 に答える 3

5

表記法[H|T]は、 のシンタックス シュガーです'.'(H, T)。したがって、これは名前を持つファンクタ.です。1 つのドットと 2 つの引数です。検討:

?- [1,2,3] = [X|L] .
X = 1、
L = [2, 3]。

ここで、方程式の解があるかどうかを尋ねます[1,2,3] = [X|L]。そして、はい、これらの 2 つの回答置換で説明されている解決策は 1 つだけです。この方程式を解くプロセスは、ユニフィケーションと呼ばれます。このプロセスには、データ構造の読み取り、選択、および書き込みが含まれます。したがって、これを「頭を脱ぐ」と呼ぶことはできますが、背後にある一般性を見逃すことになります。結局:

?- X = 1、L = [2, 3]、M = [X|L]。
X = 1、
L = [2, 3],
M = [1, 2, 3]。

ここでは、小さなリストから新しいリストを作成しました。しかし、次のとおりです。

? -M = [X|L]。
M = [X|L]。

この答えは、多くの解決策を意味します。たとえば、長さが 1 以上のすべてのリスト。

を見ているのでappend/3、次のクエリを検討してください。

?- append(Xs, Ys, [X,Y,Z])。
?-追加 (Xs、Xs、Zs)。
?- append(Xs、Ys、Zs)

リスト構文の詳細

于 2012-04-25T06:59:49.523 に答える
3

trace/0実行がどのように見えるか疑問に思うような場合に使用できます。

これがその概要です。

  • あなたが呼ぶappend([1, 2, 3], [a, b, c], L3).
  • [1, 2, 3]は空ではありません。2 番目の節が適用されます
  • append([2, 3], [a, b, c], L4).の頭は の頭のようL3[1, 2, 3]、 の尻尾L3L4
  • [2, 3]は空ではありません。2 番目の節が適用されます
  • append([3], [a, b, c], L5).の頭は の頭のようL4[2, 3]、 の尻尾L4L5
  • [3]は空ではありません。2 番目の節が適用されます
  • append([], [a, b, c], L6).の頭は の頭のようL5[3]、 の尻尾L5L6
  • []と統合し[]、最初の節が適用されます
  • L6一体化すると言う。[a, b, c]

これで、Prolog はあなたに答えるすべての情報を持っています:

L6 = [a, b, c],
L5 = [3|L6],
L4 = [2|L5],
L3 = [1|L4].

Prolog が終了できるようにしL3 = [1, 2, 3, a, b, c]ます。

それが役に立ったことを願っています。

于 2012-04-25T06:55:36.490 に答える
1

Prolog では、「離陸」ほど積極的なことはしません。「集中する」と考えたほうがいいかもしれません。(プロローグは本質的に宣言的です。何をすべきかを言うのではなく、何かがどのように見えるかを言います。) たとえば、リストは空 ( []) または空でない ( ) のいずれか[H|T]です。空でないすべてのリストには headHと tailTがあり、|それらを参照できるようにするだけです。[H|T]統合では、必要に応じて、リストを分解したり、リストをまとめたりするために、リストの宣言を使用できます。

于 2012-04-25T05:48:28.223 に答える