判断一个列表中的元素个数是否为偶数而不用计数
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).
它将给出 true
或 false
作为实际列表的第二个参数,并且对于既不是列表也不是部分列表的术语将失败。具体化谓词可用作单调 if_/3
.
的条件
以下更直接的版本无法区分非列表和奇数长度的列表:
evenlength([]).
evenlength([_,_|Xs]) :-
evenlength(Xs).
不利的是,两个版本都会循环使用所谓的无限列表。
我必须在不计算列表的情况下确定列表中的元素数量是否为偶数。 这是我需要在 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).
它将给出 true
或 false
作为实际列表的第二个参数,并且对于既不是列表也不是部分列表的术语将失败。具体化谓词可用作单调 if_/3
.
以下更直接的版本无法区分非列表和奇数长度的列表:
evenlength([]).
evenlength([_,_|Xs]) :-
evenlength(Xs).
不利的是,两个版本都会循环使用所谓的无限列表。