12

Prolog変数について私が理解したことは次のとおりです。

  1. 単一のアンダースコアは、発生するたびに新しい変数のような無名変数を表します。

  2. _W のようなアンダースコアで始まる変数名は無名変数ではありません。または、Prolog 内で生成された変数名 (_G189 など) は匿名とは見なされません。

?- append([1,2],X,Y).
X = _G189
Y = [1, 2|_G189]

理解を助けていただけますか?

ところで、上記の例はいくつかのチュートリアルから取得しましたが、SWI-Prolog バージョン 6 で実行すると、次のようになります。

?- append([1,2],X,Y).
Y = [1, 2|X].

ありがとうございます。

4

1 に答える 1

19

変数

匿名変数_は、異なる出現が異なる変数を表す唯一の変数です。で始まるその他の変数_ は匿名ではありません。異なるオカレンスは、同じ変数 (同じスコープ内) を参照します。ただし、SWI などの多くのプロローグは、アンダースコアで始まらない変数が 1 回だけ発生すると警告します。

?- [user].
a(V).
Warning: user://1:9:
        Singleton variables: [V]

_Vその警告を回避するには、その変数の名前を に変更する必要があります。これは、プログラマーが変数名のタイプミスを見つけやすくするのに役立ちます。多くのシステムには、このような制限がいくつかあります。

a(_V,_V).
Warning: user://1:12:
        Singleton-marked variables appearing more than once: [_V]

繰り返しますが、これは単なる警告です。で始まる変数を_(警告なしで) 2 回出現させたい場合は、__代わりに記述します。ただし、先頭の_.

回答

Prolog の最上位ループから得られるのは答えです。特に回答の置換。それらは解決策を表すのに役立ちます (これが私たちが本当に関心を持っていることです)。回答の置換を表現する方法はいくつかあります。使用しているチュートリアルは、非常に古いバージョンの SWI を参照しているようです。このバージョンはおそらく 15 ~ 20 年前のものだと思います。

?- append([1,2],X,Y).
X = _G189
Y = [1, 2|_G189]

ただし、与えられた答えは間違っていません。新しい補助変数_G189が導入されています。

SWI の新しいバージョンや他の多くのシステムは、補助変数を避けて、出力を最小限に抑えようとします。そう

?- append([1,2],X,Y).
Y = [1, 2|X].

大丈夫です。これは、「新しい」バージョン (これも 6 年前のもの) の回答です。この回答は、最初の回答よりも多くのことを示していることに注意してください。回答の置換がよりコンパクトに表示されるだけでなく、まさにこの 1 つの回答がある (そしてそれ以上ない) こともわかります。.最後にドットが見えますか?これは、次のことを意味します。これ以上答える必要はありません。それ以外の場合は;、次の回答があります。

于 2013-01-09T18:20:37.623 に答える