在 Python 中实现 Prolog 统一算法?回溯

2024-01-20

我正在尝试实现统一,但遇到了问题..已经有十几个例子了,但他们所做的只是把水搅浑。我感到更加困惑而不是开悟:

http://www.cs.trincoll.edu/~ram/cpsc352/notes/unification.html http://www.cs.trincoll.edu/~ram/cpsc352/notes/unification.html

https://www.doc.ic.ac.uk/~sgc/teaching/pre 2012/v231/lecture 8.html https://www.doc.ic.ac.uk/~sgc/teaching/pre2012/v231/lecture8.html[以下代码基于此介绍]

http://www.cs.bham.ac.uk/research/projects/poplog/paradigms_lectures/lecture20.html#representing http://www.cs.bham.ac.uk/research/projects/poplog/paradigms_lectures/lecture20.html#representing

https://norvig.com/unify-bug.pdf https://norvig.com/unify-bug.pdf

如何用 Java 或 C# 等语言实现统一算法? https://stackoverflow.com/questions/1396558/how-can-i-implement-the-unification-algorithm-in-a-language-like-java-or-c

Prolog one 的艺术......以及其他几个。 最大的问题是我无法弄清楚问题的陈述。更多数学或口齿不清的解释让我更加困惑。

作为一个好的开始,遵循基于列表的表示似乎是个好主意(就像在 lispy 情况下一样),即:

pred(Var, val)  =becomes=> [pred, Var, val] 
p1(val1, p2(val2, Var1)) ==> [p1, val1, [p2, val2, Var1]]

除了你如何表示列表本身!?即[H|T]

如果您能给我看一段 Python 伪代码和/或更详细的算法描述或指向该算法的指针,我会很高兴。

我掌握的一些要点是需要将 General-unifier 和 var-unification 中的代码分开,但是我看不到互斥的情况! ... 等等。


作为旁注:我也希望您提及您将如何处理回溯统一。我想我已经回溯了,但我知道回溯时的替换框架必须发生一些事情。


使用当前代码添加了答案。

http://www.igrok.site/bi/Bi_language.html http://www.igrok.site/bi/Bi_language.html

http://www.igrok.site/bi/TOC.html http://www.igrok.site/bi/TOC.html

https://github.com/vsraptor/bi/blob/master/lib/bi_engine.py https://github.com/vsraptor/bi/blob/master/lib/bi_engine.py


我将快速总结这一章统一论 https://www.cs.bu.edu/fac/snyder/publications/UnifChapter.pdf巴德尔和斯奈德来自自动推理手册 https://www.sciencedirect.com/science/book/9780444508133:

Terms由常量(以小写字母开头)和变量(以大写字母开头)构建:

  • 没有参数的常量是一个术语:例如car
  • 以项作为参数的常量,即所谓的函数应用,是项。例如date(1,10,2000)
  • 变量是一个术语,例如Date(变量从来没有参数)

A 代换是一个将项分配给变量的映射。在文献中,这通常被写为{f(Y)/X, g(X)/Y}或用箭头{X→f(Y), Y→g(X)}。对术语应用替换会将每个变量替换为列表中相应的术语。例如。上述替换适用于tuple(X,Y)学期结果tuple(f(Y),g(X)).

给定两个术语s and t, a unifier是一个替代,使得s and t平等的。例如。如果我们应用替换{a/X, a/Y}到术语date(X,1,2000),我们得到date(a,1,2000)如果我们将其应用到date(Y,1,2000)我们也得到date(a,1,2000)。换句话说,(语法)相等date(X,1,2000) = date(Y,1,2000)可以通过应用unifier来解决{a/X,a/Y}。另一个更简单的统一器是X/Y。最简单的此类统一器称为最一般的统一者。就我们的目的而言,只要知道我们可以限制自己搜索这样一个最通用的统一词,并且如果它存在,它是唯一的(取决于某些变量的名称)就足够了。

Mortelli 和 Montanari(参见本文第 2.2 节以及那里的参考文献)给出了一组规则来计算这样一个最通用的统一符(如果存在)。输入是一组术语对(例如 { f(X,b) = f(a,Y), X = Y } ),输出是最通用的统一词(如果存在)或失败(如果不存在)。在示例中,替换 {a/X, b/Y} 将使第一对相等 (f(a,b) = f(a,b)),但是第二对就会不同(a = b不是真的)。

