首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >符合给定范围的Prolog生成数

符合给定范围的Prolog生成数
EN

Stack Overflow用户
提问于 2011-08-24 20:17:42
回答 3查看 24.5K关注 0票数 11

我想使用这样的谓词:

代码语言:javascript
复制
range(X,0,5)
range(X,4,200)
range(X,-1000000,1000000)
dom_range(X,-1000000,1000000)

意思是:

代码语言:javascript
复制
range(X,0,5) :- member(X,[0,1,2,3,4,5]).
range(X,4,200) :- member(X,[4,5,6...198,199,200]).
range(X,-1000000,1000000) :- member(X,[-1000000,...,1000000]).
dom_range(X,-1000000,1000000) :- domain(X, [-1000000,...,1000000]).

如何在Prolog中很好地编写代码(考虑到解决方案的性能-递归深度等)?

解决方案预计将在GNU-Prolog上运行。

附注:由this question启发的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-24 21:00:29

SWI-Prolog有谓词between/3。因此,您可以将其称为介于(0,5,X)之间,以获得上面显示的结果。这个谓词看起来像是用C实现的。

如果我们必须用纯prolog编写它(速度和空间不是一个因素),你可以尝试下面的方法。

代码语言:javascript
复制
range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, range(Out, NewLow, High).
票数 14
EN

Stack Overflow用户

发布于 2011-12-23 02:42:08

Dave的答案几乎是完美的:不需要检查low < high。我添加了一个条件,现在它工作得很好(否则它会生成从低到无穷大的数字):

代码语言:javascript
复制
range(Low, Low, High).
range(Out,Low,High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High).

希望这能有所帮助!

票数 12
EN

Stack Overflow用户

发布于 2011-08-27 17:49:46

Gnu中的range可以用有限域求解

代码语言:javascript
复制
range(X,Low,High) :- fd_domain(X,Low,High).

我不知道dom_range(X,L,H) :- fd_domain(X,L,H)是不是。

附注:当使用有限域时,您可能希望使用fd_set_vector_max/1

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

https://stackoverflow.com/questions/7175258

复制
相关文章

相似问题

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