有人能解释一下这段代码是怎么工作的吗?我是Prolog的新手,像Prolog程序员一样思考有问题。当您输入一个后跟逗号和任何变量名的数字时,它会给出该数字的总和
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。
发布于 2021-03-01 00:23:20
您的定义可以等效地写为
sum_to( N, R) :- N = 1, R = 1, !.
sum_to( N, R) :- N1 is N-1, sum_to( N1, R1), R is R1+N.这是一个递归定义--它包含对与谓词本身相同的谓词的调用。在你总是以一个自由变量作为第二个参数,一个具体的(希望是正的)数字作为第一个参数的情况下,它表示一个函数,该函数根据给定的第一个参数计算第二个参数的值。
因此,你得到的是一个递归函数定义。
现在让我们通过一些例子,从最简单的到逐渐变得越来越复杂的:
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.对吧?当执行从左到右通过目标时,我们的变量一个接一个地采用它们的具体值,从而能够执行下一个目标,以及下一个
实例化
还有更多的变量,直到最终的值变得已知。
现在就做吧
..。
发布于 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的正确性。我这样做是合理的吗?)
https://stackoverflow.com/questions/66410448
复制相似问题