如何使用PROLOG计算奇数和偶数

发布于 2024-09-24 15:20:09 字数 340 浏览 4 评论 0原文

问题是:

当我们输入 mem([1,2,3,4,5]) 时。

我们将得到如下输出:

odd=3

Even=2

我的编码是这样的,但无法运行。可以帮我检查一下我的错误在哪里吗?

内存(X,[X | L])。

mem(X,[元素|L]):- 内存([X,L])。

计数([],L,L)。

计数([X | H],L1,L2):- 写(偶数), X%2=0,nl, 写(奇数), X%2>=1,nl, 计数([H],[X|L1],L2)。

感谢您的帮助。

question is:

when we key in mem([1,2,3,4,5]).

we will get the output as bellow:

odd=3

even=2

my coding is like that but cannot run. can help me check where is my mistake??

mem(X,[X|L]).

mem(X,[element|L]):-
mem([X,L]).

count([],L,L).

count([X|H],L1,L2):-
write(even),
X%2=0,nl,
write(odd),
X%2>=1,nl,
count([H],[X|L1],L2).

thanks for your helping.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梨涡少年 2024-10-01 15:20:09

您编写的过程执行两种不同的操作,并且实际上并不属于一起。 mem/2 等同于通常内置的 member/2,只不过您的定义包含错误:在第二个子句中 element 是一个原子变量,因此它不会匹配列表中的其他元素。通常的定义是

member(X, [X|_]).
member(X, [_|L]) :- member(X, L).

请注意,此定义不仅会测试术语是否是列表的元素,而且甚至可以用于生成列表。

您到底想在 count/3 中做什么:将列表拆分为两个列表,一个包含奇数,另一个包含偶数;或者计算奇数和偶数元素的数量?可以通过以下方式完成拆分:

count([], [], []).
count([X|L], O, E) :- X rem 2 =/= 0, count(L, [X|O], E).
count([X|L], O, E) :- X rem 2 =:= 0, count(L, O, [X|E]).

请注意,=/= /2=:= / 2 强制将参数计算为算术表达式,而 = /2 试图统一其论点。

可以用类似的方式计算奇数和偶数的数量,并留给读者作为练习。 :-)

The procedures you have written do two different things and don't actually belong together. mem/2 is equivalent to the usually builtin member/2 except that your definition contains an error: in the second clause element is an atom instead of a variable so it will not match other elements of the list. The usual definition is

member(X, [X|_]).
member(X, [_|L]) :- member(X, L).

Note that this definition will not only test if a term is an element of a list but can even be use to generate a list.

What exactly are you trying to do in count/3: split the list into two lists, one containing odd and the other containing even; or count the number of odd and even elements? The splitting could be done with something like:

count([], [], []).
count([X|L], O, E) :- X rem 2 =/= 0, count(L, [X|O], E).
count([X|L], O, E) :- X rem 2 =:= 0, count(L, O, [X|E]).

Note that =/= /2 and =:= / 2 force evaluation of arguments as arithmetic expressions while = /2 attempts to unify its arguments.

Counting the number of odds and evens can be done in a similar fashion, and is left as an exercise for the reader. :-)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文