在 Prolog 中,可以按随机顺序选择解决方案吗? [英] In Prolog, can solutions be chosen in random order?

查看:29
本文介绍了在 Prolog 中,可以按随机顺序选择解决方案吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有以下几点:

a(X) :- X = 1;X = 2;X = 3;X = 4.

我可以按确定的顺序生成解决方案:

?- a(X).X = 1 ;X = 2 ;X = 3 ;X = 4.

是否有任何方法可以要求系统以非确定性的随机顺序生成解决方案?例如:

?- a(X).X = 4 ;X = 1 ;X = 3 ;X = 2.

我知道我可以找到所有解决方案,然后随机选择一个(findall(X, a(X), Y), random_member(Z, Y).)但这也是对我来说很贵.

<小时>

可能更清楚的例子:

p(X,Y,Z) :-(X = a; X = b; X = c; X = d), % (D1)(Y = a; Y = b; Y = c), % (D2)(Z = a;Z = b;Z = c;Z = d).% (D3)

当确定性时,使用 ?- p(X,Y,Z). 生成解 X = d, Y = c, Z = d 将始终通过之前的 47 个解决方案(4 * 3 * 4 = 48).但是,如果以非确定性顺序选择析取,系统可能会在 D1 处选择 X = d,在 D2 处选择 Y = cZ = d 在 D3,生成它作为第一个解决方案.

这被用于受限的 AI 生成的内容,因此在现实世界的用例中有更多的变量.

解决方案

从你在评论中所说的,我的印象是,对于你的用例来说,一个更重要的问题是:

<块引用>

能否以随机顺序创建解决方案?

(这是因为您说您不能创建所有这些,然后选择一个随机的 .)

要以不同的顺序创建它们,鲍里斯暗示了一个好方法:只需重新排列析取

例如,在您显示的情况下:

<预>p(X, Y, Z) :-(X = a; X = b; X = c; X = d), % (D1)(Y = a; Y = b; Y = c), % (D2)(Z = a;Z = b;Z = c;Z = d).% (D3)

您可以(自动)通过交换顺序来创建此代码段的此类声明等效版本,例如:(X = c ; X = b ; etc.),以及每个这些片段可能会以不同的顺序产生解决方案.

但是,首先将其重写为等效版本可能更容易:

<预>p(X, Y, Z) :-成员(X, [a,b,c,d]),成员(Y, [a,b,c]),成员(Z,[a,b,c,d]).

通过这种方式,可以更轻松地打乱列表并使用随机列表生成解决方案.

例如,您可以将其更改为:

<预>p(X, Y, Z) :-random_member(X, [a,b,c,d]),random_member(Y, [a,b,c]),random_member(Z, [a,b,c,d]).random_member(X, Ls0) :-random_permutation(Ls0, Ls),成员(X,Ls).

现在,您将得到如下答案:

<预>?- p(X, Y, Z).X = d,Y = Z, Z = b ;X = Z, Z = d,Y = b;X = d,Y = b,Z = c;等等.

请注意,这种将随机性纳入您的代码的方式是不纯的:您的程序中现在存在隐式全局状态,并且在描述测试用例等时您无法再轻松地重现所需的结果.对于此类程序.保留

has to make this state explicit, for example by carrying the random seed as one of the arguments, so that each run is completely reproducible.

Note that reordering conjunctions and/or goals like this works only for the pure and monotonic subset of Prolog, so make sure that you use declarative features like constraints to safely exchange goals, and to increase the generality of your code!

这篇关于在 Prolog 中,可以按随机顺序选择解决方案吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