1

プロローグで:

?-P=[A|B], P=[1,_].
P = [1, _G1091],
A = 1,
B = [_G1091]

B は [_G1091] として表示され、インスタンス化されていない変数であることを示しています。でも、ちょっと変えると・・・

?-P=[A|B], P=[1|_].
P = [1,B],
A = 1,

突然、 B がインスタンス化されていないことを私に示すことに興味がありませんが、それでも何かと統合する準備ができている変数です..どうしてですか? (私は時々奇妙な詳細に焦点を当てるのが好きです:))

4

3 に答える 3

2

Prolog 構文の正確な詳細は、非常に微妙な場合があります。それに慣れるにwrite_canonical/1は、関数表記法で用語を示す次のように使用します。

?- write_canonical([A|B]).
'.'(_1,_2)
true.

?- write_canonical([1,_]).
'.'(1,'.'(_1,[]))
true.

Prolog のリスト表記法に慣れるために、「ドリル」演習をお勧めします。

いくつかのリストを取り、[[1,2],3]想像できる限り多くのバリエーションで書き留めてみてください。

?- [[1,2],3] == [[1,2],3|[]].
true.

多くのプロローグでは、トップレベルで最後の入力 (多くの場合: カーソルアップ) を取得できるため、右側をすばやく再編集できます。

于 2012-12-11T16:53:27.467 に答える
2

最初のケースでは:

?-P=[A|B], P=[1,_].

あなたはそれが2つの要素を持つリストであると述べていますP。最初の要素は番号1です(変数Aに統一されています)。したがって、B1 つの要素 (名前のない変数) を持つリストでなければなりません。

一方、2 番目のケースでは、次のようになります。

?-P=[A|B], P=[1|_].

Pそれは少なくとも1つの要素を持つリストであると述べています(1は再び に統合されてAいます)が、他には何も述べていません。B空のリスト、または任意の数の要素を持つリストのいずれかです。

于 2012-12-11T16:46:10.847 に答える
1

各クエリの 2 番目の部分を見ると、最初の部分は次のようになります。

P=.(1,.(_,[]))

一方、2番目は

P=.(1,_)

最初に、B は .(_,[]); にバインドされます。つまり、インスタンス化されていない変数を含むリスト

2番目では、Bはインスタンス化されていない変数にバインドされています

変数がインスタンス化されていない変数にバインドされているだけの場合、それを表示しても意味がありません。最初の例では、追加の構造を持つ何かにバインドされているため、それを示すことには意味があります。

于 2012-12-11T16:49:42.350 に答える