Prolog和一阶逻辑之间的主要区别之一是严格规则中谓词中正确部分的优先级。我想知道是否有任何方法可以随机化此优先级而不放弃正常的回溯行为。 特别是我正在使用SWI-Prolog,所以它也是一个只适用于该解释器的解决方案。
答案 0 :(得分:2)
虽然在Prolog定理证明器中没有使用随机性作为搜索策略的内置方法,但是有一些本机函数可以生成随机数,然后可以使用它(以迂回的方式)随机化一个实例谓词被选择接下来考虑。
详细说明,您可以在每个谓词path/n
的实例中包含两个附加测试,这些测试表示谓词所包含的0和1范围内的范围。应该选择此范围(Lo, Hi)
,使得Hi - Lo = 1 / k,其中k是谓词path/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, ...
通过嵌入范围,我们可以同时考虑path/n
的所有实例。只要在规则或生产的RHS中调用path/n
(:-
或-->
的权利),就应该在生成0到1之间的随机浮点数之前通过作为path/n
的第一个参数;例如foo :- random(N), path(N, ...).
。
随着知识库的大小增加,这当然会变得很麻烦,因此您可能希望编写一个为您生成随机性线程的编译器(如DCG编译器)。由于像asserta
和assertz
这样的谓词,在Prolog中编写这些类型的编译器出乎意料地没有太多工作。
如果你正在使用这个&#34;随机推导搜索&#34;作为避免无限左递归的方法,要知道一个更好的方法可能只是编写解决方案,以便它使用广度优先搜索而不是Prolog的直观深度优先。这涉及将State
参数线程化为所有谓词(值得谷歌:Prolog广度优先)。
编辑:Prolog也是高阶逻辑(HOL),除了严格的左派生,首先考虑首先谓词的方式,这导致左递归的问题。您可以使用Prolog的(HOL)功能来建模一个均匀考虑所有谓词的搜索方法(假设谓词是纯谓词,没有算术等)。例如,将所有右侧存储为谓词列表[[p1, p1a1,...],[p2,p2a1,...]|_]
,在评估之前随机化列表,然后通过使用=..
运算符构建谓词来迭代地评估混洗的谓词列表,即{ {1}}此代码段中的X =.. [p1, p1a1, p1a2], X.
与X
统一,然后搜索其可信度。