1

私はプロローグリストとリストから特定の要素を取得する方法についてこのチュートリアルを読んでいて、この例に出くわしました:

 ?-  [_,X,_,Y|_]  =  [[],  dead(z),  [2,  [b,  c]],  [],  Z]. 

   X  =  dead(z) 
   Y  =  [] 
   Z  =  _9593 

私が理解していないのは、変数Zの値_9593をどこで取得するのかということです。

4

3 に答える 3

2

@Templar の説明が気になります。技術的な詳細は正しいのですが、用語を正しく理解することが心配です。

ここでは割り当ては行われません。統一しかない。ここで Prolog に求めているのは、 との統合[_, X, _, Y|_]です[[], dead(z), [2, [b, c]], [], Z]。どちら側に値または変数があるかは重要ではありません。Prolog が進行できないときに左側を歩いてから右側を歩いていると想像するよりも、リストが圧縮されていると想像する方が安全かもしれません。

まず、Prolog は _ を [] で統一しようとします。_ は「気にしない」を意味するため、これは自明に成功します。この統合によって確立されるバインディングはありません。

次に、Prolog は X と を統合しようとしdead(z)ます。X がバインドされていないため、これは自明に成功し、バインドが確立されX = dead(z)ます。この変数はアンダースコアで始まらないため、Prolog はユーザーがこのバインドに関心があると判断し、ユーザーに報告します。

次に、Prolog は _ と を統合しようとし[2, [b, c]]ます。繰り返しますが、これはバインドを確立せずに簡単に成功します。

次に、Prolog は Y を [] で統一しようとしますが、これも簡単に成功しますが、今度はバインディング Y = [] を確立し、それが報告されました。

次のステップの前に、記譜法を変更する必要があります。Prolog では、[X|T]X で始まり T で続くリストです。したがって、[X|_]X をリストの最初の要素と統合し、末尾を破棄します。したがって、この場合、|_]基本的には、このリストには他にもあるかもしれませんが、それが何であるかを特に知りたくありません. (ちなみに、空のリストは一致します。)

次に、Prolog は無名の末尾|_を Z で統一しようとします。Z がバインドされていないため、これも簡単に成功します。Prolog は無名変数を作成し、それを Z にバインドしたため、これによりバインドが確立されます。

したがって、@Templar が提供したのと同じ情報ですが、語彙が少し異なります。

于 2013-03-21T03:55:42.237 に答える
2
Z  =  _9593 

これは、自動的に生成された一意の変数名です。一意性を確保するために、ルールとファクトの変数は (一貫して) 名前を変更する必要があります。2 つの無関係なクエリで使用する場合Z、これら 2 つの変数は無関係であるため、異なる名前を付ける必要があります。

より単純な目標でも同じ効果が見られますが、

1 ?- Z=Z.

Z = _G213 

Yes
2 ?- write(Z).
_G236

Z = _G236

2139593特定の Prolog 実装によって維持される内部カウンターの反映にすぎません。先頭のアンダースコアは通常、それが使い捨て変数であることを示します。

于 2013-03-22T19:18:17.317 に答える
1

アンダースコアは、変数を気にせず、例を示すことを意味します

[_,X,_,Y|_]  =  [[],  dead(z),  [2,  [b,  c]],  [],  Z]. 

最初にアンダースコアが割り当てられ[]、次にXに割り当てられ、次にに割り当てdead(z)られ[2. [b.c]]、次ににY割り当てられ[]、次にテールがアンダースコアになります。これは何でも構いませんが、Z右側に変数があるため、プロローグの方法に割り当て_られます。それを行うことは、あなたの場合はそのでZ始まる任意の変数を導入することです。結局のところ、アンダースコアが何であるかは気にしないので、それについて心配する必要はありません。_something_9593

于 2013-03-21T03:14:34.297 に答える