使用!
和fail
,我试图否定失败。序言 - 这种否定是否正确?
然而,下面的方法给了我警告:Singleton变量:[X]。
但是,它似乎工作,所以我想知道如果有什么不对我做这件事的方法:
likes(vincent, big_kahuna_burger).
neg(X) :- X, !, fail.
neg(X).
所以调用neg(likes(vincent, big_kahuna_burger))
将返回false
。
使用!
和fail
,我试图否定失败。序言 - 这种否定是否正确?
然而,下面的方法给了我警告:Singleton变量:[X]。
但是,它似乎工作,所以我想知道如果有什么不对我做这件事的方法:
likes(vincent, big_kahuna_burger).
neg(X) :- X, !, fail.
neg(X).
所以调用neg(likes(vincent, big_kahuna_burger))
将返回false
。
您的实施neg
是正确的。它只是给你一个警告,因为在第二条规则中,从不使用X
。如果你写
neg(X) :- X, !, fail.
neg(_).
你将不会收到警告。
为了扩大这个问题:你可以命名你的变量,至少在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).
不会,但你已经保存包含在你的变量的名称的所有信息。
虽然,你必须要注意,一个变量开始与_
是不一样的东西,匿名变量,例如,在该代码(这是有点没用的):
member(_, _).
两个_
是不同的变量,而在这样的代码:
member(_A, _A).
两个_A
是相同的变量。