首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog countDown

Prolog countDown
EN

Stack Overflow用户
提问于 2015-12-22 02:35:10
回答 2查看 1K关注 0票数 3

你好,我试着写像this一样倒计时的递归

prolog语言

我试着像这样做一些代码:

代码语言:javascript
复制
down(Y,X):- Y>0,K is Y-1,down(K,X).

但它的返回值是“false”。我不知道为什么它返回布尔结果...它需要将K值插入到X中。和一般如何做一个递归,一直返回某个数字…

我需要做什么?

tnx很多

EN

回答 2

Stack Overflow用户

发布于 2015-12-22 03:51:13

在谓词中加入副作用(如打印)通常是不好的做法。但另一方面,你的问题并不清楚你想要如何得到递减的值。

无论哪种方式,下面是计数器的逻辑:

代码语言:javascript
复制
down(N, N). % the counter value
down(N, X) :-
    succ(N0, N), % one less, until you reach zero
    down(N0, X). % next counter value

然后,您可以简单地查询:

代码语言:javascript
复制
?- down(3, X).

或者,如果您愿意,可以一次打印出所有内容:

代码语言:javascript
复制
?- forall( down(3, X), format("X = ~d~n", [X]) ).

有关使用SWI-Prolog的SWISH的演示,请参阅here

备注:succ/2的使用确保了第一个参数是一个非负整数。使用forall/2进行打印演示了如何使副作用显式显示。

票数 2
EN

Stack Overflow用户

发布于 2015-12-22 02:40:42

false不是您的规则返回的布尔结果。这是一个由Prolog解释器本身返回的结果,表明它无法找到您的查询的答案。

您的down规则规定了当Y大于零时该怎么做,但它并没有说明当Y达到零或低于零时该怎么做。在"Prolog speak“中,你的规则被认为缺少基本子句。

一旦添加了基本子句,您的规则就会成功:

代码语言:javascript
复制
down(Y,_) :- Y < 0.

down(Y,X):-
    Y>=0,
    write(X), write(' = '), write(Y), nl,
    K is Y-1,
    down(K,X).

现在您需要做的就是确保您的递归规则打印一些东西(demo)。

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

https://stackoverflow.com/questions/34402191

复制
相关文章

相似问题

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