检查列表是否只包含零

Checking that a list contains only zeros

我在作业中遇到了一个问题,要求编写一个 Prolog 程序,将数字列表作为输入,如果列表成功 仅包含 0s

我无法让程序搜索零。例如,这样的查询:

?- zero([0,0,0,0]).

应该给我们 true 并且它应该 return false 只要其中有一个数字不是零。

你为什么要我们为你做作业? 无论如何,这是非常简单的递归。类似于:

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

继续清除零,直到您的列表为空。没那么难 ;)

通常,人们不会为此定义适当的谓词,而是使用 maplist/2 来达到目的:

..., maplist(=(0), Zs), ...

举个具体的例子:

?- Zs =[A,B,C], maplist(=(0), Zs).

此查询对应于:

?- Zs = [A,B,C], call(=(0), A), call(=(0), B), call(=(0), C).

或更简单:

?- Zs = [A,B,C], 0 = A, 0 = B, 0 = C.

如果你想把它定义为一个单独的谓词,记得给它起个好名字。列表的每个元素都是一个零,并且关系描述了这样的零的整个列表。在这种情况下,列表的约定是使用复数词。因此 zeros/1:

zeros([]).
zeros([0|Zs]) :-
   zeros(Zs).