1

背景

我需要编写一个关系 power(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.

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

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

我确实找到了Prolog Dictionary,但我无法弄清楚“not”是什么意思或如何使用它(正如您可以想象的那样,Ctrl+F 会找到许多“not”的实例)。

问题

我怎么能在序言中说“H不为零”?

编辑该列表是整数列表。

4

3 回答 3

1

假设您的参数是一个数字列表,您可以简单地使用算术运算符

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).
于 2013-03-05T21:03:57.747 回答
0

使用“不可证明”运算符的工作解决方案:

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

  power([H|T]) :- \+ zero(H), zero(T).         
  power([0|T]) :- power(T).
于 2013-03-05T21:13:26.707 回答
0

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

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

测试:

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

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

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

于 2013-03-06T07:42:03.007 回答