我必须确定列表中元素的数量是否均匀,而不计算它们。 这是我需要在Prolog中解决的问题,所以我想解决方案需要递归。 我正在考虑计算所有元素的频率,然后将它们全部添加,但我不确定这是一个好主意。
答案 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).
它将true
或false
作为实际列表的第二个参数,并且对于既不是列表也不是部分列表的术语将失败。已知的谓词可用作单调if_/3
的条件。
以下更直接的版本无法区分非列表和奇数长度列表:
evenlength([]).
evenlength([_,_|Xs]) :-
evenlength(Xs).
作为一个缺点,两个版本将循环所谓的无限列表。
答案 1 :(得分:0)
这不计算在内:
list_even_length(List, Len) :-
length(List, Len),
Len rem 2 =:= 0.
如果你的意思是"没有算术",这是不同的。您可以看到here示例,了解如何跳过偶数位置的所有元素。你需要做的事情要简单得多:一次只列出两个元素列表。