Prolog中的“not”操作符或否定符号

时间:2013-03-05 20:37:49

标签: prolog negation

背景

我需要写一个查看列表的关系幂(P),并判断P中除了一个元素之外的所有元素是否为零。

这就是我所拥有的:

%I have a relation called zero(P) which decides if every element is zero.

power([H|T]) :- H is not zero,  %The current element is non zero, the tail is all zero.
                zero(T).         
power([0|T]) :- power(T).       %The current element is zero, 
                                %but the tail has a non zero element in it.

有些资源建议使用cut运算符(!)来控制回溯,我认为这不是我想要的。

我还遇到了不可证明的运算符(\ +),它似乎交换结果(不可证明返回yes),我认为这也不是我想要的。

我确实找到了Prolog Dictionary,但我无法弄清楚“不”意味着什么或如何使用它(正如你所能想象的那样,Ctrl + F找到许多“不”的实例)。

问题

如何在prolog中说'H不为零'?

编辑该列表是整数列表。

3 个答案:

答案 0 :(得分:1)

假设您的参数是一个数字列表,您只需使用arithmetic operators

power([H|T]):- H =\= 0, zero(T).
power([H|T]):- H =:= 0, power(T).

一般来说,你也可以写\+ (H=0)。这意味着,H无法与0统一。

问题是,如果使用不是数字列表的列表调用此谓词,您希望发生什么?上面的代码会导致错误。如果您希望它在这种情况下失败,那么它可以定义为

power([H|T]):- \+(H=0), zero(T).
power([H|T]):- H=0, power(T).

答案 1 :(得分:0)

使用'not provable'运算符的工作解决方案:

  zero([]).
  zero([0|T]) :- zero(T).

  power([H|T]) :- \+ zero(H), zero(T).         
  power([0|T]) :- power(T).

答案 2 :(得分:0)

零/ 1似乎是一个相当专业的谓词。如果您想了解更多惯用语(高级?)Prolog,请考虑基于库(apply)的“单线程”定义:

power(L) :- include(=\=(0), L, [_]).

试验:

?- power([0,99,0,0]).
true.

?- power([0,99,0,1]).
false.

当然,我无法想象为什么你将这种谓词命名为“权力”......