2

さて、私はなぜそれが機能するのか疑問に思っています、そこではプロローグは変数を失います。

?- \+ \+ member(X,[a]),X=b.
X=b.

ここで、X=aです。自動的に消えました。

4

2 に答える 2

4

\+/1論理的な意味での「ない」ではなく、「失敗としての否定」によって実装されます。つまり、失敗しても\+ Goal成功するということです。Goal

\+/1次のように実装されていると考えてください。

\+(Goal) :- Goal -> fail ; true.

ご覧のとおり、どちらの場合も変数Goalが束縛されることはありません。「if」ブランチでは、バックトラックによってバインドが元に戻され、「else」ブランチでは、バインドされた変数はありません。

あなたの例では、member(X,[a]にバインドXすることで成功しますa。これは\+ member(X,[a])失敗し、\+\+ member(X,[a])この失敗のために成功します。中間故障のため、Xに拘束されませんa

于 2012-05-29T13:16:57.687 に答える
1

(\+)/1プロローグの演算子は、証明できないことを表すと想定(not)/1されていますが、古い演算子に対応しています。したがって、基本的にここで行っていることは次のとおりです。

not not member(X, [a]), X = b.

編集

Xが を含むリストである場合a、 の二重否定は、否定がない場合member(X, [a])と同じ結果になりmember(X, [a])ます。、リストX = bにバインドするだけです。bX

また、すべての Prolog 述語とその意味のリストがある、ブックマークしたリンクもここにあります。

お役に立てれば

于 2012-05-29T13:17:53.780 に答える