Prolog - 这种否定是否是正确的?

时间:2012-03-06 22:57:53

标签: prolog negation

使用!fail,我正在尝试以失败告终。

然而,下面的方法给出了警告:单例变量:[X]。

然而,它似乎有效,所以我想知道我的方法是否有任何问题:

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

因此,调用neg(likes(vincent, big_kahuna_burger))将返回false

2 个答案:

答案 0 :(得分:2)

您对neg的实施是正确的。它只是给你一个警告,因为在第二个规则中,永远不会使用X。如果你写

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

你不会得到任何警告。

答案 1 :(得分: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).

不会,但您保留了变量名称中包含的所有信息。

但是,您必须注意,以_开头的变量与匿名变量不同,例如,在此代码中(这有点无用):

member(_, _).

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

member(_A, _A).

两个_A是相同的变量。