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

Prolog 生成限制之间所有长度的列表,prolog,clpfd,Prolog,Clpfd,我试图使用列表和clpfd库生成一个随机长度的列表。我尝试了以下方法: ?- use_module(library(clpfd)). ?- use_module(library(lists)). gen_mem_burst(X) :- Len in 1..2, length(X, Len). 我看到Prolog首先找到一个只有一个列表元素的解决方案,然后是一个有两个元素的解决方案,正如我所期望的那样。之后,它会发出一条“超出全局堆栈”的消息。我跟踪它,发现它一直试图将Len设

我试图使用
列表
clpfd
库生成一个随机长度的列表。我尝试了以下方法:

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

gen_mem_burst(X) :-
    Len in 1..2,
    length(X, Len).
我看到Prolog首先找到一个只有一个列表元素的解决方案,然后是一个有两个元素的解决方案,正如我所期望的那样。之后,它会发出一条“超出全局堆栈”的消息。我跟踪它,发现它一直试图将
Len
设置为3,4,5。。。等等我怎样才能让它停下来


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

至少在SWI Prolog中,
length/2
在涉及约束变量时不能完全按照预期工作:我被卡在了问题上。有几个很好的答案可以给你指点

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

?- 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的列表和长度为2的列表)。我在你的链接中使用了
fd\u length(..)
方法。@Tudor-Hm,仍然不确定。是否确实要为此使用约束变量?请参阅我的答案的更新,以了解无需修改的方法。如果你真的不需要对列表长度设置适当的CLP(fd)约束,那么
fd_length/2
,尽管它很好,但它是一个过分的限制。对于我的要求来说,使用
between
更酷(因为我只需要扫描),但是,如果我需要向列表长度添加更复杂的约束,最好记住
fd_length/2
方法。