我需要写一个查看列表的关系幂(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不为零'?
编辑该列表是整数列表。
答案 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.
当然,我无法想象为什么你将这种谓词命名为“权力”......