0

とを使用!してfail、失敗による否定を試みています。

ただし、以下のメソッドでは警告が表示されます。シングルトン変数:[X]。

しかし、それは機能しているように見えるので、私の方法に何か問題があるのではないかと思います。

likes(vincent, big_kahuna_burger).
neg(X) :- X, !, fail.
neg(X).

したがって、呼び出しneg(likes(vincent, big_kahuna_burger))はに戻りfalseます。

4

2 に答える 2

1

の実装negは正しいです。2 番目のルールでXは が使用されないため、警告が表示されるだけです。あなたが書くなら

neg(X) :- X, !, fail.
neg(_).

警告は表示されません。

于 2012-03-06T23:35:04.637 に答える
1

さらに詳しく説明すると、少なくとも swi で変数に名前を付けて、_それらが複数回使用されないことを示す先頭に付けることができます。このようにして、意味のある名前を変数に追加し、貴重な情報を保持することができます。を使用した例を次に示しmember/2ます。

member(Element, [Element|Tail]).
member(Element, [Head|Tail]) :-
    member(Element, Tail).

警告が表示されますが、

member(Element, [Element|_Tail]).
member(Element, [_Head|Tail]) :-
    member(Element, Tail).

そうではありませんが、変数名に含まれるすべての情報を保持しています。

ただし、a で始まる_変数は、たとえば次のコードの匿名変数と同じではないことに注意する必要があります (これはあまり役に立ちません)。

member(_, _).

この 2 つ_は異なる変数ですが、このコードでは次のようになります。

member(_A, _A).

2 つ_Aは同じ変数です。

于 2012-03-07T17:27:01.060 に答える