【问题标题】:How to count all even numbers in a list如何计算列表中的所有偶数
【发布时间】:2015-02-28 18:40:56
【问题描述】:

请帮助我计算 Prolog 列表中的偶数。我是初学者,昨天刚开始学习Prolog。我知道要计算列表中的元素是

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

我认为在这种情况下定义偶数可能会有所帮助,我猜代码可能类似于:

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

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

非常感谢您的帮助!

【问题讨论】:

  • 如果N 是偶数,even(N) :- N rem 2 =:= 0. 将是 true。首先尝试更清楚地描述您的谓词。例如,一个没有偶数的空列表mylen([], 0). 你可以有另一个规则说,一个列表[H|T], has N even numbers if H是偶数,TN1 偶数,NN1 + 1。或者,如果H 是奇数,则列表[H|T]N 偶数,而TN 偶数。
  • 感谢您的帮助。但是我不知道如何在prolog中使用if语句。
  • 这不是if 声明,本身。当您编写诸如foo(X,Y) :- bar(X), bah(Y). 之类的谓词规则时,这意味着,foo(X,Y) 为真if bar(X) 为真并且 bah(Y) 为真。您的谓词mylen([H|Lc],N) :- mylen(Lc,M),N is M+1. 表示,[H|Lc] 的长度是N 如果Lc 的长度是M NM+1

标签: count prolog


【解决方案1】:

目前,您有两条规则:

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

my_len([], 0).

(2) 列表[H|Lc]的元素个数是N如果列表Lc的元素个数是MNM+1

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

你已经掌握了一个谓词,如果一个数字是偶数则为真,如果不是,则为假:N 是偶数 if N 的余数时除以2 就是0

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

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

(2a) 列表[H|Lc] 中的偶数 个元素是N if H偶数列表Lc偶数元素的数量是MNM+1

(2b) 列表[H|Lc]偶数 元素的数量是N 如果 H不偶数(或H奇数),并且列表Lc偶数元素的数量是N [请注意,如果H 是奇数,N 不会改变。]

我将把这两个规则的呈现留给 Prolog 作为练习。您可以使用 Prolog 否定函子 \+ 来测试一个数字是否不是偶数,通过 \+ even(N)。或者您可以定义一个odd(N) :- N rem 2 =:= 1. 谓词以用于该情况。

【讨论】:

  • 1非常感谢您的帮助。我会努力完成练习。再次感谢你!。很有帮助!
  • @perryfanfan 我很高兴我的回答很有帮助。也许你可以接受它作为答案。
【解决方案2】:

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

?- tcount(even_truth, [1,2,3,5,7,9,10], N_even)。 N_偶数 = 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.

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多