NU-Prolog 和 Gödel 的逻辑和合理的“if-then-else”扩展

问题描述

关于 paper 说明如下:

大多数 Prolog 变体中的 if-then-else 和否定结构都是非逻辑和不合理的:它们会导致系统计算与被视为逻辑理论的程序不一致的答案。一些现有的逻辑编程系统,例如 NU-Prolog 和 Gödel,为这些 Prolog 结构提供了逻辑和合理的替代。不幸的是,这些系统通过运行时基础检查来加强安全性。这种效果可以将程序的运行时间增加任意大的系数;如果检查基础性的目标包含大量条款,则检查可能会非常昂贵。

NU-Prolog 和 Gödel 看起来相当死和不自由,但我仍然想知道:

  • 这些符合逻辑且合理的 if-then-else 替换是什么?
  • 他们在 SWI 或 GNU Prologs 中是否有类似物?
  • 它们是如何工作的?他们如何工作?向 Prolog 添加逻辑否定会将其变成通用 FOL,对吗?您基本上需要一个通用的 FOL 定理证明器来使用它?
  • 它们与if_/3有什么不同吗? if_/3 必须扩展以用于新条件。是否也必须在 NU-Prolog 和 Gödel 中这样做?

解决方法

if-then-else 的突破可能是一个新的注释。 通过注释,我理解模式声明之类的东西, 确定性声明等。对于 if then else,a 完整的声明会很好。让我们假设我们可以 声明谓词或内置 p/n 完整。这个会 意味着它具有基本参数 t1,..,tn 的属性:

   T |- p(t1,tn)

- or -

   T |- ~p(t1,tn)

或者简而言之,如果理论 T 是递归可枚举的,那么它将是一个可判定的谓词。如果我们回忆一下 if-then-else 在逻辑上是这样的:

    ITE(A,B,C) == (A => B) & (~A => C)

然后我们可以使用完整的注释如下。让我们 假设 A = p(t1,tn)。由于注释Prolog 系统会尝试证明 A。如果它不成功,因为 在完整的注释中,Prolog 系统可以推断出 ~A 会成功。因此它可以使用 else 分支 没有~A的证明尝试。

但有趣的是,这已经是 ISO 核心 标准 if-then-else 确实如此,(A->B;C) 也仅证明 一次。所以有什么问题?我想问题是 A 可能更复杂,不一定是接地的。 甚至谓词 p/n 可能不完整,或者 我们甚至不知道它是否完整。总而言之 在这些情况下,ISO 核心标准仍然允许 我们使用 (A->B;C)。

groundness 问题有时可以通过使用运行时来解决 基础检查。这可能就是 Mercury 所指的:

    when(ground(A),(A->B;C))

SWI-Prolog 甚至应用了一个技巧来制作基础 检查更便宜,另请参阅有关 Discourse 的更多discussion

%!  trigger_ground(@Term,:Goal)
%
%   Trigger Goal when Term becomes   ground.  The current implementation
%   uses nonground/2,waiting for an   atribtrary  variable and re-check
%   Term  when  this  variable   is    bound.   Previous   version  used
%   term_variables and suspended  on  a   term  constructed  from  these
%   variables. It is clear  that  either   approach  performs  better on
%   certain types of terms. The term_variables/2  based approach wins on
%   large terms that are almost  ground.   Possibly  we need a nonground
%   that also returns the number of tests   performed  and switch to the
%   term_variables/2 based approach if this becomes large.

trigger_ground(X,Goal) :-
    (   nonground(X,V)
    ->  '$suspend'(V,when,trigger_ground(X,Goal))
    ;   call(Goal)
).
,

如果有人感兴趣,我发现了这篇关于 MU- 和 NU-Prologs here 的评论:

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...