公理决议

时间:2010-11-30 21:36:11

标签: algorithm prolog axiom successor-arithmetics

我试着理解公理解析在prolog中是如何运作的。

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

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

  • add(term,anotherTerm)。

添加的语义由

给出
  • 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是相同的操作(即相同的签名但不是相同的操作数),则在每个操作数上应用算法,如果解决方案是找到每个操作数。

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

提前致谢

3 个答案:

答案 0 :(得分:5)

Prolog程序是谓词的集合。

谓词是一个子句的集合。

子句的格式为

Head :- Body.

意味着如果Head为真,则“Body为真”。

有一个简写条款表格

Head.

表示与

相同
Head :- true.

其中true是一个始终为真的内置。

回到条款的Body部分,Body是一个可以采用以下形式之一的目标(AB和{{1 }}表示任意目标):

C

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

现在,要确定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. 是否为真,Atom可以是以下格式之一(AtomX表示任意字词):

Y

术语本质上是任何一种语法。

这里要注意的关键是Prolog没有功能!在函数式语言中,您可以定义一个函数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. ,其值为add(X, Y)X的总和,在Prolog中定义一个头部为Y的谓词,如果它会成功,将add(X, Y, Z)与表示ZX之和的术语统一起来。

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

Y

我使用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). 表示零(!)和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). 的所有统一信息放在一起,我们有Z

现在,您可能会问“如果一个条款中有多个头匹配会发生什么”或“如果评估路径失败会发生什么?”,答案是“非确定性”,“回溯”,以及一般情况下,阅读Prolog教科书!

希望这有帮助。

答案 1 :(得分:1)

Brachmann和Levesque的“知识表示和推理”对这些事情的工作原理进行了很好的介绍。

答案 2 :(得分:1)

您要找的是narrowing。它以某些功能逻辑语言实现,例如Curry,但不在Prolog本身。