你好,我试着写像this一样倒计时的递归
prolog语言
我试着像这样做一些代码:
down(Y,X):- Y>0,K is Y-1,down(K,X).但它的返回值是“false”。我不知道为什么它返回布尔结果...它需要将K值插入到X中。和一般如何做一个递归,一直返回某个数字…
我需要做什么?
tnx很多
发布于 2015-12-22 03:51:13
在谓词中加入副作用(如打印)通常是不好的做法。但另一方面,你的问题并不清楚你想要如何得到递减的值。
无论哪种方式,下面是计数器的逻辑:
down(N, N). % the counter value
down(N, X) :-
succ(N0, N), % one less, until you reach zero
down(N0, X). % next counter value然后,您可以简单地查询:
?- down(3, X).或者,如果您愿意,可以一次打印出所有内容:
?- forall( down(3, X), format("X = ~d~n", [X]) ).有关使用SWI-Prolog的SWISH的演示,请参阅here。
备注:succ/2的使用确保了第一个参数是一个非负整数。使用forall/2进行打印演示了如何使副作用显式显示。
发布于 2015-12-22 02:40:42
false不是您的规则返回的布尔结果。这是一个由Prolog解释器本身返回的结果,表明它无法找到您的查询的答案。
您的down规则规定了当Y大于零时该怎么做,但它并没有说明当Y达到零或低于零时该怎么做。在"Prolog speak“中,你的规则被认为缺少基本子句。
一旦添加了基本子句,您的规则就会成功:
down(Y,_) :- Y < 0.
down(Y,X):-
Y>=0,
write(X), write(' = '), write(Y), nl,
K is Y-1,
down(K,X).现在您需要做的就是确保您的递归规则打印一些东西(demo)。
https://stackoverflow.com/questions/34402191
复制相似问题