Prolog 中的“逻辑纯度”是什么意思?

2023-12-26

“逻辑纯度”是什么意思(在 Prolog 编程的上下文中)?这逻辑纯粹性 /questions/tagged/logical-purity标签信息说“仅使用 Horn 子句的程序”,但是那么,谓词会如何if_/3 https://stackoverflow.com/a/27358600/4609915限定,尽可能多地使用剪切和各种元逻辑(正确的术语是什么?var/1等等)谓词,即低级的东西。

我知道它达到了一些“纯粹”的效果,但这到底意味着什么?

如需更具体的说明,请解释如何if_/3符合逻辑纯粹,在使用中可见,例如在这个答案中 https://stackoverflow.com/a/30453357/849891?


让我们首先习惯一个陈述性的逻辑程序的读取。

Prolog 程序以声明方式声明什么是真的.

例如

natural_number(0).
natural_number(s(X)) :-
        natural_number(X).

第一条规定:0是一个自然数。

第二条规定:If X是一个自然数,then s(X)是一个自然数。

现在让我们考虑一下更改此程序的效果。例如,当我们改变这两个子句的顺序时会发生什么变化?

natural_number(s(X)) :-
        natural_number(X).
natural_number(0).

声明性地,交换子句的顺序不会以任何方式改变程序的预期含义(析取是可交换的)。

操作上,也就是说,考虑到Prolog的实际执行策略,不同的子句顺序显然常常会产生显着的差异。

However,无论选择的子句顺序如何,纯 Prolog 代码的一个非常好的属性都会被保留:

如果一个查询Q succeeds关于子句排序O1, 然后Q 没有失败具有不同的排序O2.

请注意,我是not这么说Q总是也succeeds使用不同的顺序:这是因为查询也可能loop或因不同的排序而产生错误。

对于两个查询Q1 and Q2,我们说G1 is 更一般当且仅当它包含G2关于句法统一。例如,查询?- parent_child(P, C). is 更一般比查询?- parent_child(0, s(0))..

现在,对于纯 Prolog 程序,另一个非常好的属性具有:

如果一个查询Q1成功,然后每个更一般的查询Q2 才不是 失败.

再次注意,Q2可能会循环而不是成功。

现在考虑以下情况var/1你提到的,并想到相关的谓词nonvar/1。假设我们有:

my_pred(V) :-
        nonvar(V).

这个什么时候成立?显然,当且仅当参数不是变量时它成立。

正如预期的那样,我们得到:

?- my_pred(a).
true.

然而,对于更一般 query ?- my_pred(X).,我们得到:

?- my_pred(X).
false.

这样的谓词称为非单调的,并且由于此属性,您不能将其视为真实关系:这是因为答案false上面的逻辑意味着有没有任何解决方案,但在前面的例子中,我们看到is一个办法。所以,不合逻辑的是,一个更具体查询,由添加约束,进行查询succeed:

?- X = a, my_pred(X).
true.

因此,对此类谓词的推理极其复杂,以至于使用它们进行编程一点也不有趣。它使得声明式调试变得不可能,并且很难声明任何保留的属性。例如,仅交换上面的联合查询中子目标的顺序就会使其失败:

?- my_pred(X), X = a.
false.

因此,我强烈建议留在 Prolog 的纯单调子集内,它允许沿着上面概述的路线进行声明性推理。

CLP(FD) 约束,dif/2等等都是pure从这个意义上说:你不能欺骗这些谓词给出逻辑上无效的答案,无论你使用它们的模式、顺序等如何。if_/3也满足这个性质。另一方面,var/1, nonvar/1, integer/1, !/0、带有副作用的谓词等都在逻辑上引用了正在描述的声明性世界之外的东西,因此不能被认为是纯粹的。

EDIT:澄清一下:我在这里提到的优秀属性绝不是详尽无遗的。纯 Prolog 代码还具有许多其他极其有价值的特性,通过它们您可以感受到逻辑编程的辉煌。例如,在纯Prolog代码中,添加一个子句最多可以extend,永远不会缩小解决方案的范围;添加一个goal最多可以narrow,永不扩展,它等等。

使用单个额外逻辑原语可能并且通常会破坏其中许多属性。因此,例如,每次您使用!/0,将其视为cut直达纯洁之心,并尝试为伤害这些财产而感到遗憾和羞耻。

一本好的 Prolog 书至少会开始介绍或包含许多提示,以鼓励这种声明性视图,引导您思考更一般的查询、保留的属性等。坏的 Prolog 书不会对此说太多,通常最终会使用正是那些不纯粹的语言元素破坏了语言最有价值和最美丽的属性。

一个很棒的 Prolog 教学环境,它广泛使用这些属性来实现声明式调试,称为GUPU http://www.complang.tuwien.ac.at/ulrich/gupu/,我强烈建议您查看这些想法。 Ulrich Neumerkel 慷慨地提出了一个核心思想,该思想在他的环境中部分可用:图书馆(王冠) http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/diadem.pl。请参阅源文件,了解有关如何以声明方式调试意外失败的目标的好示例:该库系统地构建了查询的泛化still失败。这个推理当然是完美的用纯代码.

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

