在之前的练习中,我们有谓词classify/2
% classify(+N, ?Classification)
classify(N, small) :- must_be(number,N), N < 50, !.
classify(N, medium) :- must_be(number,N), N >= 50, N =< 100, !.
classify(N, big) :- must_be(number,N), N > 100.
现在您只需将该谓词应用于列表中的每个元素,实际上就是为该列表中的每个 N 执行查询 classify(N,big) 的析取。
这是一个简单的方法:我们对归纳定义进行编码......
- 如果
N 很大,则以N 开头的非空列表[N|_] 包含一个大元素(并且我们不需要查看列表的其余部分,并且Prolog 不会尝试下一个子句添加!)。
- 如果
More 是包含大元素的列表,则以任何内容开头并以More 继续(可能是也可能不是空列表)的非空列表[_|More] 包含大元素。
contains_big([N|_]) :- classify(N, big),!.
contains_big([_|More]) :- contains_big(More).
就是这样,真的。
所以:
?- contains_big([]).
false.
?- contains_big([1,2,3]).
false.
?- contains_big([1,200,3]).
true.
?- contains_big([200,200,200]).
true.