公理决议

bob*_*ram 4 algorithm prolog axiom successor-arithmetics

我试着理解公理解析如何在prolog中起作用.

我们假设我在自然数上定义了两个基本运算:

  • s(term)(代表继任者)和

  • add(term,anotherTerm).

add的语义由下式给出

  • add(0,x1) - > x1

  • add(x1,0) - > x1

  • add(s(x1),y1) - > s(add(x1,y1))

然后,我想解决这个等式

add(x,add(y,z))= s(0)

我想一个策略可能是

  • 测试方程的右侧(RHS)是否等于其左侧(LHS)

  • 如果没有看到是否可以通过寻找最通用的统一者找到解决方案

  • 如果没有,那么试着找到一个可以在这个等式中使用的公理.做这项工作的策略可能是(对于每个公理):尝试解决等式的RHS等于公理的RHS.如果有解,那么试着求解等式的LHS等于公理的LHS.如果成功,那么我们找到了正确的公理.

  • 最终,如果没有解,并且方程的LHS和RHS是相同的操作(即相同的签名但不是相同的操作数),则对每个操作数应用算法,如果找到每个操作数的解,则找到解.

我认为这个(简单)算法可能有效.但是,我想知道是否有人有解决这类问题的经验?有谁知道我在哪里可以找到一些关于更好算法的文档?

提前致谢

Raf*_*afe 5

Prolog程序是谓词的集合.

谓词是子句的集合.

一个条款有形式

Head :- Body.
Run Code Online (Sandbox Code Playgroud)

意思是" Head如果Body是真的则是真的".

有一个速记条款表格

Head.
Run Code Online (Sandbox Code Playgroud)

这意味着相同

Head :- true.
Run Code Online (Sandbox Code Playgroud)

true内置的地方总是如此.

让我们再回到Body一个条款的一部分,Body是可以采取以下形式之一(一个目标A,BC是任意的目标):

Atom            % This is true if Atom is true (see below).
A, B            % This is true if A is true and B is true.
(A ; B)         % This is true if A is true or B is true.
\+ A            % This is true if A is not true.
(A -> B ; C)    % If A is true then B must be true, else C must be true.
Run Code Online (Sandbox Code Playgroud)

Prolog中有一些关于评估顺序(从左到右)和"剪切"(修剪搜索树)的特殊规则,但这个细节超出了本简要教程的范围.

现在,要确定a是否Atom为真,Atom可以是以下形式之一(XY表示任意项):

true                % or some other builtin with given truth rules.
X = Y               % True if X and Y are successfully unified.
p(X, Y, ...)        % True if p(X, Y, ...) matches the head of some clause
                    % and the Body is true.
Run Code Online (Sandbox Code Playgroud)

术语本质上是任何语法.

这里要注意的关键是Prolog没有功能!在函数式语言中,您可以定义一个add(X, Y)求和的X和的函数Y,在Prolog中,您定义一个谓词,其头部add(X, Y, Z)如果成功,则Z与表示和的X和的术语统一Y.

鉴于这一切,我们可以在Prolog中定义您的规则如下:

add(0, Y, Y).                        % 0 + Y = Y.
add(Y, 0, Y).                        % Y + 0 = Y.
add(s(X), Y, s(Z)) :- add(X, Y, Z).  % s(X) + Y = s(X + Y).
Run Code Online (Sandbox Code Playgroud)

0用来表示零(!)并s(X)表示继承者X.

考虑评估add(s(s(0)), s(0), Z):

add(s(s(0)), s(0), Z)                 % Only the third head for add matches, so...
---> Z = s(Z0), add(s(0), s(0), Z0).

add(s(0), s(0), Z0)                   % Only the third head for add matches, so...
---> Z0 = s(Z1), add(0, s(0), Z1).

add(0, s(0), Z1)                      % Only the first head for add matches, so...
---> Z1 = s(0).
Run Code Online (Sandbox Code Playgroud)

把所有这些统一Z放在一起,我们有Z = s(s(s(0))).

现在,您可能会问"如果一个条款中有多个头匹配会发生什么"或"如果评估路径失败会发生什么?",答案是"非确定性","回溯",并且通常会读取Prolog教科书!

希望这可以帮助.