Prolog 中的“逻辑纯度”是什么意思? 的相关文章

  • 如何在 SWI-Prolog 中创建事实?

    我只想创建类似的东西 like x y 我已经尝试了很长时间了 真的很沮丧 谁能告诉我该怎么做 我假设您正在交互地使用 swi 并尝试输入事实会给您一个如下错误 1 like x y ERROR toplevel Undefined pro
  • Z3 SMT 求解器中的常数相等

    我正在使用 Microsoft 的 Z3 SMT 求解器 并且我正在尝试定义自定义类型的常量 默认情况下 这些常量似乎并不不平等 假设您有以下程序 declare sort S 0 declare const x S declare con
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • 二叉树的 Herbrand 宇宙、Herbrand 基础和 Herbrand 模型(序言)

    什么是二叉树的 Herbrand 宇宙 Herbrand Base 和 Herbrand Model binary tree empty binary tree tree Left Element Right binary tree Lef
  • Prolog - 删除非唯一元素

    我有一个谓词来检查元素是否是列表的成员 并且看起来如下 member X X member X T member X T 当我打电话时 member 1 2 3 1 4 我明白了 是的 现在我必须使用它来编写谓词 该谓词将从列表列表中删除所
  • current_prolog_flag double_quotes DCG(代码或字符)?

    在使用 SWI Prolog DCG 时 我注意到有些人注意到 set prolog flag double quotes codes Jan http www swi prolog org pldoc man section string
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • Prolog 管线任务

    我有一项任务是在序言中制作一张简化的地铁地图 其中一部分要求制定一项规则来检查两个车站是否在同一条线上 我有一条规则 但它似乎不起作用 这就是我到目前为止所拥有的 adjacent nh lg central 4 adjacent lg o
  • 在 Prolog、尾递归中计算斐波那契数列

    我想在 Prolog 中以递归尾部模式计算斐波那契数列 fibonacci 0 0 fibonacci 1 1 fibonacci N Result fibonacci N 1 0 fibonacci N Result Count Coun
  • 如何在 Prolog 中计算数字序列的和

    任务是计算从0到M的自然数之和 我使用SWI Prolog编写了以下代码 my sum From To From gt To my sum From To S From 0 Next is 1 S is 1 my sum Next To S
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • Prolog 罗马数字(属性语法)

    我正在做一项作业prolog questions tagged prolog扫描数字列表并应返回该列表是否是有效的罗马数字以及数字的十进制值 前任 1 roman N I N 1 true 2 当我运行我认为应该工作的程序时 十进制值总是正
  • 如何确定一个日期范围是否出现在另一个日期范围内的任何时间?

    我有一个事件表 指定日期范围start date and end date字段 我有另一个在代码中指定的日期范围 它将当前周定义为 week start 和 week end 我想查询本周的所有活动 这些案例似乎是 活动在一周内开始和结束
  • 过早退出 Qualtrics 中的循环和合并块

    我目前正在进行一项 Qualtrics 调查 受访者必须解决一长串字谜问题 然后回答一些人口统计问题 为了使变位词部分更容易 我使用了循环和合并块 第一个字段是要解决的变位词 第二个字段是变位词的解决方案 因此调查可以根据受访者的答案来检查
  • Prolog 过滤自定义目标失败的所有元素的列表

    我正在尝试写一个谓词filter List PredName Result 过滤一个List目标的所有要素PredName失败并随后返回Result列表 谓词PredName 1应该在调用过程时定义filter 3例如可以是 test N
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • Prolog:子句在源文件中不在一起

    我有这段代码 Family tree female pen male tom male bob female liz female pat female ann male jim parent pam bob parent tom bob
  • SWI-Prolog 中的跨模块“接口”调用

    这可能是 SWI Prolog 模块系统特有的 假设我们有三个 Prolog 模块 在 SWI Prolog 模块系统中 robin 在文件中robin pl arthur 在文件中arthur pl helper 在文件中helper p

