首页 > 解决方案 > Prolog:findall,但只保存一些解决方案

问题描述

我发现对于 swi-prolog 它存在 findnsols,但是,它对我不起作用。

我为predicate generate_color(Color)生成随机颜色。

当我尝试调用它 N 次并将执行的值保存在一个列表中时,我总是得到一个结果而不是多个结果。

findnsols(3, Color, generate_color(Color),Colors).

颜色 = [“# 4c4b43”]。

findnsols(3, Color, generate_color(Color),Colors).

颜色 = [“# 158955”]。

findnsols (300, Color, generate_color (Color), Colors).

颜色 = [“# 5d67e1”]。

有谁知道我什至可以在列表中获得我想要的 Nsolutions 的任何方式?

预期输出:

findnsols(3, Color, generate_color(Color),Colors).

颜色 = [“#5d67e1”、“#4c4b43”、“#158955”]。

标签: listprolog

解决方案


我假设generate_color只返回一种颜色(即,在给出第一个解决方案后你不能按;)。

因此,findnsols不起作用,因为它基于回溯工作,即再次输入您的目标并尝试找到进一步的解决方案。

我建议类似以下的解决方案:

length(Colors, 10), maplist(generate_color, Colors).

这定义了一个Colors长度为 10 的列表,其中所有条目都必须对应generate_color(有关更多信息,请参阅maplist


相关示例:

random生成一个随机数

?- findnsols(3, N, random(0, 100, N), Rands).
Rands = [33].

?- length(Rands, 10), maplist(random(0,100), Rands).
Rands = [85, 92, 81, 66, 98, 15, 74, 95, 56|...].

推荐阅读