Prolog 中的否定作为失败是一种程序行为吗?

2024-03-07

我有一个关于否定即失败在 Prolog 语言中:

这是一个理论性多于实践性的问题,因为我清楚这个例子是如何工作的。

所以我有以下 Prolog 程序:

/* Fatti che specificano quali esseri sono degli animali: */
animal(cat).
animal(dog).
animal(frog).
animal(horse).
animal(viper).
animal(boa).
animal(python).

/* Fatti che specificano quali esseri sono dei serpenti: */
snake(viper).
snake(boa).
snake(python).

/* X è un serpente, fallisce ed impedisce il backtracking quindi
   il predicato likes(mary,X) risulta essere falso: */
likes(mary,X) :- snake(X),
                 !,
                 fail.

/* Se X è un animale allora a mary piace: */
likes(mary, X) :- animal(X).

在 Prolog 中我不能简单地说:“玛丽喜欢所有动物,但不喜欢蛇”我必须这样表述:“如果X是蛇,那么玛丽不喜欢它。否则,如果X是动物,玛丽就会喜欢它”

前面的程序正是按照以下规则执行此操作:

likes(mary,X) :- snake(X),
                 !,
                 fail.

Prolog 检查 X 是否确实是一条蛇,施加切割以避免回溯并强制谓词失败。

这样如果snake(X) is TRUE该程序也迫使头部发生故障likes(mary,X)并施加回溯避免了执行程序中其他规则的可能性(答案为真,因为蛇也是动物)

我的问题是:在我看来,Prolog 的这种使用不属于逻辑和声明范式,并且在某种程度上属于某种程序范式

Because:

  1. 我必须强加 2 个谓词的顺序(所以在某种程度上我是说:如果第一个失败,请尝试第二个)。
  2. 但我更想说的是:如果第一个规则匹配(X 是一条蛇),则执行强制失败并且不强制回溯。

在我看来,这更接近于程序意义,而不是经典逻辑意义......

是那个吗?是不是在这些情况下,Prolog 使用过程行为来克服逻辑的限制?


我不同意“逻辑的局限性”。

同样会是

likes(mary,X) :- not(snake(X)) , animal(X).

因为 Prolog 使用深度优先搜索,所以一些东西可以用更短的方式表达,然后取决于深度优先搜索回溯算法。

x :- a, !, b.
x :- c.
x :- d.

是相同的

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

