请帮我详细说明如何计算Prolog列表中的偶数。我是初学者,刚开始学习Prolog。我知道要计算列表中的元素是
mylen([H|Lc],N) :- mylen(Lc,M),N is M+1.
mylen([],0).
我认为在这种情况下定义偶数可能会有所帮助,我想代码可能是这样的:
even(n):-
N rem 2 =:= 0.
你能帮我把这两个部分放在一起,所以我的代码算偶数吗?我知道我还需要添加一个计数器,但我不知道如何在Prolog中执行此操作。
非常感谢你的帮助!
答案 0 :(得分:2)
目前,您有两条规则:
(1)空列表中的元素数量为0
my_len([], 0).
(2)列表[H|Lc]
中的元素数量为N
,如果列表Lc
中的元素数量为{{ 1}} 和 M
为N
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否定函数Lc
来N
来测试数字是否不均匀。或者,您可以定义N
谓词以用于该案例。
答案 1 :(得分:2)
如果您的Prolog系统提供clpfd,则可以将meta-predicate tcount/3
与even_truth/2
结合使用。以下是:
?- tcount(even_truth, [1,2,3,5,7,9,10], N_even). N_even = 2.
两个谓词(tcount/3
和even_truth/2
)都是单调并保留logical-purity!这使它们非常强大并使您
始终获得逻辑上合理的答案。
考虑以下更一般的查询:
?- 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.