确定列表中的元素数量是否均匀计数

时间:2015-10-21 15:25:21

标签: list recursion prolog

我必须确定列表中元素的数量是否均匀,而不计算它们。   这是我需要在Prolog中解决的问题,所以我想解决方案需要递归。   我正在考虑计算所有元素的频率,然后将它们全部添加,但我不确定这是一个好主意。

2 个答案:

答案 0 :(得分:3)

这是一个纯粹的,具体化的版本:

evenlength_t([], true).
evenlength_t([_|Xs], T) :-
   i_evenlength_t(Xs, T).

i_evenlength_t([], false).
i_evenlength_t([_|Xs], T) :-
   evenlength_t(Xs, T).

它将truefalse作为实际列表的第二个参数,并且对于既不是列表也不是部分列表的术语将失败。已知的谓词可用作单调if_/3的条件。

以下更直接的版本无法区分非列表和奇数长度列表:

evenlength([]).
evenlength([_,_|Xs]) :-
   evenlength(Xs).

作为一个缺点,两个版本将循环所谓的无限列表。

答案 1 :(得分:0)

这不计算在内:

list_even_length(List, Len) :-
    length(List, Len),
    Len rem 2 =:= 0.

如果你的意思是"没有算术",这是不同的。您可以看到here示例,了解如何跳过偶数位置的所有元素。你需要做的事情要简单得多:一次只列出两个元素列表。