如何计算列表中的所有偶数

时间:2015-02-28 18:40:56

标签: count prolog

请帮我详细说明如何计算Prolog列表中的偶数。我是初学者,刚开始学习Prolog。我知道要计算列表中的元素是

mylen([H|Lc],N) :- mylen(Lc,M),N is M+1.
mylen([],0).

我认为在这种情况下定义偶数可能会有所帮助,我想代码可能是这样的:

even(n):-
  N rem 2 =:= 0.

你能帮我把这两个部分放在一起,所以我的代码算偶数吗?我知道我还需要添加一个计数器,但我不知道如何在Prolog中执行此操作。

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

目前,您有两条规则:

(1)空列表中的元素数量为0

my_len([], 0).

(2)列表[H|Lc]中的元素数量为N ,如果列表Lc中的元素数量为{{ 1}} MN

M+1

你已经配备了一个谓词,如果数字是偶数则为真,如果不是则为假: my_len([H|Lc], N) :- my_len(Lc, M), N is M+1. 甚至如果剩余的{{ 1}}除以N时为N

2

现在你可以把它拼凑起来。空列表中偶数元素的数量仍为零。所以你保持规则(1)。您的规则(2)需要更改,因为它需要检查列表的头部是否是偶数。您可以使用Prolog中的两个规则来处理两种不同的情况(列表头是偶数,或列表头是奇数):

(2a)列表0偶数元素的数量为even(N) :- N rem 2 =:= 0. ,如果 [H|Lc] 甚至列表N偶数元素的数量为H { {1}}为Lc

(2b)列表M中的偶数元素的数量为N ,如果 M+1 甚至(或[H|Lc] 奇数),列表{{1}中偶数元素的数量} {} N [请注意,如果H为奇数,则H不会发生变化。]

我会把这两条规则的渲染留给Prolog作为练习。您可以使用Prolog否定函数LcN来测试数字是否不均匀。或者,您可以定义N谓词以用于该案例。

答案 1 :(得分:2)

如果您的Prolog系统提供,则可以将 tcount/3even_truth/2结合使用。以下是:

?- tcount(even_truth, [1,2,3,5,7,9,10], N_even).
N_even = 2.

两个谓词(tcount/3even_truth/2)都是单调并保留!这使它们非常强大并使您 始终获得逻辑上合理的答案

考虑以下更一般的查询:

?- Xs = [_,_,_], tcount(even_truth, Xs, N_even).
Xs = [_A,_B,_C], N_even = 0, _A mod 2 #= 1, _B mod 2 #= 1, _C mod 2 #= 1 ;
Xs = [_A,_B,_C], N_even = 1, _A mod 2 #= 1, _B mod 2 #= 1, _C mod 2 #= 0 ;
Xs = [_A,_B,_C], N_even = 1, _A mod 2 #= 1, _B mod 2 #= 0, _C mod 2 #= 1 ;
Xs = [_A,_B,_C], N_even = 2, _A mod 2 #= 1, _B mod 2 #= 0, _C mod 2 #= 0 ;
Xs = [_A,_B,_C], N_even = 1, _A mod 2 #= 0, _B mod 2 #= 1, _C mod 2 #= 1 ;
Xs = [_A,_B,_C], N_even = 2, _A mod 2 #= 0, _B mod 2 #= 1, _C mod 2 #= 0 ;
Xs = [_A,_B,_C], N_even = 2, _A mod 2 #= 0, _B mod 2 #= 0, _C mod 2 #= 1 ;
Xs = [_A,_B,_C], N_even = 3, _A mod 2 #= 0, _B mod 2 #= 0, _C mod 2 #= 0.