Prolog 中的否定作为失败是一种程序行为吗? 的相关文章

  • YAP Prolog 中的正向链接?

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

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • Prolog 同构图

    这里尝试解决同构图问题 作业信息 判断2个无向图是否同构 没有孤立的顶点 顶点数小于30 图的边作为谓词给出 即 e 1 2 f 1 2 我正在尝试使用以下方法 对于每对边 即图 1 和图 2 中的每条边 Try to bind the v
  • 在 Prolog 中动态拆分列表

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • 如何为有效号码指定 DCG?

    我正在尝试为有效数字指定 DCG 如下所示 value Number gt valid number Number 基本上检查指定的值是否是数字 它也可能是变量 因此有必要检查 我不知道如何构建这个valid number不过 DCG 谓词
  • Same_length/2 更好的纯版本

    鉴于频繁的纯定义same length 2 as same length same length As Bs same length As Bs same length L L loops 是否有一个纯粹的定义不会在这种情况下循环 类似于纯
  • 在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

    在 Windows 7 上 当我在 SWI Prolog 中使用 process create 3 打开 Notepad exe 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • Prolog家谱

    我做到了 但没有显示答案 当我询问兄弟姐妹 叔叔 阿姨时 这是我写的 有什么问题吗 uncle X Y male X sibling X Z parent Z Y uncle X Y male X spouse X W sibling W
  • Prolog - 如何从输入文件的给定列表中创建变量列表?

    我有一个输入谓词将文件作为列表读取 输入 文件名 列表 该列表的格式将是 9 字面意思就是下划线字符 在这里 不是一个通配符 问题是我如何编写谓词 pred List List2 然后转换所有 进入变量但保留9还在同一个位置吗 所以如果我输
  • 使用 prolog 添加另外两次出现

    我有一个清单 a b a a a c c 我需要为每个元素添加两次以上的出现 最终结果应该是这样的 a a a b b b a a a a a c c c c 如果列表中有一个与下一个项目相同的项目 那么它会继续下去 直到出现一个新项目 当
  • 将 X 插入到排序列表中的正确位置

    在序言中 如何将 X 插入到排序列表中的正确位置 我的尝试 insert X Y Rest X Y Rest X lt Y insert X Rest BiggerRest 您的方向是正确的 但您需要解决这三个问题 insert X X i
  • SWI Prolog 转义引号

    我需要在序言中将 放在字符串周围 我从另一个程序获取输入 看起来我无法转义该程序中的 因此我必须在序言中添加 否则序言语句将不起作用 感谢您的帮助 为了讨论strings https stackoverflow com a 39922411
  • 列表中小于给定数字的数字

    xMenores xMenores X H T R Z xMenores X T Z X gt H R is H xMenores采用三个参数 第一个是数字 第二个是数字列表 第三个是一个列表 是将包含结果的变量 规则的目标xMenores
  • Prolog 列表列表获取所有元素

    我有一个列表列表 decide 1 2 3 2 3 6 4 K 我想按 返回所有可能的解决方案 规则是首先返回其列表大小为 1 的值 然后我想返回其大小大于1的值 size 0 size Xs L size Xs N L is N 1 he
  • 序言中的“如果”?

    有没有办法在序言中执行 if 操作 例如如果变量为 0 则执行一些操作 将文本写入终端 甚至不需要 else 但我找不到 if 的任何文档 是的 ISO Prolog 中有这样一个控制结构 称为 gt 你像这样使用它 condition g
  • 如何使用append/3在prolog中递归构建列表?

    我需要了解一些事实的价值 这部分似乎正在发挥作用 fact1 A Val1 fact2 B Val2 A B 但是一旦我尝试附加这些值 Val1 Val2 通过使用append 3谓词到列表 OutList 我只得到一个可能的解决方案 而不
  • json 获取 prolog 谓词

    我试图在序言中创建这个谓词 谓词json get 3可以定义为 json get JSON obj Fields Result 这是正确的 当Result可以通过以下方式恢复 中的字段链Fields 列表 从JSON obj 一个字段 代表
  • 将人员分配到床位 - 自动化方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我每年都会帮助举办青年营 将与会者分配到卧室是一项艰巨的任务 有 92 个卧室 活动持续一周 与会者停留的时间长短不一 而且床需要重复
  • prolog跟踪如何使用

    跟踪prolog程序时如何进行第二步 例如 我想跟踪以下简单程序 length1 0 length1 X Xs N length1 Xs N1 N is N1 1 我跟踪程序 trace length 1 2 3 N Call 7 leng

