さて、私はなぜそれが機能するのか疑問に思っています、そこではプロローグは変数を失います。
?- \+ \+ member(X,[a]),X=b.
X=b.
ここで、X=aです。自動的に消えました。
さて、私はなぜそれが機能するのか疑問に思っています、そこではプロローグは変数を失います。
?- \+ \+ member(X,[a]),X=b.
X=b.
ここで、X=aです。自動的に消えました。
\+/1
論理的な意味での「ない」ではなく、「失敗としての否定」によって実装されます。つまり、失敗しても\+ Goal
成功するということです。Goal
\+/1
次のように実装されていると考えてください。
\+(Goal) :- Goal -> fail ; true.
ご覧のとおり、どちらの場合も変数Goal
が束縛されることはありません。「if」ブランチでは、バックトラックによってバインドが元に戻され、「else」ブランチでは、バインドされた変数はありません。
あなたの例では、member(X,[a]
にバインドX
することで成功しますa
。これは\+ member(X,[a])
失敗し、\+\+ member(X,[a])
この失敗のために成功します。中間故障のため、X
に拘束されませんa
。
(\+)/1
プロローグの演算子は、証明できないことを表すと想定(not)/1
されていますが、古い演算子に対応しています。したがって、基本的にここで行っていることは次のとおりです。
not not member(X, [a]), X = b.
編集
X
が を含むリストである場合a
、 の二重否定は、否定がない場合member(X, [a])
と同じ結果になりmember(X, [a])
ます。、リストX = b
にバインドするだけです。b
X
また、すべての Prolog 述語とその意味のリストがある、ブックマークしたリンクもここにあります。
お役に立てれば