0

その事実をどのように理解するか、私はあまり知りませんp([H|T], H, T)。C/C++/Java などは知っていますが、これは違うようです。「関数」p に最初の引数を渡すと、それは H と T に分離され、この変数を介してアクセスできるようになりますか? これを論理的に理解する方法がわかりません。

http://www.doc.gold.ac.uk/~mas02gw/prolog_tutorial/prologpages/lists.html

p([H|T], H, T).


Lets see what happens when we ask some simple queries.

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

X=a


Y=[b,c]


yes
4

2 に答える 2

1

参考にしたページには「次の事実を考えてみてください。

p([H|T], H, T)."

したがって、これを事実として扱わなければなりません。つまり、述語を持つようなものです

p([H|T], H, T):- true.         % or,  p(L,H,T) :- L=[H|T].

ここで、クエリを実行するp([a,b,c], X, Y).と、一方が他方の横に配置されます。

p([a,b,c], X, Y).              % a query
p([H|T],   H, T) :- true.      % a rule's clause: _head_ :- _body_.

[a,b,c] = [H|T]、およびX = HY = T統一方程式として扱われます。最初のものはさらに翻訳されます

a = H                          % list's head element
[b,c] = T                      % list's tail

なぜなら、リストのhead要素とリストのtail、つまり head 以外のすべての残りの要素[A|B]を持つリストを表すからです。およびは、これらの論理変数の一般的なニーモニック名です。ABHT

したがって、全体として、 、 が得られX = H = aますY = T = [b,c]

このプロセスは、クエリとルールのヘッド ( 「ファンクター」で始まり、両方とも 3 つの「引数」を持つ 2 つのもの) の統合として知られているものです。p

クエリとルールの「節」の先頭が一致し (同じファンクターと同じ数の引数を持っていた)、それらの引数はすべて、上記の置換を使用してペアごとに正常に統合されたため、そのルールの節の本体のみを証明する必要があります。 (こうして選ばれた)。

であるためtrue、すぐに成功し、成功した置換が結果として示されます。

それがプロローグの仕組みです。

TL;DR : はい、指定さp(L,H,T)れた listLで呼び出すと、 headと tail分解されます。しかし、指定された list 、 value 、および variableで呼び出すことができ、新しいリストがhead と tail から構築されます。また、も指定されている場合は、頭がで、尾が であるかどうかがチェックされます。HTTHLLHT

これは、Prolog の統合が双方向であるためです。A = Bは と同じB = Aです。変数との統一はその変数を設定するようなものであり、値との統一はその値との (構造的な) 等価性をチェックするようなものです。

呼び出しp(L,H,T)は本当に統合に相当しL = [H|T]ます。

于 2013-04-11T09:05:31.547 に答える
1

Prologでは、リレーショナル DB に似た方法でリレーションがあります

次に、p/3リスト(最初の引数) とその headと tailの間の関係です。HT

適切に、チュートリアルの作成者は、変数として記述記号と合成記号を使用しました。

構文的には、変数は大文字で始まる記号であり、任意の値を取得できますが、一度しか取得できません (つまり、「再割り当て」することはできません)。

于 2013-04-11T13:09:38.930 に答える