gpt4 book ai didi

prolog - 在Prolog中,可以按随机顺序选择解决方案吗?

转载 作者:行者123 更新时间:2023-12-02 06:43:04 25 4
gpt4 key购买 nike

如果我有以下内容:

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 code> 在 D3,将其生成为第一个解决方案。

这用于受限的人工智能生成内容,因此现实世界用例中存在更多变量。

最佳答案

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

Can solutions be created in random order?

(这是因为您说您无法将它们全部创建,然后选择随机一个。)

为了以不同的顺序创建它们,鲍里斯暗示了一个好方法:简单地重新排序析取!

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

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) :-    member(X, [a,b,c,d]),    member(Y, [a,b,c]),    member(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),    member(X, Ls).

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

?- p(X, Y, Z).X = d,Y = Z, Z = b ;X = Z, Z = d,Y = b ;X = d,Y = b,Z = c ;etc.

请注意,这种将随机性合并到代码中的方法是不纯的:您的程序中现在存在隐式全局状态,并且您无法再轻松地重现描述测试用例等时所需的结果。对于这样的程序。保留 的解决方案 必须使此状态显式,例如通过携带随机种子作为参数之一,以便每次运行都完全可重现。

请注意,像这样的重新排序连词和/或目标仅适用于 Prolog 的单调子集,因此请确保您使用诸如之类的声明性功能约束以安全地交换目标,并提高代码的通用性!

关于prolog - 在Prolog中,可以按随机顺序选择解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41413517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com