判断一个列表中的元素个数是否为偶数而不用计数

Determine if the number of elements in a list is even without counting

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

这个不算:

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

如果你的意思是"without arithmetic",那就不一样了。您可以查看 here 如何跳过偶数位置的所有元素的示例。您需要做的事情要简单得多:一次只使用一个列表中的两个元素。

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

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).

不利的是,两个版本都会循环使用所谓的无限列表。