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 中的“逻辑纯度”是什么意思? 的相关文章

  • 在 prolog 中读取用户输入的字符串

    我是 Prolog 初学者 我正在使用 swi prolog 刚刚开始使用它 我需要将用户输入字符串拆分到列表中 我尝试了以下代码 但出现错误 指出 在子句正文中完全停止 无法重新定义 2 write Enter the String 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
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 以系统的方式报告 Prolog 中查询失败的“原因”

    我正在 Prolog 中寻找一种方法 模式或内置功能 我可以用它来返回why一组谓词失败 至少就数据库中的谓词而言 当用户在系统中提出查询时 我试图能够说的不仅仅是 那是错误的 例如 假设我有两个谓词 blue 1如果某物是蓝色的 则为真
  • Same_length/2 更好的纯版本

    鉴于频繁的纯定义same length 2 as same length same length As Bs same length As Bs same length L L loops 是否有一个纯粹的定义不会在这种情况下循环 类似于纯
  • 逐字遍历句子

    如何逐字遍历任何给定的句子 java中有内置函数吗 我不知道如何开始 像这样的事情 String sentence Your sentence here String words sentence split s splits by whi
  • 将 SWI Prolog 代码编译为 Windows 可执行文件 - 解析器 Grails3 项目

    我正在尝试构建解析器 Grails3 项目https github com RichardMoot Grail https github com RichardMoot Grail谁的教程是http www labri fr perso m
  • 如何让 Prolog 解释你的结果超出真实的陈述

    我有以下事实和规则 flight sea msp flight msp jfk route A B flight A B route B A flight A B route A C flight A B flight B C 当查询rou
  • Prolog DCG:找到最后一个元素

    我正在尝试更好地理解 DCG 的用途 为了做到这一点 我尝试将 LearnPrologNow 书中的一些练习转换为 DCG 表示法 然而 我却失败得很惨 我试图编写一个程序 仅命名列表中的最后一个元素 就这样 我只是想不出正确的 DCG 语
  • 将行读取到序言中的原子列表

    我需要将任何行 来自 user input 读入原子列表 例如 Example line which contains any ASCII chars into Example line which contains any ASCII c
  • 为什么“true && () => {}”会产生“Uncaught SyntaxError:格式错误的箭头函数参数列表”? [复制]

    这个问题在这里已经有答案了 下面的代码 执行时 true gt yields Uncaught SyntaxError Malformed arrow function parameter list Why 编辑 我知道将函数包装在括号中是
  • 查找列表中的最大值 - Prolog

    我刚刚接触 Prolog 并尝试编写一个谓词来查找整数列表的最大值 我需要写一个从头开始比较的内容 另一个从最后开始比较的内容 到目前为止 我有 max2 R max2 X Xs R X gt R max2 Xs X max2 X Xs R
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • Prolog 在技术上是如何工作的?引擎盖下是什么?

    我想更多地了解 Prolog 的内部结构并了解它是如何工作的 我知道如何使用它 但不是它内部如何运作 Prolog 中使用的算法和概念的名称是什么 它可能会构建某种树结构或有向对象图 然后在查询时使用复杂的算法遍历该图 也许是深度优先搜索
  • WAM 中的扁平化形式

    WAM 教程重构指出查询 p Z h Z W f W 需要使用以下原则进行扁平化 话虽这么说 查询扁平化形式是 X3 h X2 X5 X4 f X5 X1 p X2 X3 X4 我对外部变量的定义感到困惑 请考虑以下内容 p Z h Y a
  • findall 的异常行为

    以下看起来很不寻常 findall X member X 1 2 3 X X 1 2 3 痕迹更是如此 trace findall X member X 1 2 3 X Call 11 findall 100058 member 10005
  • 下面代码中的修剪选择点如何使其更加高效(Prolog)?

    在下面给出的代码中 有 cut 修剪选择点以提高效率 我非常确定reverse谓词和agent do moves谓词是必不可少的 solve task Task Cost agent current position oscar P sol
  • 替换 prolog 中的部分表达式

    我需要简化序言中的身份 例如x 0 x x x 0 ETC 为此 我需要替换表达式的部分内容 比如x 0 by x 您能帮我更换吗 Prolog 的一个巧妙之处在于您可以非常轻松地解构算术表达式 您的基本模板将如下所示 simplify X
  • check/3 谓词从列表中获取替代元素

    我有一个谓词check 3用作 例如 check A B C 所有三个参数都是列表 C是主列表 A包含具有奇数索引的项目 B包含具有偶数索引的项目 例如 check 1 3 2 4 1 2 3 4 is true check 1 2 3 4

随机推荐

  • 锚标记 与 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