检查列表是否只包含零
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).
我在作业中遇到了一个问题,要求编写一个 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).