随机推荐

  • 锚标记 与 Shadow dom 内的哈希值

    我想在使用 Shadow DOM 的自定义元素内使用带有哈希 URL 的锚元素 我希望浏览器向下滚动到该锚点 但它没有这样做 至少 Chrome 是这样 Detail 我有一个像这样的index html a href destinatio
  • “浮动”的最大值是多少? [复制]

    这个问题在这里已经有答案了 当我检查 float MaxValue 的值时 我得到 3 402823E 38 这是 340 282 300 000 000 000 000 000 000 000 000 000 000 那么为什么当我尝试为
  • 如何调用 shell 脚本并从另一个 shell 脚本传递参数

    我正在从另一个 shell 脚本调用 shell 脚本 并且被调用的脚本需要一些输入 命令行 参数 我有下面提到的代码 但那不起作用 我不知道为什么参数值没有传递给被调用的脚本 script1 sh bin bash ARG1 val1 A
  • 如何通过网络在两个 VB.NET 应用程序之间进行通信

    我正在使用 VB NET 进行编程 我想将一个字符串或一个整数从一个 VB NET 应用程序发送到不同计算机上的另一个 VB NET 应用程序 我看了一些教程 但所有教程都只能在本地网络上运行 我希望它可以在互联网上运行 这是我的本地连接代
  • 远程服务器返回意外响应:(400) 错误请求

    我收到异常 远程服务器返回意外响应 400 错误请求 我不知道原因 web config 看起来不错 但也许我没有看到问题
  • firebase 如何检测“app_remove”

    在 Android 应用程序的 Firebase 分析中 我可以看到 app remove 事件 但 Android 操作系统不提供任何回调来检测应用程序是否被卸载 那么 firebase 是否真的知道 app remove 事件是否发生了
  • Google Java 风格的 Checkstyle 规则

    是否有一个 Checkstyle 规则文件谷歌Java风格 http google styleguide googlecode com svn trunk javaguide html checkstyle 团队几天前添加了它 这里是 ht
  • 是什么让 Smalltalk 能够进行图像持久化,为什么像 Ruby/Python 这样的语言不能自我序列化?

    在smalltalk中 您可以将世界状态保存到图像文件中 我认为这与 Smalltalk 的 序列化 自身能力有关 也就是说 对象可以生成自己的源代码 1 这是一个准确的理解吗 2 将这种能力添加到现代语言 显然是非 Lisp 中面临的挑战
  • 使用 Cython 生成的可执行文件真的没有源代码吗?

    我读过了在 Cython 中制作可执行文件 https stackoverflow com questions 22507592 making an executable in cython和 BuvinJ 的回答如何有效混淆Python代
  • 以编程方式选择 Kendo 网格行

    我找到了类似标题的帖子 但仍然无法解决我的问题 我肯定做错了什么 在 Kendo 网格配置中 有一些函数可以获取上下文 网格 并读取所选行 change function e refresh this 这就是我配置 更改 事件的方式 在函数
  • Pygame.movi​​e 丢失[重复]

    这个问题在这里已经有答案了 我目前正在使用 RPi 3B 最新的 Raspbian Jessie 进行一个小项目 其中涉及播放短的 mp4 文件 由于 Pygame 似乎支持播放 mpg 文件 因此我将视频转换为该格式 然而 当我尝试导入电
  • 代码合同 - Visual Studio Team Service 脚本化构建服务器单元测试失败

    我最近将代码契约添加到我的解决方案中 经过一些修改后 我们的构建运行没有任何问题 但我们的单元测试由于代码契约而失败 环境 源代码控制和构建服务器托管在Visual Studio 团队服务 https www visualstudio co
  • 从 Tinymce 获取 HTML 值

    有没有办法使用 jQuery 从 TinyMCE 编辑器获取 HTML 内容 以便我可以将其复制到另一个 div 我在内容上尝试了几种方法 例如 val 但它似乎不起作用 如果您正在使用 jquery 适配器进行初始化 selector t
  • Codeigniter 图片上传只会上传到一个目录

    function upload path config overwrite TRUE config allowed types jpg jpeg gif png config max size 2000 if path profile co
  • EJB 3.1 异步方法和线程池

    我每天需要使用 EJB 3 1 异步方法处理大约 250 000 个文档 才能应对整体的长时间任务 我这样做是为了使用更多线程并同时处理更多文档 这是伪代码的示例 this returns about 250 000 documents p
  • 如何在opencpu中链接两个函数调用

    据说 OpenCPU 支持链接函数调用来计算 例如f g x h y 有关参数格式的文档 https public opencpu org api html api arguments https public opencpu org ap
  • Web 开发人员 - 在本地计算机上还是在远程主机上进行开发更好?

    在本地计算机上而不是在集中式开发服务器上进行 Web 开发有哪些优点 缺点 对于那些在本地计算机上进行开发的人来说 当涉及多个开发人员时 如何为本地开发保留更新的数据库架构 特别是 我目前正在试验适用于 PHP 的 XAMPP 并且很好奇当
  • 有问题的 System.Diagnostics.Contracts 的有用性

    我一直在使用新的 System Diagnostics Contracts 类 因为它一开始看起来非常有用 用于检查入站参数 返回值等的静态方法 它是一个干净的接口 可以替换大量 if then 语句和内部构建的库工具 然而 它在大多数运行
  • docker SHM_SIZE /dev/shm:调整共享内存大小

    我想调整大小postgres容器默认的共享内存64M 所以我补充一下 build context shm size 2gb 我正在使用 3 6 版本的 compose 文件 postgres服务定义 version 3 6 services
  • Prolog 中的“逻辑纯度”是什么意思?

    逻辑纯度 是什么意思 在 Prolog 编程的上下文中 这逻辑纯粹性 questions tagged logical purity标签信息说 仅使用 Horn 子句的程序 但是那么 谓词会如何if 3 https stackoverflo