prolog 中累加器的问题

发布于 2024-10-04 05:30:45 字数 464 浏览 6 评论 0原文

在学习 Prolog 时,我尝试使用累加器解决以下问题:

编写一个谓词 addone2/,其第一个参数是整数列表,第二个参数是通过将第一个列表中的每个整数加 1 获得的整数列表。例如,查询

 addone([1,2,7,2],X).

应该给

<前><代码> X = [2,3,8,3]。

我创建的以下代码:

addone([], _).
addone([E|Tail], [R|Rs]) :-
    NewE is E+1,
    append([R|Rs], [NewE], NewRs),
    addone(Tail, NewRs).

但它不起作用。有人能告诉我为什么吗?那么,如何在 Prolog 中使用累加器呢?

谢谢!

While learning Prolog, I'm trying to solve the following problem, using accumulators:

Write a predicate addone2/ whose first argument is a list of integers, and whose second argument is the list of integers obtained by adding 1 to each integer in the first list. For example, the query

       addone([1,2,7,2],X).

should give

       X = [2,3,8,3].

I created the following code:

addone([], _).
addone([E|Tail], [R|Rs]) :-
    NewE is E+1,
    append([R|Rs], [NewE], NewRs),
    addone(Tail, NewRs).

But it's not working. Can someone tell me why? So, how do I use accumulators in Prolog?

Thanks!

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

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

发布评论

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

评论(2

盛夏尉蓝 2024-10-11 05:30:45

Anthares 是正确的,因为你必须完善你的基本情况。但是,您的 append 调用也会使事情变得非常低效。在 Prolog 中,需要一些时间来习惯统一的力量,但例如,在本例中,它可以帮助您立即设置结果列表。尝试以下操作:

addone([E|Tail], [E1|Rs]) :-
    E1 is E+1,
    addone(Tail, Rs).

这就是全部内容了。通过立即将 E1 放入第二个参数的模式中,您已经创建了结果列表的第一个元素。剩余元素 Rs 将在递归过程中创建。一个非常典型的 Prolog 模式。

anthares is correct in that you have to refine your base case. However, you are also making things very inefficiently with your append calls. In Prolog, it takes some time to get used to the power of unification, but for example, in this case it helps you to immediately set up your result list. Try the following:

addone([E|Tail], [E1|Rs]) :-
    E1 is E+1,
    addone(Tail, Rs).

That's really all there is to it. By immediately placing E1 in your second argument's pattern, you have already created the first element of your result list. The remaining elements Rs will be created during the recursion. A very typical Prolog pattern.

星星的軌跡 2024-10-11 05:30:45

递归的底部应该是 addone([],[]). 以便 NewRs 与 [] 连接

The bottom of your recursion should be addone([],[]). in order NewRs to be connected with the []

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