检查列表是否仅包含零

时间:2015-05-29 07:04:56

标签: prolog

我的作业中有一个问题是要求编写一个Prolog程序,该程序将数字列表作为输入,如果列表成功则成功 仅包含?- zero([0,0,0,0]).

我在如何使程序搜索零时遇到问题。例如,查询如:

QString str = "  lots\t of\nwhitespace\r\n ";
str = str.trimmed();
// str == "lots\t of\nwhitespace"

应该给我们为真,只要其中有一个非零数字,它就应该返回false。

2 个答案:

答案 0 :(得分:1)

你为什么要我们为你做功课? 无论如何,这是非常简单的递归。类似的东西:

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

在你的清单为空之前,一直保持零的剥离。它不是那么难;)

答案 1 :(得分:1)

通常,人们不会为此定义正确的谓词,而是使用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).