首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Prolog编写求和程序

用Prolog编写求和程序
EN

Stack Overflow用户
提问于 2021-02-28 23:07:35
回答 2查看 97关注 0票数 2

有人能解释一下这段代码是怎么工作的吗?我是Prolog的新手,像Prolog程序员一样思考有问题。当您输入一个后跟逗号和任何变量名的数字时,它会给出该数字的总和

代码语言:javascript
复制
sum_to(1,1) :- !.
sum_to(N, R) :- N1 is N-1, sum_to(N1,TR), R is TR + N.

所以求和

_

to(4,N)表示N= 10。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-01 00:23:20

您的定义可以等效地写为

代码语言:javascript
复制
sum_to( N, R) :- N = 1, R = 1, !.
sum_to( N, R) :- N1 is N-1, sum_to( N1, R1), R is R1+N.

这是一个递归定义--它包含对与谓词本身相同的谓词的调用。在你总是以一个自由变量作为第二个参数,一个具体的(希望是正的)数字作为第一个参数的情况下,它表示一个函数,该函数根据给定的第一个参数计算第二个参数的值。

因此,你得到的是一个递归函数定义。

现在让我们通过一些例子,从最简单的到逐渐变得越来越复杂的:

代码语言:javascript
复制
sum_to( 1, R1) :- 1 = 1, R1 = 1, !.
                  \______________/
                         R1 = 1.

sum_to( 2, R2) :- N1 is 2-1, sum_to( N1, R1), R2 is R1+2.
                  \________/
                    N1 is 1, sum_to( 1, R1),
                             \____________/
                                      R1 = 1, R2 is 1+2   
                  \_____________________________________/
                                              R2 = 3.

sum_to( 3, R3) :- N2 is 3-1,  sum_to( N2, R2),        R3 is R2+3.
                  \________/
                    N2 is 2,   sum_to( 2, R2),
                               \____......____/
                                \__________________/
                                              R2 = 3, R3 is 3+3   
                  \_____________________________________________/
                                                      R3 = 6.

对吧?当执行从左到右通过目标时,我们的变量一个接一个地采用它们的具体值,从而能够执行下一个目标,以及下一个

实例化

还有更多的变量,直到最终的值变得已知。

现在就做吧

..。

票数 0
EN

Stack Overflow用户

发布于 2021-02-28 23:44:53

这是一个非常命令式的程序,实现了用Prolog编写的归纳定义。

它与两个数字相关:

在第一个子句中,1与1相关。指示解释器应停止在和中查找进一步的解决方案。

_

to/2谓词。

如果第一个子句不匹配(因为调用中的任何参数与1不同),则检查第二个子句。

现在我们简单地说:

将N1计算为N-1

使用N1进行递归调用,并在TR中获取一个值,以便N1和TR通过

(即TR应该是所有整数的总和,直到N1)。一旦我们得到它,我们就计算R为TR和N的和。

总和

_

to关系是正确的,因为第一个参数是1。

总和

_

在N处的关系是正确的,如果和

_

对于N-1,to关系是正确的。

如果递归调用在每次调用时“使某些东西变得更小”,并且最终会达到一个最小值,则计算将终止。它确实在每次调用时使N更小,最终将达到1。(除非使用0 N或更小的值调用此谓词。然后:灾难!)

看起来不错。

(顺便说一句,归纳定义倾向于从常数x到+oo,即“向上”;上面我说的是从任何N向下到1的正确性。我这样做是合理的吗?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66410448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档