该算法不确定地从集合中选取一个等式,并对它应用以下规则之一:

  • 简单:一个方程s = s (or X=X) 已经相等并且可以安全地删除。
  • 分解:等式f(u,v) = f(s,t)被等式取代u=s and v=t.
  • 符号冲突:平等a=b or f(X) = g(X)进程失败而终止。
  • 东方:形式的平等t=X where t不是另一个变量被翻转到X=t使得变量位于左侧。
  • 发生检查:方程是否具有以下形式X=t, t is not X本身和如果X发生在某处t,我们失败了。 [1]
  • 变量消除:我们有一个方程X=t where X不会发生在t,我们可以应用替换t/X所有其他问题。

当没有规则可供应用时,我们最终会得到一组方程{X=s, Y=t, ...}代表要应用的替换。

这里还有一些例子:

  • {f(a,X) = f(Y,b)}是统一的: 分解得到{a=Y, X=b} 翻转得到{Y=a, X=b}
  • {f(a,X,X) = f(a,a,b)}不统一: 分解得到{a=a,X=a, X=b},消去a=a通过平凡,然后消除变量X to get {a=b}并因符号冲突而失败
  • {f(X,X) = f(Y,g(Y))}不统一: 分解得到{X=Y, X=g(Y)},消除变量X to get {Y=g(Y)},失败并发生检查

尽管该算法是不确定的(因为我们需要选择一个等式来处理),但顺序并不重要。因为您可以承诺任何订单,所以无需撤消您的工作并尝试不同的方程式。这种技术通常称为回溯,对于 Prolog 中的证明搜索是必需的,但对于统一本身来说不是必需的。

现在,您只需为术语和替换选择合适的数据结构,并实现将替换应用于术语的算法以及基于规则的统一算法。

[1] 如果我们尝试解决X = f(X),我们会看到 X 需要采用以下形式f(Y)应用分解。这会导致解决问题f(Y) = f(f(Y))随后Y = f(Y)。由于左侧总是有一个应用程序f小于右侧,只要我们将一项视为有限结构,它们就不能相等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中实现 Prolog 统一算法?回溯 的相关文章

