【问题标题】:Randomizing priority in Prolog predicatesProlog 谓词中的随机优先级
【发布时间】:2017-08-14 18:50:16
【问题描述】:

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

【问题讨论】:

  • 这是什么意思?无论如何,不​​,没有内置工具。
  • 你能举个简单的例子吗? “优先级”是什么意思?你是说订单吗?
  • 简单地说,左边的部分是按照它们在程序中比较的顺序执行的:如果一个失败,解释器会回溯到另一个谓词。
  • 我不确定“左侧部分”是什么,或者您所说的“它们比较”是什么意思。我认为如果您描述一个您正在尝试做的用例,这将是一个更好的问题。
  • @lurker 我怀疑这是关于目标选择的顺序,即从左到右。随机化可能会模拟一个 parallel Prolog。有点像guarded command language by Dijkstra,从匹配的守卫中不确定地选择守卫(在do 构造中)。

标签: prolog


【解决方案1】:

虽然在 Prolog 定理证明器中没有使用随机性作为搜索策略的内置方法,但那里有本地函数来生成随机数,然后可以使用(以迂回的方式)随机化 a 的哪个实例接下来选择谓词进行考虑。

更详细地说,您可能会在谓词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 的所有实例都同样可能被考虑。每当 path/n 在规则或产生式的 RHS 中调用时(:---&gt; 的右侧),它之前应该生成一个介于 0 和 1 之间的随机浮点数,该浮点数作为第一个参数传递给 @ 987654329@;例如foo :- random(N), path(N, ...)..

随着时间的推移,随着知识库规模的增加,这当然会变得很麻烦,因此您可能想要编写一个编译器(如 DCG 编译器)来为您生成随机线程。多亏了 assertaassertz 这样的谓词,在 Prolog 中编写这些类型的编译器并不令人惊讶。

如果您使用这种“随机推导搜索”作为避免无限左递归的方法,请知道更好的方法可能只是编写解决方案,使其使用广度优先搜索而不是 Prolog 直观的深度优先.这涉及将State 参数插入所有谓词(值得谷歌:Prolog 广度优先)。

编辑:Prolog 也是高阶逻辑(HOL),除了严格的左推导,先谓词先考虑的方式,这会导致左递归的问题。您可以使用 Prolog 的 (HOL) 功能来建模一种搜索方法,该方法均匀地考虑所有谓词(假设谓词是纯谓词,没有算术等)。例如,将所有右侧存储为谓词列表[[p1, p1a1,...],[p2,p2a1,...]|_],在评估之前随机化列表,然后通过使用=.. 运算符构建谓词迭代地评估打乱的谓词列表,即X =.. [p1, p1a1, p1a2], X. @这个sn-p中的987654337@与p1(p1a1,p1a2)统一,然后搜索可满足性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多