2011-08-24 41 views
6

我想使用断言,如:序言 - 拟合给定数字生成列表范围

range(X,0,5) 
range(X,4,200) 
range(X,-1000000,1000000) 
dom_range(X,-1000000,1000000) 

与意义:

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上运行。

P.S.问题的启发是this question

回答

11

SWI-Prolog的谓词between/3。所以你可以在(0,5,X)之间调用它来获得上面显示的结果。这个谓词看起来像是在C中实现的。

如果我们必须写在纯序言中(并且速度&空间不是一个因素),你可以尝试以下。

range(Low, Low, High). 
range(Out,Low,High) :- NewLow is Low+1, range(Out, NewLow, High). 
+0

是否适用于'domain()'? –

+0

究竟是什么域?我无法告诉你在上述情况下你期望的dom_range。这是另一种将参数传递给范围的方法吗? dom_range(Out,[Low,High]): - 范围(Out,Low,High)。 – DaveEdelstein

+0

我在[本教程](http://wazniak.mimuw.edu.pl/index.php?title=Sztuczna_inteligencja/SI_Modu%C5%82_3_-_Wnioskowanie_w_PROLOG-u)上阅读过有关“域名”的内容,但我是不确定细节,因为我是Prolog初学者。在检查Gnu-Prolog手册时,我发现[fd_domain/3](http://www.gprolog.org/manual/gprolog.html#htoc321),指定为[fd_domain(+ fd_variable_list_or_fd_variable,+ integer,+ integer) ](http://www.gprolog.org/manual/gprolog.html#htoc321) - 你觉得如何?可能是另一种解决方案? –

0

在GNU的序言range可以用有限域

range(X,Low,High) :- fd_domain(X,Low,High). 

来解决,我不知道是否dom_range(X,L,H) :- fd_domain(X,L,H)

P.S.当有限域玩,你可能会想用fd_set_vector_max/1

9

戴夫的回答几乎是完美的:没有检查,看看是否低<高。我添加了一个条件,现在它工作正常(否则它会生成数字从低到无穷):

range(Low, Low, High). 
range(Out,Low,High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High). 

希望帮助!