生成限制之间所有长度的列表
Generate lists of all lengths between limits
我正在尝试使用 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),这很容易实现。
至少在 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).
可能是最简单的方法。
我正在尝试使用 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),这很容易实现。
至少在 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).
可能是最简单的方法。