min_member/2 的反直觉行为

2023-11-22

最小成员(-分钟,+列表)

当 Min 是标准项顺序中最小的成员时为真。如果列表为空,则失败。

?- min_member(3, [1,2,X]).
X = 3.

当然,解释是变量在术语的标准顺序中位于所有其他术语之前,并且使用统一。然而,所报告的解决方案感觉有些错误。

怎么能说得过去呢?我应该如何解释这个解决方案?

EDIT:

一种预防方法min_member/2此解决方案的成功在于更改标准库(SWI-Prolog)执行如下:

xmin_member(Min, [H|T]) :-
    xmin_member_(T, H, Min).

xmin_member_([], Min0, Min) :-
    (   var(Min0), nonvar(Min)
    ->  fail
    ;   Min = Min0
    ).
xmin_member_([H|T], Min0, Min) :-
    (   H @>= Min0 
    ->  xmin_member_(T, Min0, Min)
    ;   xmin_member_(T, H, Min)
    ).

失败而不是引发实例化错误(如果我理解正确的话,@mat 在他的回答中建议的内容)背后的基本原理是,这是一个明确的问题:

“3 是 的最小成员吗?[1,2,X],当 X 是自由变量时?”

对此的答案(至少对我来说)是明确的“不”,而不是“我真的不能告诉”。

这是同一类行为sort/2:

?- sort([A,B,C], [3,1,2]).
A = 3,
B = 1,
C = 2.

同样的技巧也适用:

?- min_member(3, [1,2,A,B]).
A = 3.

?- var(B), min_member(3, [1,2,A,B]).
B = 3.

混乱的真正根源是一个常见问题与一般的 Prolog 代码。对于 Prolog 谓词的纯度或杂质类型,没有明确的、普遍接受的分类。在手册中,与在标准中类似,纯净和不纯净的内置函数愉快地混合在一起。因此,事情常常会变得混乱,谈论该是、不该是,往往会导致无果而终的讨论。

怎么能说得过去呢?我应该如何解释这个解决方案?

首先,看“模式声明”或“模式指示符”:

min_member(-Min, +列表)

在 SWI 文档中,这描述了程序员如何使用该谓词的方式。因此,第一个参数应该是未实例化的(并且可能在目标内也没有别名),第二个参数应该实例化为某种类型的列表。对于所有其他用途,您必须自行决定。系统假设您能够亲自检查。你真的能做到吗?就我而言,这方面有相当多的困难。国际标准化组织有一个不同的系统这也起源于12月10日.

此外,对于未指定的情况,执行力求“合理”。特别是,它试图在第一个论点上保持坚定。因此,首先独立于 的值计算最小值Min。然后,将结果值统一为Min。这种针对滥用的稳健性通常是有代价的。在这种情况下,min_member/2总是必须访问整个列表。不管这个有没有用。考虑

?- length(L, 1000000), maplist(=(1),L), min_member(2, L).

显然,2 不是最小值L。这可以通过仅考虑列表的第一个元素来检测。由于定义的通用性,必须访问整个列表。

标准中对这种处理输出统一的方式进行了类似的处理。当(否则)声明性描述(这是第一个内置的) 明确指的是统一,例如

8.5.4 copy_term/2

8.5.4.1 说明

copy_term(Term_1, Term_2)为真当且仅当Term_2 unifies
有一个术语T这是重命名的副本 (7.1.6.2)
Term_1.

or

8.4.3 排序/2

8.4.3.1 描述

sort(List, Sorted)为真当且仅当Sorted
的排序列表List(7.1.6.5)。

这里是那些只能被理解为输出参数的内置参数(在括号中)。请注意,还有更多实际上是输出参数,但不需要统一过程after一些操作。想想8.5.2arg/3(3)或8.2.1(=)/2(2)或(1)。

8.5.4 1 copy_term/2 (2), 8.4.2 compare/3 (1), 8.4.3 sort/2 (2), 8.4.4 keysort/2 (2), 8.10.1findall/3(3), 8.10.2bagof/3(3), 8.10.3setof/3 (3).

关于你的直接问题就这么多,背后还有一些更根本的问题:

期限顺序