随机推荐

  • Chrome JavaScript 调试器中的“Just My Code”

    有没有办法强制 Chrome 的调试器在单步执行代码时跳过特定的源文件或函数 现在 Chrome 开发者工具中提供了 框架黑盒 功能 https developer chrome com devtools docs blackboxing
  • Moq 中的单元测试 Mock/Stub 定义

    我所得到的关于单元测试的任何阅读或建议总是表明模拟和存根的定义之间存在明显的差异 我目前对这些定义的理解如下 Mock 一个假的 将用于 您的测试做出最终断言 存根 一个假的 将用于 你的测试是为了隔离依赖关系 但是 不被断言 然而 Moq
  • 输入 jqplot 饼图时工具提示有效,但在从一个切片移动到另一个切片时则无效(仅 Firefox 受影响)

    当 从外部 输入饼图时 工具提示工作正常 但切片之间的过渡会导致工具提示消失并且不会创建新的工具提示 这是我的jsfiddle 片段 http jsfiddle net LqB3f 14 密切基于有用的建议这个答案 https stacko
  • 如何在 Eclipse 中导入和导出键盘绑定? [复制]

    这个问题在这里已经有答案了 可能的重复 eclipse 按键绑定设置 https stackoverflow com questions 481073 eclipse keybindings settings 如何在 Eclipse 中导入
  • VBA 中转到 <行号>

    来自 VBA 帮助文件 转到语句 无条件分支到过程中的指定行 Syntax GoTo line 所需line参数可以是任何行标签或行号 Remarks GoTo只能分支到它出现的过程中的行 我的问题是 如何使用跳转到行号GoTo 我知道如何
  • 从字符串解析日期时间时遇到问题

    我目前正在尝试解析从每隔几分钟从网络下载的 xml 中获取的字符串 该字符串如下所示 Thu Jul 12 08 39 56 GMT 0100 2012 起初我只是做了一个string split并在时间结束后取出所有东西 GMT 0100
  • 使用 javascript 以编程方式创建 SVG 图像元素

    就像我的标题所说 我正在尝试使用 JavaScript 在 HTML 页面中以编程方式创建 SVG 图像元素 由于某种原因 我的基本 javascript 代码无法正常工作 但是如果我使用 raphaeljs 库 它就可以正常工作 所以我的
  • 配置系统无法初始化 - Windows Service .NET

    我创建了一个 NET Windows 服务 在开发计算机上安装时没有任何问题 在只有 NET框架 并且没有安装VS 的服务器上 由于我没有VS 2008提示符 所以我执行了以下操作 我打开命令提示符 I did cd C WINDOWS M
  • docker image: openjdk:15: 如何在其中安装 python

    我想创建openjdk15和python的镜像 我正在尝试使用 Dockerfile 进行构建 FROM openjdk 15 RUN yum install y oracle epel release el7 RUN yum instal
  • Web 应用程序 ASP.NET MVC 的调度程序 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我通过 ASP NET MVC 构建了一个网站应用程序 可以帮助用户获取 RSS 新闻 当然 它工作得很好 但是 我想扩展一个功能 例
  • iOS 11 文件应用程序:如何包含应用程序包中的文件

    我观看了keynote https www apple com apple events june 2017 今年的 WWDC 上 我对 iOS 11 中新增的所有新功能感到非常兴奋 Apple 对 App Store 中游戏的高度重视以及
  • 如何从 Owin 管道中获取 ApplicationDbContext

    这一定很简单 但我正在努力寻找答案 控制器操作如何获取对存储在 Owin 管道中的每个请求 ApplicationDbContext 的引用 编辑 好吧 我想我越来越接近了 或者也许不是 我所有的谷歌搜索似乎都会导致这篇博文 http bl
  • 在 dplyr 中使用带有 udf 的标准评估

    我正在使用 dplyr 进行编程 因此我正在使用标准评估 我创建了一个通用函数 以数据框和列名作为参数 在该函数中 我想应用我自己在数据框列上编写的另一个函数 这是一个最小的例子 some udf lt function x mean x
  • Spring MVC 映射 Guava Multimap

    我的控制器无法映射 Google GuavaMultimap来自前端 我从我的 Javascript 发送这个对象 1 true false 2 false true 如果我使用一个标准 java util Map
  • R,抑制曲线函数的绘图

    当在R中使用 曲线 函数时 如何抑制 停止绘图的显示 例如 此代码总是绘制曲线 my curve curve x 是否有一个参数可以执行此操作 或者我应该使用不同的函数 我只想将 x y 点作为曲线的数据框 curve 来自图形库 对于生成
  • 使用 TestNG 对 JavaFx 2 应用程序进行单元测试

    我编写了一个相当复杂的 JavaFx 2 应用程序 我想为其编写一堆单元测试 问题是 当我尝试进行测试时 我收到运行时错误 抱怨未初始化的工具包 据我所知 我应该以某种方式在 BeforeClass 方法中调用 Application la
  • MVC - 如何哈希和加盐

    我设法使哈希工作 但盐部分仍然是一个问题 我一直在搜索和测试示例但没有成功 这是我的哈希代码 Required StringLength MAX MinimumLength 3 ErrorMessage min 3 max 50 lette
  • 如何捕获 Rails 中的 500 内部服务器错误

    我以前在从数据库等获取内容时已经做过很多次了 对于我的具体情况 我正在使用第三者 https github com vigetlabs ruby spark blob master lib ruby spark device rb连接到一个
  • (Tensorflow-GPU)导入tensorflow ImportError:找不到'cudnn64_7.dll'

    在anaconda下创建tensorflow环境后 我安装了tensorflow gpu 然后我尝试导入tensorflow来验证它是否正确安装 但出现此错误 ImportError Could not find cudnn64 7 dll
  • 在 Python 中实现 Prolog 统一算法?回溯

    我正在尝试实现统一 但遇到了问题 已经有十几个例子了 但他们所做的只是把水搅浑 我感到更加困惑而不是开悟 http www cs trincoll edu ram cpsc352 notes unification html http ww