我有这个谓词,可以给我列表中元素的数量。
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.
但是我要6个,但是要3个。我该如何更改谓词呢?
谢谢!
答案 0 :(得分:1)
如果列表中元素的数量为奇数,则您没有说要发生什么。但我假设在这种情况下您想要一个结果。
蛮力但简单的方法是使用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.