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

Generate lists of all lengths between limits

我正在尝试使用 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),这很容易实现。

至少在 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).

可能是最简单的方法。