Prolog谓词中的随机化优先级

Prolog谓词中的随机化优先级,prolog,Prolog,Prolog和一阶逻辑的主要区别之一在于谓词中正确部分的优先级的严格规则。我想知道是否有任何方法可以在不放弃正常回溯行为的情况下随机分配此优先级。 特别是,我正在使用SWI Prolog,因此它也是一个只适用于该解释器的好解决方案。虽然在Prolog定理证明器中没有内置的方法将随机性用作搜索策略,但有一些本机函数可以生成随机数,然后可以(以迂回的方式)使用随机选择谓词的哪个实例以供下一步考虑 为了详细说明,您可以在谓词path/n的每个实例中包含两个额外的测试,它们表示谓词保持的0和1范围。此范

Prolog和一阶逻辑的主要区别之一在于谓词中正确部分的优先级的严格规则。我想知道是否有任何方法可以在不放弃正常回溯行为的情况下随机分配此优先级。
特别是,我正在使用SWI Prolog,因此它也是一个只适用于该解释器的好解决方案。

虽然在Prolog定理证明器中没有内置的方法将随机性用作搜索策略,但有一些本机函数可以生成随机数,然后可以(以迂回的方式)使用随机选择谓词的哪个实例以供下一步考虑

为了详细说明,您可以在谓词
path/n
的每个实例中包含两个额外的测试,它们表示谓词保持的0和1范围。此范围
(Lo,Hi)
的选择应确保Hi-Lo=1/k,其中k是谓词
路径/n
在知识库中的实例总数

path(N, ...) :- N >= 0.0, N < 0.2, ...
path(N, ...) :- N >= 0.2, N < 0.4, ...
path(N, ...) :- N >= 0.4, N < 0.6, ...
path(N, ...) :- N >= 0.6, N < 0.8, ...
path(N, ...) :- N >= 0.8, N <= 1.0, ...
路径(N,…)-N>=0.0,N<0.2。。。 路径(N,…):-N>=0.2,N<0.4。。。 路径(N,…):-N>=0.4,N<0.6。。。 路径(N,…):-N>=0.6,N<0.8。。。 路径(N,…):-N>=0.8,N),它前面应该生成一个介于0和1之间的随机浮点,该浮点作为第一个参数传递给
路径/N
;e、 g.
foo:-随机(N),路径(N,…。

当然,随着时间的推移,随着知识库规模的增加,这会变得很麻烦,因此您可能需要编写一个编译器(如DCG编译器),为您生成随机线程。由于使用了诸如
asserta
assertz
之类的谓词,在Prolog中编写这类编译器的工作量并不大

如果您使用这种“随机求导搜索”作为避免无限左递归的方法,那么要知道更好的方法可能只是编写解决方案,使其使用广度优先搜索,而不是Prolog直观的深度优先搜索。这涉及到将一个
State
参数线程化到所有谓词中(相当于一个google:Prolog广度优先)


编辑:Prolog也是高阶逻辑(HOL),除了严格的左求导、第一谓词优先考虑的方式,这导致了左递归的问题。您可以使用Prolog的(HOL)特性来建模一种搜索方法,该方法均匀地考虑所有谓词(假设谓词是纯谓词,没有算术等)。例如,将所有右侧存储为谓词列表
[[p1,p1a1,],[p2,p2a1,…]|!]
,在求值之前将列表随机化,然后通过使用
=…
操作符构建谓词来迭代求值无序的谓词列表,即
X=。。[p1,p1a1,p1a2],X.
此片段中的
X
p1(p1a1,p1a2)
统一,然后搜索可满足性。

这有什么意义?无论如何,没有,没有内置的设备。你能举个简单的例子吗?你说的“优先权”是什么意思?你是说顺序吗?简单地说,左部分是按照它们在程序中比较的顺序执行的:如果一个失败,解释器将返回到另一个谓词。我不确定“左部分”是什么,或者你所说的“它们比较”是什么意思。我认为如果你描述一个你想做的事情的用例会是一个更好的问题。@潜伏者我怀疑这是关于目标选择的顺序,即从左到右。随机化可以模拟一个并行的序言。有点类似,其中一个防护装置是从匹配的防护装置(在构造中)中不确定地选择的。