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 中的否定作为失败是一种程序行为吗? 的相关文章

  • 如何提高词法分析效率?

    在解析一个 3 GB 的大文件时DCG https www metalevel at prolog dcg 效率很重要 我的词法分析器的当前版本主要使用 or 谓词 2 http www swi prolog org pldoc doc f
  • 二叉树的 Herbrand 宇宙、Herbrand 基础和 Herbrand 模型(序言)

    什么是二叉树的 Herbrand 宇宙 Herbrand Base 和 Herbrand Model binary tree empty binary tree tree Left Element Right binary tree Lef
  • Prolog 追加与剪切运算符

    当我们使用append和cut操作符时会出现什么问题 append2 L L append2 H T L H TL append2 T L TL 我尝试了几种不同的输入 但总是成功 append2 1 2 5 L L 1 2 5 appen
  • 针对数字板难题的优化 CLP(FD) 求解器

    考虑问题从https puzzling stackexchange com questions 20238 explore the square with 100 hops https puzzling stackexchange com
  • 如何在 Prolog 中求反

    我是 PROLOG 新手 正处于练习的开始阶段这一页 https sites google com site prologsite prolog course a first glimpse 给定规则parent X Y 和male X 我
  • 依赖规则顺序

    为了计算两个相同长度列表之间的汉明距离 我使用foldl hamm A B 0 R 有了这个定义hamm 4 hamm A A V V hamm A B V0 V1 A B V1 is V0 1 第一条规则的删减可以防止不必要的回溯 然而
  • 如何在 swi-prolog 的 prolog 文件中运行 prolog 查询?

    如果我有一个定义规则的 prolog 文件 并在 Windows 中的 prolog 终端中打开它 它会加载事实 然而 然后它显示 提示我手动输入一些内容 如何将代码添加到文件中 以便它实际上会评估这些特定的语句 就像我输入它们一样 像这样
  • 如何在 Prolog 中为变量(如字符串)分配多个值?

    今天早些时候 我寻求帮助以在序言中构建数据库以及如何通过参数搜索 有人提出了这个 您还可以向每个处理器添加术语列表 例如 processor pentium g4400 brand intel family pentium series g
  • Prolog - 从列表中删除具有相同第一个值的对

    我有这样的对象列表 list obj x y obj x z obj a b obj b c 我想删除那些共享相同第一个值的元素 这样我就可以使用修改后的列表 在这种情况下 最终列表将如下所示 list obj a b obj b c 有人
  • 在序言中减去或添加列表的列表?

    我对序言相当陌生 正在尝试摆弄列表列表 我很好奇如何添加两个列表列表或减去它们从而得到一个列表列表 如果我有两个列表 可以说 SomeList 1 2 3 4 5 6 7 8 SomeList2 1 2 3 4 5 6 7 8 我该如何添加
  • SWI-Prolog 中的约束编程

    我想要一个包含三个元素 A B 和 C 的列表 L 并具有以下约束 use module library clpfd L A B C L ins 1 3 A B C 但是 它给出了一个错误 Syntax error Operator exp
  • 井字游戏的极小极大

    我正在尝试用简单的极小极大算法来解决井字游戏 简单 但应该涵盖很多语言 到目前为止我所拥有的 该板表示为 9 个 未绑定 变量的数组 这些变量可以设置为x or o 获胜条件基本上是 win Player X1 X2 X3 X1 Playe
  • 非成员规则在 Prolog 中无法按预期工作

    我正在尝试在 Prolog 中创建一个迷宫程序 其目的是找到一条从迷宫起点到迷宫中心点 m 的路线 迷宫由使用四种颜色之一连接的正方形组成 蓝色 绿色 紫色或橙色 从起点到中心的路线遵循四种颜色的重复图案 我创建了以下代码 link2 A
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • Prolog内存问题

    我想找到一种方法来分析我在序言中编写的谓词 一个巨大的谓词 的内存使用情况 我目前正在运行它swi http www swi prolog org and yap http www dcc fc up pt vsc Yap document
  • 谓词对于列表中的所有元素都必须为 true

    我有一组事实 likes john mary likes mary robert likes robert kate likes alan george likes alan mary likes george mary likes har
  • Prolog中计算数字是否为素数

    我正在尝试计算输入是否是素数 但出了问题 这是我的代码 primeNumber X prime prime A 1 prime prime A B R is A mod B R 1 R A prime prime X B B lt A Ne

随机推荐

  • 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