生成限制之间所有长度的列表

时间:2015-09-29 06:41:12

标签: prolog clpfd

我正在尝试使用listsclpfd库生成随机长度列表。我尝试了以下内容:

?- 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)中,这很容易实现。

1 个答案:

答案 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).

可能是最简单的方法。