我正在尝试使用lists
和clpfd
库生成随机长度列表。我尝试了以下内容:
?- use_module(library(clpfd)).
?- use_module(library(lists)).
gen_mem_burst(X) :-
Len in 1..2,
length(X, Len).
我看到Prolog首先找到一个只包含一个列表元素的解决方案,然后找到一个包含两个元素的解决方案,就像我预期的那样。之后它会发出'out of global stack'消息。我追踪它,我注意到它一直试图将Len
设置为3,4,5,......等等。我怎么能让它停下来?
我是Prolog的新手,我甚至不确定这是否是一个有效的使用模式。在我使用的其他基于约束的语言(例如SystemVerilog)中,这很容易实现。
答案 0 :(得分: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).
可能是最简单的方法。