随机推荐

  • SASS/SCSS @import 前面的 ~ 是什么意思/做什么?

    我在 GitHub 上被告知开始使用 在我的 SASS SCSS 之前 import路径 试图用谷歌搜索但找不到正确的答案 我想这太新手了 甚至懒得写 但我想学习它 它指的是node modules目录 或其等效目录 例如 在 Angula
  • 如何获取 Zune 中定义的设备名称?

    在 Zune 中 可以通过 Zune gt 设置 gt 手机 gt 同步选项更改手机名称 例如 我将手机名称更改为 myphone lumia 900 我怎样才能得到这个名字 使用DeviceStatus DeviceName它仅返回型号
  • Python IDLE 无法打开文件,显示“打开文件操作无法连接到打开和保存面板服务”

    刚刚升级到带有 m1 pro 芯片的新 MBP 我在尝试通过 IDLE 打开文件时遇到一些奇怪的问题 它抛出一个错误 说 打开文件操作无法连接到打开和保存面板服务 我尝试重新安装python 当在IDLE的服务设置下查看时 我找不到这样的服
  • 如何重命名 android-debug.apk

    我正在使用 Cordova 5 1 1 和 ionic 框架来创建我的 android 但是 当我尝试构建 apk 时 为什么文件名始终是 android debug apk 有什么办法可以重命名吗 cordova 创建 hello com
  • 如何在每个页面的侧边栏中包含目录树

    我正在 Sphinx 中生成 html 文档 如何修改文档中每个 html 页面的侧边栏 以便它们包含目录树 默认情况下 目录树似乎只显示在master doc页面 并且仅在主区域而不是侧边栏 是否有捷径可寻 我将使用 readthedoc
  • Android studio 3.1 每次重建工程即可看到变化

    将我的 android studio 更新到版本 3 1 后 我遇到了一个问题 当我对代码进行一些更改时 然后启动执行 我会得到旧的代码执行 直到我重建项目或清理它并重试 那是问题吗 PS 这发生在我的旧项目中 我还没有尝试过新项目 我认为
  • scipy 中的修剪树状图(层次聚类)

    我有一个大约有 5000 个条目的距离矩阵 并使用 scipy 的层次聚类方法对矩阵进行聚类 我为此使用的代码是以下片段 Y fastcluster linkage D method centroid D distance matrix Z
  • git,在保留历史记录的同时移动/重命名文件的可靠方法

    我知道有 很多 现有问题看起来很相似 所以让我在问我的问题之前总结一下它们 答案是是否可以在 git 中移动 重命名文件并保留其历史记录 https stackoverflow com questions 2314652 is it pos
  • 使用 css 防止或禁用 div 中的自动图像调整大小(使用 bootstrap)

    我正在尝试显示图像的原始大小 通常它比包含它的 div 的宽度更大 在现代浏览器中 它会自动调整大小以适合父 div 即使当我使用overflow auto图像仍然会调整大小 那么 当外部 div 具有设定宽度时 如何防止图像大小调整呢 谢
  • 使用 MSBuild 和 CruiseControl .NET 构建和部署 VS2010 数据库项目

    我几乎拥有一个 NAnt 脚本来构建和部署 VS2010 数据库项目 但有一个错误阻碍了我 C Program Files x86 MSBuild Microsoft VisualStudio v10 0 TeamData Microsof
  • 一次性计算正弦和余弦

    我有一个科学代码 它使用同一参数的正弦和余弦 我基本上需要该参数的复指数 我想知道是否可以比分别调用正弦和余弦函数更快 而且我只需要大约 0 1 的精度 那么有什么方法可以找到默认的三角函数并截断幂级数以提高速度 我想到的另一件事是 有没有
  • OS X 中的 Bash 脚本绝对路径

    我正在尝试获取 OS X 上当前运行脚本的绝对路径 我看到很多回复都是为了readlink f 0 然而自从 OS X 以来readlink与 BSD 相同 只是不起作用 它适用于 GNU 版本 有没有现成的解决方案来解决这个问题 这三个简
  • Grails 3.1.1 - 当模型类扩展另一个 groovy 类时脏检查不起作用

    我有一个域类 它扩展了另一个具有相同名称但在不同库中的不同包中的常规类 问题是当我修改域类上的实例时 它没有被标记为脏 因此更改不会持久 我读到 grails 3 版本对脏检查有一些增强 这可能是一个错误或者我遗漏了一些东西 新对象可以正确
  • 从networkX中的随机游走中获取节点列表

    我是 networkX 的新手 我创建了一个图表 如下所示 G nx read edgelist filename nodetype int delimiter data weight float 其中边为正 但总和不等于 1 是否有一个内
  • “请检查 gdb 是否经过代码签名 - 请参阅 taskgate(8)” - 如何使用签名的自制软件代码安装 gdb?

    我在 osx 10 8 4 下 并使用自制程序安装了 gdb 7 5 1 动机是获得一个具有新功能的新 gdb 例如 with python 等 长话短说 当我在 c Eclipse 项目中运行调试时 我得到 Error in final
  • 复制 QMimeData 对象的正确方法

    我正在开发一个 Qt 应用程序来存储剪贴板中的所有内容 以便稍后可以恢复它 我的方法是检索QMime数据 http qt project org doc qt 4 8 qmimedata html来自QApplication clipboa
  • Mozilla firefox 不支持预加载

    我在预加载方面遇到问题 我厌倦了使用 html 中的预加载来预加载 css 表 谷歌浏览器支持 但火狐浏览器不支持
  • 如何检查 MongoDB 中是否存在密钥

    我正在尝试检查 MongoDB 集合中是否存在某个键 基本上 我需要将字符串数组映射到特定的键 如果该键存在 我想通过添加新值来更新列表 否则创建一个具有初始值的新键 如果添加新键 则最初只会添加 1 个值 我在网上找到了一些例子 尽管我无
  • Pandas 系列到字典的矢量化查找

    问题陈述 pandas 数据框列系列 same group需要根据两个现有列的值从布尔值创建 row and col 如果行中的两个单元格在字典中具有相似的值 相交值 则该行需要显示 Truememberships 否则为 False 无相
  • Prolog 中的否定作为失败是一种程序行为吗?

    我有一个关于否定即失败在 Prolog 语言中 这是一个理论性多于实践性的问题 因为我清楚这个例子是如何工作的 所以我有以下 Prolog 程序 Fatti che specificano quali esseri sono degli a