我有这个谓词,它给出了列表中元素的数量。
get_elements([],0).
get_elements([_|Tail], N) :- get_elements(Tail, N1), N is N1 + 1.
?- get_elements([1,1,1,1,1,1],N).
N = 6.
但相反,我想要3.我怎么能改变我的谓词才能做到这一点?
谢谢!
如果列表中包含奇数个元素,您还没有说出要发生的事情。但我会假设你想要一个结果。
蛮力但简单的方法是使用length/2
:
count_half(List, HalfCount) :- length(List, N), HalfCount is N div 2.
对于具有奇数个元素的列表,它将给出元素数量的一半减去1(例如,7个元素将产生3的结果)。
一个简单的递归方法(对列表处理更有启发性)是稍微改变一下你的实现:
count_half([], 0).
count_half([_,_|Tail], N) :-
count_half(Tail, N1),
N is N1 + 1.
这将计算每对元素。唯一的缺点是,如果存在奇数个元素,则会导致失败。这可以通过一个额外的基本案例来弥补:
count_half([], 0).
count_half([_], 0).
count_half([_,_|Tail], N) :-
count_half(Tail, N1),
N is N1 + 1.