Historically, "standard" term order1 has been defined to permit the definition of setof/3 and sort/2 about 1982. (Prior to it, as in 1978, it was not mentioned in the DEC10 manual user's guide.)

从 1982 年开始,术语 order 经常(erm、ab-)用于实现其他顺序,特别是因为 DEC10 不直接提供高阶谓词。call/N两年后(1984 年)发明;但还需要几十年才能被普遍接受。正是因为这个原因,Prolog程序员对排序抱有一种有些漫不经心的态度。他们常常intend对某种术语进行排序,但更喜欢使用sort/2为此目的——无需任何额外的错误检查。造成这一结果的另一个原因是其出色的性能sort/2几十年后击败了其他编程语言中的各种“高效”库(我相信 STL 在这方面也有一个错误)。还有代码中的完整魔力 - 我记得一个变量被命名为Omniumgatherum- 不邀请复制和修改代码。

项顺序有两个问题:变量(可以进一步实例化以使当前顺序无效)和无限项。两者都在当前实现中处理,不会产生错误,但结果仍然未定义。然而,程序员认为一切都会成功。理想情况下,会有比较谓词产生 不清楚情况的实例化错误喜欢这个建议。还有另一个关于不可比较的无限项的错误。

Both SICStus和 SWI 有min_member/2,但只有 SICStus 有min_member/3带有一个附加参数来指定所采用的顺序。所以目标

?- min_member(=<, M, Ms).

行为更符合您的期望,但仅限于数字(加上算术表达式)。


脚注:

1 我按照标准术语顺序引用标准,因为这个概念自 1982 年左右就存在,而该标准于 1995 年发布。

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

min_member/2 的反直觉行为 的相关文章

  • 依赖规则顺序

    为了计算两个相同长度列表之间的汉明距离 我使用foldl hamm A B 0 R 有了这个定义hamm 4 hamm A A V V hamm A B V0 V1 A B V1 is V0 1 第一条规则的删减可以防止不必要的回溯 然而
  • 寻找最大最小值集合

    我正在尝试编写一个 天真的或半天真的 程序 给定一组元素和许多玩家将其划分为这个数量的玩家 并且对于每个这样的划分取最小值 按总和 子集 然后 我想计算所有这些最小除法的最大值 这被称为https en wikipedia org wiki
  • 在序言中减去或添加列表的列表?

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

    为什么Prolog匹配 X Xs 包含更多元素的元组 一个例子 test2 X Xs write X nl test2 Xs test2 X write X nl test
  • 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
  • 非成员规则在 Prolog 中无法按预期工作

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

    在 Prolog 人工智能编程中 Bratko 在第 58 页说了以下内容 Prolog 中的匹配对应于逻辑中所谓的统一 但是 我们避免使用 统一 这个词 因为出于效率原因 在大多数 Prolog 系统中 匹配的实现方式并不完全对应于统一
  • 求解序言中极其简单的方程:A = B + C?

    我有一个非常简单的方程 我希望能够在序言中求解 A B C 我希望能够编写一个谓词来表达这种关系 它可以处理任何一个未实例化的参数 无需推广到更复杂的关系或方程 myEquation A B C something 我可以使用以下语义进行调
  • std::initializer_list<> 和参考参数

    我是使用初始化列表的新手 我想知道它们是否与其他 stl 容器类似 我的意思是他们复制值吗 我想做的是一个简单的 min 函数 如下所示 template
  • YouTube 频道名称允许的大小是多少?

    YouTube 频道名称允许的大小是多少 最小长度 最大长度 Google 帐户名称大小限制如下 https developers google com youtube faq login limits https developers g
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • 在 prolog 中读取用户输入的字符串

    我是 Prolog 初学者 我正在使用 swi prolog 刚刚开始使用它 我需要将用户输入字符串拆分到列表中 我尝试了以下代码 但出现错误 指出 在子句正文中完全停止 无法重新定义 2 write Enter the String nl
  • 导入 csv 文件数据以填充 Prolog 知识库

    我有一个 csv 文件example csv其中包含两列 标题为 var1 和 var2 我想填充一个最初为空的 Prolog 知识库文件import pl具有重复的事实 而每一行example csv处理方式相同 fact A1 A2 f
  • 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
  • 以系统的方式报告 Prolog 中查询失败的“原因”

    我正在 Prolog 中寻找一种方法 模式或内置功能 我可以用它来返回why一组谓词失败 至少就数据库中的谓词而言 当用户在系统中提出查询时 我试图能够说的不仅仅是 那是错误的 例如 假设我有两个谓词 blue 1如果某物是蓝色的 则为真
  • 如何在 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
  • 斜线(/)在序言中做什么?

    我有这个代码 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

随机推荐

  • 应用程序池和工作进程线程之间有什么关系?

    我正在对 ASP NET 应用程序中的重新启动进行故障排除 该应用程序每天重新启动大约 20 次 我们强烈怀疑应用程序的一部分 因为当这一特定功能投入生产时 重启就开始了 我已经使用 log4net 库向这些页面添加了一些日志记录 但我在解
  • 将文本附加到 RichTextBox 的最快方法?

    我有一个带有 RichTextBox 控件的应用程序 其中的过程几乎总是添加文本 RichTextBox1 Text vbNewLine Title AlbumName RichTextBox1 Text vbNewLine Genre A
  • 序数编码或 One-Hot 编码

    如果我们不确定分类特征的性质 例如它们是名义特征还是序数特征 我们应该使用哪种编码 序数编码还是单热编码 关于这个主题有明确的规则吗 我看到很多人在没有方向的分类数据上使用序数编码 假设有一个频数表 some data some col v
  • Swift 中开关盒的详尽条件

    苹果文档 says 每个 switch 语句都必须是详尽的 也就是说 每一个可能的 正在考虑的类型的值必须与其中之一匹配 切换案例 所以在新的 Xcode 中我放置了这样的代码 println UInt16 min Output 0 pri
  • C# 通过 T 的成员对列表 进行二进制搜索

    我有一个基类Event with a DateTime member TimeStamp 许多其他事件类将从中派生 我希望能够快速搜索事件列表 因此我想使用二分搜索 列表数据按时间戳排序 但同时发生的事件可能存在重复的时间戳 所以我开始写这
  • Node.js MySQL 模块 - 抛出错误; // 重新抛出非 MySQL 错误;

    今天我尝试了来自 w3schools 的 node js mysql 片段 var mysql require mysql var con mysql createConnection host localhost user roots W
  • 如何在 Coq 中使用归纳类型来处理案例

    我想使用destruct通过案例来证明陈述的策略 我在网上读了几个例子 但我很困惑 有人可以更好地解释一下吗 这是一个小例子 还有其他方法可以解决它 但尝试使用destruct Inductive three zero one two Le
  • Visual Studio C++ 是否可以在不链接的情况下编译对象

    我正在运行 VS 2010 SP1 并且有一个每周运行一次的特殊分析配置 因为构建服务器需要很长时间来分析所有内容 我希望此配置无需链接即可运行 如果分析通过了项目中的所有代码 那么我希望构建继续进行下一个项目而不链接 我看不出有什么方法可
  • Python套接字接受块-防止应用程序退出

    我编写了一个非常简单的 python 类 它等待套接字上的连接 目的是将此类粘贴到现有应用程序中 并将数据异步发送到连接的客户端 问题是 当等待 socket accept 时 我无法通过按 ctrl c 来结束我的应用程序 我也无法检测到
  • JDBC 到 Spark Dataframe - 如何确保均匀分区?

    我是 Spark 新手 正在致力于通过 JDBC 从 Postgres 数据库表创建 DataFrame 使用spark read jdbc 我对分区选项有点困惑 特别是分区列 下界 上限 and 分区数 文档似乎表明这些字段是可选的 如果
  • JSON - Spring MVC:如何将 json 数据发布到 spring MVC 控制器

    我在发布 JSON 数据时遇到问题jsp to controller 每次我尝试都会收到 ajax 错误Bad Request 我对 JSON 很陌生 我真的不知道我做错了什么 我搜索并尝试了一些可以在该网站中找到的示例 但仍然遇到问题 在
  • 使用 JAX-WS:如何设置用户代理属性

    我对此进行了搜索并发现了一些未遂事件 我创建了一个 java 客户端来使用 JAX WS 来使用 Web 服务 使用 JAX 时有没有办法设置 HTTP USER AGENT 值 我希望在特定客户端 我的 访问它时获得我的网络服务日志 因此
  • 检测何时连接新显示器

    我正在编写一个需要两个显示器的应用程序 一个用于控制面板 另一个用于输出 我所拥有的是这样的 如果只有一个显示器 应用程序会在其上显示两种表单 但如果有两个显示器 则输出表单将转到另一个 问题是这只在应用程序启动时才会发生 换句话说 如果应
  • 在jsf中使用json将数据从bean发送到javascript

    我想将我的数组列表从 ManagedBean 发送到 JavaScript 代码 我的豆子在这里 public void getDataAsJson String dizi Tokyo Jakarta New York Seoul Mani
  • 如何计算列的平均值,然后将其包含在oracle中的选择查询中?

    我的桌子是 create table mobile id integer m name varchar 20 cost integer 其值为 insert into mobile values 10 NOkia 100 insert in
  • jqplot - 单个值,而不是堆积图中的总计

    In a stacked bar chart we can show total of each series in every stack like this However I want value of each series to
  • Identity.EntityFramework OnModelCreating 是如何调用的

    我正在从事两个类似的项目 但我没有创建其中任何一个 它们都具有相同的本地上下文 如下所示 using Microsoft AspNet Identity EntityFramework public class LocalContext I
  • 如何将uuid存储为数字?

    根据问题的回答 MySQL 中的 UUID 性能 回答者建议将 UUID 存储为数字而不是字符串 我不太确定如何做到这一点 有人可以建议我一些东西吗 我的 ruby 代码如何处理这个问题 如果我理解正确的话 您在主列中使用 UUID 吗 人
  • 如何将 QBASIC PLAY 命令转换为更现代的命令?

    我的 QB 应用程序中有这样的播放命令 PLAY MSe8f 4f 8f 8g8a8b4 a4 g4 f 4 o0b8o1e8e8e4d8e2 我想以某种方式将它们转换为现代应用程序可以使用的东西 有什么想法吗 我目前正在 FreeBasi
  • min_member/2 的反直觉行为

    最小成员 分钟 列表 当 Min 是标准项顺序中最小的成员时为真 如果列表为空 则失败 min member 3 1 2 X X 3 当然 解释是变量在术语的标准顺序中位于所有其他术语之前 并且使用统一 然而 所报告的解决方案感觉有些错误