有人能解释一下这段代码是怎么工作的吗?我是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-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
复制相似问题