List 确定列表中的元素数是否为偶数而不计数

List 确定列表中的元素数是否为偶数而不计数,list,recursion,prolog,List,Recursion,Prolog,我必须在不计算元素的情况下确定列表中元素的数量是否为偶数。 这是一个我需要在Prolog中解决的问题,所以我想这个解决方案应该是递归的。 我在考虑计算所有元素的频率,然后将它们全部相加,但我不确定这是否是一个好主意。这是不需要计算的: list_even_length(List, Len) :- length(List, Len), Len rem 2 =:= 0. 如果你的意思是“没有算术”,这是不一样的。您可以看到如何在偶数位置跳过所有元素的示例。您需要做的事情要简单得多:

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

这是不需要计算的:

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

如果你的意思是“没有算术”,这是不一样的。您可以看到如何在偶数位置跳过所有元素的示例。您需要做的事情要简单得多:一次只使用一个列表中的两个元素。

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

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
作为实际列表的第二个参数,对于既不是列表也不是部分列表的术语,它将失败。具体化谓词可以用作单调性的条件

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

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

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

您应该在这里展示一些尝试。但是,作为一个很大的提示:请考虑<代码> >,>代码>是一个至少有两个元素的列表。而且,
[]
是0个元素的列表,这是偶数。您可以在递归解决方案中充分利用这一点。:)不清楚你所说的“不计算”是什么意思。必须有某种计数:毕竟,“偶数”是用自然数来定义的。计算频率会有什么帮助?使用列表的长度并检查它是否相等就足够了吗?调用
length/2
会计算列表中的元素。@PauloMoura对其进行任何形式的迭代。@PauloMoura的观点是,
length/2
实际上实现了一个计数器,然而,有一些替代方案可以循环到最后而不必计算,并且可以通过循环的最终状态来确定均匀性。@潜伏者,我明白你的意思,我同意保罗的观点,但这感觉像是一个技术问题。您当然知道,只要用
[]
替换0,用
X
[\u124; X]
替换n和n即可:我们是在计算自然数还是在列表中迭代?是的,这是一个技术问题。语义:)