什么东西永远不等于自己?

2024-02-22

Prolog 中是否存在不等于其自身的价值?我写的answer https://stackoverflow.com/a/53404595/10631003对某些人关于树的最小值的问题 https://stackoverflow.com/q/53399006/10631003这个答案还说,如果树为空,则 min 为空。一开始听起来是个好主意,但现在我觉得这听起来像是个坏主意。

如果null <> null, 没问题。但在 Prolog 中我看到 null 只是原子所以......

?- null = null.
true.

?- null == null.
true.

?- dif(null, null).
false.

我怎样才能在 Prolog 中创建一些总是说:

?- dif(Something, Something).
true.

但如果是任何其他事物而不是这个术语,那就是null仍然说的事情false.?

或者,如果这不是我在 Prolog 中的思考方式,那么我应该如何思考不true.并且也不是false.但是“既不正确也不错误,因为缺少某些东西”?


只是为了好玩,并不是真正要寻找的答案,从字面上看问题标题:

?- _ == _ .
false.

But dif/2没有被犯规(提示:每次出现匿名变量代表不同的变量):

?- dif(_, _).
true.

现在,说真的。从树最小谓词示例开始,有一个简单的替代方案:当树为空时,谓词可能会失败。更好的选择可能是使用optional or expected术语库。这些库背后的概念可以在多种编程语言中找到,它们提供了更好的替代方案null。您在 Logtalk 中拥有这两个库,可以将其与大多数 Prolog 系统一起使用。看:

  • https://logtalk.org/library/optional_0.html https://logtalk.org/library/optional_0.html
  • https://logtalk.org/library/optional_1.html https://logtalk.org/library/optional_1.html

and

  • https://logtalk.org/library/expected_0.html https://logtalk.org/library/expected_0.html
  • https://logtalk.org/library/expected_1.html https://logtalk.org/library/expected_1.html

您使用一个库或另一个库取决于您对“缺失”的解释,即“缺失”的含义optional(没有值也可以)或expected(缺少值是错误)。例如,假设在您的特定应用程序中使用0作为执行时空树的最小值specific计算(例如一组树的最小值之和)。如果树最小谓词返回可选术语引用,Ref,而不是整数,您可以这样做,例如

...,
optional(Ref)::or_else(Minimum, 0),
Sum1 is Sum0 + Minimum,
...

与使用 if-then-else 结构相比,这是一个更干净的解决方案:

...,
(   tree_minimum(Tree, Minimum) ->
    Sum1 is Sum0 + Minimum
;   Sum1 is Sum0
),
...

它还允许您对不同的计算使用不同的默认值。例如:

...,
optional(Ref)::or_else(Minimum, 1),
Product1 is Product0 * Minimum,
...

更重要的是,它不会掩盖您正在以与默认值相同的方式处理空树。例如,以下代码将仅写入非空树的最小值:

print_tree_minimums(Refs) :-
    meta::map(print_tree_minimum, Refs).

print_tree_minimum(Ref) :-
    optional(Ref)::if_present(write).

或者,使用 lambda 表达式:

print_tree_minimums(Refs) :-
    meta::map([Ref]>>(optional(Ref)::if_present(write)), Refs).

这个答案越来越长,我不想把它变成对利弊的一般性讨论选项 and 预期。但关于概念和库的描述很容易找到。例如。

https://en.wikipedia.org/wiki/Option_type https://en.wikipedia.org/wiki/Option_type

https://youtu.be/NhcHwkUPX7w https://youtu.be/NhcHwkUPX7w

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

