24

私は新しいバージョンのSWIプロローグをテストしていましたが、エラーが発生し続けました:シングルトン変数

例:

member(X,[X|T]).

member(X,[X|T]) :- member(X,T).

次のようなリストのメンバーを検索します。

member(yolands,[yolanda,tim])

X = yes

しかし、代わりに、XとTのシングルトン変数エラーが発生します

私が次のことをした場合:

member(X,[X|_]).
member(X,[_|T]) :- member(X,T).

それは動作しますが、醜いように見えます!

単一変数が許可されない理由と、このANSI規格があるかどうかを誰かが説明できますか?

4

3 に答える 3

13

シングルトン変数はProlog では役に立たず、編集のタイプミスによって簡単に導入されます。

このような頻繁に発生するエラーの原因を簡単に特定できるため、警告は歓迎されます。

警告として、シングルトンを含むコードを実行できますが、これらが最終的に想定する値はすべて失われます。

ISO標準 ( ANSIについて聞いたことがない) がそのような変数を禁止しているとは思いません。

このように例を書き直すことができます

member(X, [Y|T]) :- X = Y ; member(X, T).

シングルトンのことは忘れてください。

于 2013-03-14T17:40:37.893 に答える
11

ここにバグがあります:

member(X,[X|T]) :- member(X,T).

あなたが実際に言っていることは(あなたが言っていると思うこととは対照的に)member/2、Xがリストの先頭にあり、リストの末尾にある場合に当てはまります。この述語は、リストの先頭にある同じものの最初のN個のコピーにのみ当てはまるので、言うのは非常に奇妙なことです。

?- member(X, [a,a,c]).
X = a ;
X = a ;
false.

?- member(X, [b,a,a]).
X = b ;
false.

これで、次のような操作を行うことで、バグを修正してもシングルトン警告を表示できます。

member(X, [Y|T]) :- member(X, T).

しかし、これは、2つのヘッドを使用する従来の定義や、明示的なORを使用する@CapelliCのバージョン(+1)ほど良くありません。私は、Prologをもう少しよく理解するまで待ってから、Prologコードの美学の意味で多くのストックを置くべきだと思います。しばらくそれを続けると、この警告と匿名変数の使用に感謝するようになります。

Prologでシングルトン変数を役に立たないものにしているのは、それらに名前が付けられているが、それらについて何も知られていないことと、残りの計算に影響を与えないことです。アンダースコアは、意味に影響を与えることなく、絶対に何でもそこに入ることができることを強調しています。何が

member(X, [X|T]).

本当は、Xが位置1であり、位置2のリストの先頭にあるXと同じであるということです。リストは空であるか、先頭と末尾が必要ですが、末尾にあるものはここでは関係ありません。重要なのはそのXは頭でもあります。Tはリストの残りの部分であるか、不適切なリストであるか、ブレッドボックス、稲妻、または春の日の空気の匂いである可能性があります。の真実とは何の関係もありませんmember(X, [X|T])

シングルトン警告は、「ここで何かの名前を予約しましたが、その名前で何かを呼び出すことはありません」と通知します。このメッセージを受け取ったときに最初に行うことは、明らかなタイプミスではありませんが、名前を_に置き換えて、コードがまだ意味があるかどうかを確認することです。そうでない場合は、論理エラーがあります。もしそうなら、それはおそらく不要でした。

于 2013-03-14T19:19:22.533 に答える
7

SWI-Prolog FAQの公式ページでそれについて読むことができます

この警告が表示される最も一般的なケースは次のとおりです。

  1. 変数のスペルミス
  2. 変数の使用/バインドを忘れる

SWI はそれを無視するいくつかの方法を提案します:

  1. この目的のために、_ という名前の無名変数を使用します。
  2. _T_ ( , など) で始まる変数を使用して_X、警告を回避し、無視するものを文書化します。
  3. 自分が何をしているのかを認識している場合は、使用でき:- style_check(-singleton).、すべての警告が消えるはずです。
于 2015-02-19T14:26:14.240 に答える