2015-09-29 38 views
2

我试图使用listsclpfd库生成一个随机长度列表。我已经试过如下:生成限制之间的所有长度的列表

?- use_module(library(clpfd)). 
?- use_module(library(lists)). 

gen_mem_burst(X) :- 
    Len in 1..2, 
    length(X, Len). 

我看到的Prolog首先发现只有一个列表元素,然后用两个元素的解决方案,正如我预期的解决方案。之后,它会发出“超出全局堆栈”的信息。我追踪到它,并且我注意到它一直试图将Len设置为3,4,5,等等。我怎样才能让它停止?

我是序言新手,我甚至不确定这是否是有效的使用模型。在我使用的其他基于约束的语言(例如SystemVerilog)中,这很容易实现。

回答

2

至少在SWI-Prolog中,当涉及约束变量时,length/2无法完全按预期工作:我卡在exact same problem上。有几个很好的答案可以给你指针。

无论如何,回答你的问题的标题:生成随机长度的列表:

?- set_random(seed(1)), /* if you want to seed */ 
    Len is random(9), 
    length(L, Len). 
Len = 2, 
L = [_G2748, _G2751]. 

如果你只需要两个极限之间产生的所有长度列表,

?- between(1, 3, Len), length(L, Len). 

可能是最简单的方法。

+1

我想我选择的标题很差。我的意图是能够产生所有可能性(即,长度为1的列表和长度为2的列表)。我从链接中使用了'fd_length(..)'方法。 –

+0

@Tudor Hm,还不确定。你绝对想为此使用约束变量吗?请参阅我的答案的更新,以获取无需执行的方法。如果你真的不需要在列表长度上放置正确的CLP(FD)约束,那么'fd_length/2'就好,它是一种矫枉过正。 –

+1

使用'between'对于我的需求来说更酷(因为我只需要扫描),但应该记住'fd_length/2'方法应该永远需要为列表长度添加更复杂的约束。 –