什么东西永远不等于自己? 的相关文章

  • 执行树元解释

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • 寻找最大最小值集合

    我正在尝试编写一个 天真的或半天真的 程序 给定一组元素和许多玩家将其划分为这个数量的玩家 并且对于每个这样的划分取最小值 按总和 子集 然后 我想计算所有这些最小除法的最大值 这被称为https en wikipedia org wiki
  • 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
  • 求解序言中极其简单的方程:A = B + C?

    我有一个非常简单的方程 我希望能够在序言中求解 A B C 我希望能够编写一个谓词来表达这种关系 它可以处理任何一个未实例化的参数 无需推广到更复杂的关系或方程 myEquation A B C something 我可以使用以下语义进行调
  • 如何在 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
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • Prolog 过滤自定义目标失败的所有元素的列表

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

    我正在尝试为有效数字指定 DCG 如下所示 value Number gt valid number Number 基本上检查指定的值是否是数字 它也可能是变量 因此有必要检查 我不知道如何构建这个valid number不过 DCG 谓词
  • 斜线(/)在序言中做什么?

    我有这个代码 set value X Value X T X Value T set value X Value Y V T Y V NewT X Y set value X Value T NewT set value X Value X
  • 在 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
  • 如何在 ISO Prolog 中定义(和命名)相应的安全术语比较谓词?

    标准术语顺序 ISO IEC 13211 1 7 2 术语顺序 针对所有术语 包括变量 进行定义 虽然这有很好的用途 想想实施setof 3 这使得 8 4 术语比较中内置函数的许多其他干净且合乎逻辑的使用成为声明式噩梦 到处都是 imps
  • SWI-Prolog 中的跨模块“接口”调用

    这可能是 SWI Prolog 模块系统特有的 假设我们有三个 Prolog 模块 在 SWI Prolog 模块系统中 robin 在文件中robin pl arthur 在文件中arthur pl helper 在文件中helper p
  • 如何让 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 变体 它缺少findall 还有一个关于实现我们自己的问题findall here 获取 Prolog 中的解决方案列表 https stackoverflow com questions 419103
  • 判断第一个字母是否是元音序言

    我习惯了过程式编程语言 而且我在 prolog 上遇到了一些困难 缺乏在线资源也是一个遗憾 获取给定变量的第一个字符并检查它是否是元音的最 序言 方式是什么 我想 这样的东西就是我所追求的 这都是伪代码 但这是你解决问题的方法吗 isVow
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • 如何使用append/3在prolog中递归构建列表?

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

    user compiling user for byte code formula 0 P Q P Q P user compiled 2 lines read 768 bytes written 37208 ms yes formula

