0

使用!and 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是正确的。它只是给你一个警告,因为在第二条规则中,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(_, _).

这两个_是不同的变量,而在这段代码中:

member(_A, _A).

两者_A是同一个变量。

于 2012-03-07T17:27:01.060 回答