随机推荐

  • Rails 3 UTF-8 查询字符串显示在 URL 中?

    我的主页 上有一个搜索查询表单 当我提交此搜索表单时 我希望最终到达 search query foo 但是 现在我得到 search utf8 E2 9C 93 query foo 那个 utf8 参数在那里做什么 我怎样才能摆脱它 Th
  • 为什么我所有的看跌期权都返回 =>nil?

    我知道这似乎是一个非常简单的问题 但我的看跌期权不断生成 gt nil 这真的让我很困扰 我寻找答案但找不到答案 谢谢 把 眨眼 4 眨眼眨眼眨眼 gt 无 因为那是返回值puts put obj nil 将给定对象写入 ios 与 IO
  • 使用 Nhibernate 在子查询中仅选择不带 group by 属性的 max 子句

    我有这样的 SQL 查询 select from dbo table1 where Id in select max id as id from dbo table1 group by prop1 prop2 prop3 我想创建 NHib
  • Runtime.getRuntime().exec(String[]) 安全性

    我正在使用 Runtime getRuntime exec String 来运行进程 其中 String 数组的某些元素是由用户定义的 这安全吗 或者它允许将代码注入终端吗 如果不安全 我该怎么做才能避免代码注入 它必须是平台独立的 正如我
  • 如何在迭代时向列表添加值[重复]

    这个问题在这里已经有答案了 我有一个这样的场景 List
  • Android-R.java 文件未找到

    在处理 android 项目时 我被 R java 文件困住了 即使我清理项目 项目 gt clean 也找不到该文件 但该文件仍然找不到 即使我创建一个相同的新项目出现问题 我需要做什么 我期待有价值的答复 以便我可以克服这个问题 R j
  • 不知道如何导出 Objective-C 类。 i386 体系结构的未定义符号

    我正在尝试在 OSX 上的 GTK 上做一些工作 但遇到了一些麻烦 因为说实话 我对 Objective C 不太熟悉 我有足够的编程经验 可以很快掌握基本语法 并且可以在文档中查找我需要的内容 但我遇到的问题与链接库并将类暴露给我链接的程
  • 使用 Linkify.addLinks 与 Html.fromHtml 结合使用

    我有一个TextView通过调用以下命令获取其数据集 tv setText Html fromHtml myText 字符串myText包含部分格式化的 html 数据 例如 它可能有字体标签 但没有任何使用格式设置的 url 链接 a h
  • 通过 MsBuildProj 文件转换多个项目的多个配置文件

    我正在尝试根据模式 所有形式的文件 在文件列表上运行多个命令 config在给定目录的子目录下 如下所示
  • Node.js docker 容器未更新以适应卷的变化

    我正在尝试在我的 Windows 计算机上托管一个开发环境 该计算机托管前端和后端容器 到目前为止 我只在后端工作 所有文件都位于 C 盘上 通过 Docker Desktop 共享 我有以下 docker compose 文件和 Dock
  • 通过 Response.ContentType、Response.End 输出文件时如何显示进度状态/旋转器?

    我有一个网络表单下载链接按钮 在按钮的点击事件上我正在获取数据 然后生成 XLSX 文件供下载 在文件生成过程中 响应 Clear 叫做 响应内容类型被设定并最终响应 End 叫做 我需要显示微调器 gif在那次操作期间 文件生成并弹出文件
  • 角度区域

    什么是区域 Angular ngZone 与 zone js 有何不同 什么时候应该使用它们 有人可以帮助提供使用 ngZone 的实际示例吗 我在这里浏览了角度文档 但是我无法完全理解 https angular io api core
  • Systemd http 健康检查

    我在 Redhat 7 1 上有一个服务 我使用 systemctl 启动 停止 重新启动和状态来控制 有一次 systemctl 状态返回 active 但服务 背后 的应用程序响应的 http 代码与 200 不同 我知道我可以使用 M
  • 每次插入数据库时​​如何找到数据字段(例如电子邮件)的唯一性?

    我正在开发一个 Android 应用程序 用户在其中输入姓名 电子邮件和密码进行注册 这个输入过程工作得很好 现在我想在每次用户输入他 她的电子邮件时检查输入的电子邮件是否已存在于我的数据库中 为此 我在 DBHelper 类中尝试了以下方
  • 4.1 android模拟器未检测到sd卡

    我曾经使用 4 1 kitkat x86 android 模拟器和 SD 卡进行测试 将 Android Studio 升级到 2 3 后 我无法再访问 android 中提供的 SD 卡 这使得我无法进行测试 谷歌还没有对此的答案 我也没
  • 等待所有 pid 在 php 中退出

    我的问题是这样的 我正在分叉一个进程 以便可以加快磁盘上文件的访问时间 我将这些文件中的所有数据存储在本地桌面上的 tmp 文件中 理想情况下 在所有进程完成后 我需要访问该 tmp 文件并将该数据放入数组中 然后我取消链接 tmp 文件
  • 自动化 sftp 上传过程

    我正在寻找一种将文件 目录结构从一台服务器上传到另一台服务器的方法 在我的情况下 唯一可能的方法是 SFTP 上传 有没有简单的方法来上传它 使用脚本或其他东西 而不需要对文件 目录进行存档 我想在远程服务器上重新创建 谢谢你 也许可以使用
  • 如何获取不带参数的文件名?

    我需要找到我包含的不带 GET 参数的文件的文件名 例如 如果当前 URL 是 我想要返回 file php 我发现了什么 basename SERVER REQUEST URI 返回 file php a b c d 就我而言 我在购物车
  • DataAnnotations:递归验证整个对象图

    我有一个对象图 上面散布着 DataAnnotation 属性 其中对象的某些属性是本身具有验证属性的类 等等 在以下场景中 public class Employee Required public string Name get set
  • 什么东西永远不等于自己?

    Prolog 中是否存在不等于其自身的价值 我写的answer https stackoverflow com a 53404595 10631003对某些人关于树的最小值的问题 https stackoverflow com q 5339