知道何时在序言中使用剪切

2023-12-24

我参加了一门课程,在其中学习了一些序言。我不知道如何/何时使用剪切。尽管我了解了剪切的一般概念,但我似乎无法正确使用它们。 任何人都可以简要解释一下或提供一个关于他们可以推荐的“剪辑”的好教程(不是 learnprolognow.org)吗?


TL;DR: Don't.

剪切修剪了 Prolog 的搜索树。也就是说,给定一个没有剪切的纯 Prolog 程序和带有剪切的相同程序,唯一的区别是带有剪切的程序可能会在无结果的分支上花费更少的时间,因此效率更高;可能会有更少的答案;它也可能终止,而原始程序则不会。

听起来很无害……甚至很有用,不是吗? 嗯,大多数时候事情都比较复杂。

Red cuts

剪辑的使用方式常常使得没有剪辑的程序根本没有任何实际意义。这种切割称为红色切割。在更好的情况下,它用于实现非单调否定的原始形式。而在其他一些情况下,一半是否定,一半是一些很难理解的程序意义。不仅对于程序的读者,而且对于程序的作者也是如此。事实上,此类用途往往无意中缺乏坚定。无论如何:这些削减不是placed到现有程序中。他们从一开始就应该参与该计划。

对于这种红色切割的更结构化的用途,更好地使用once/1, (\+)/1, or (;)/2– if-then-else 之类( If -> Then ; Else )反而。更好的是,尝试通过发出以下命令来防止此类构造被意外使用instantiation_errors。或者使用iwhen/2 https://stackoverflow.com/a/40449516/772868这会产生实例化错误或when/2(在 SWI、YAP、SICStus 中提供)会延迟目标。

绿色削减

Cuts that remove useless choicepoints (and also redundant answers) are called green cuts. But beware: You cannot place them into your program simply pressing ! and some #00ff00. Most of the time you need a clean read-only guard to ensure that there is no way this cut turns #ff0000. There is also a simple way to remove some leftover choicepoints safely: call_semidet/1 https://stackoverflow.com/a/12942551/772868. Here are some related cases:

  • 此查询的 SLD 树是什么? https://stackoverflow.com/questions/13162803/whats-the-sld-tree-for-this-query/13165981

  • Prolog 附加与剪切运算符 https://stackoverflow.com/questions/11360026/prolog-append-with-cut-operator/12710995#12710995

  • 后继算术和的最佳绿色切割是什么? https://stackoverflow.com/questions/13300231/what-are-the-optimal-green-cuts-for-successor-arithmetics-sum/13311382#13311382

  • 在 Prolog 中实现“last” https://stackoverflow.com/questions/11734986/implementing-last-in-prolog/11736042#11736042

剪切不是提交

最后,让我指出 cut 不是提交运算符。有时它的行为有点像它,但需要很多限制才能成为其中之一。提交操作符不能被(滥用)用来实现(\+)/1。提交要求每个子句彼此独立地进行尝试。因此,每个子句都需要一个完整的保护;它不能依赖于仅在先尝试其他一些条款之后才进行尝试。此外,谓词的每个子句中都必须发生提交。切割可以发生在任何地方。

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

知道何时在序言中使用剪切 的相关文章

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

    在解析一个 3 GB 的大文件时DCG https www metalevel at prolog dcg 效率很重要 我的词法分析器的当前版本主要使用 or 谓词 2 http www swi prolog org pldoc doc f
  • 函数式语言中的多线程? (序言)

    当我的朋友在学校开始学习 Prolog 时 我嘲笑他学习了一门无用的语言 然而 他向我展示了一些我从来不知道可能发生的东西 我想知道这个技术从何而来 技术是这样的 permutation List isAMember X List dele
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • 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
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we
  • 如何在 GNU Prolog 中使用“long int”?

    所以基本上看来 GNU Prolog 在我的 32 位 x86 Linux 上使用 28 位整数 下面的代码无法编译 foo A A0 is 0xdeadbeef A1 is A0 gt gt 8 A2 is A0 gt gt 16 A3
  • 如何在 Prolog 中为变量(如字符串)分配多个值?

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

    这里尝试解决同构图问题 作业信息 判断2个无向图是否同构 没有孤立的顶点 顶点数小于30 图的边作为谓词给出 即 e 1 2 f 1 2 我正在尝试使用以下方法 对于每对边 即图 1 和图 2 中的每条边 Try to bind the v
  • 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 中以递归尾部模式计算斐波那契数列 fibonacci 0 0 fibonacci 1 1 fibonacci N Result fibonacci N 1 0 fibonacci N Result Count Coun
  • Prolog 实现 and/2、or/2、nand/2、nor/2、xor/2 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在序言中实现以下谓词并将它们用于真值表 and 2 or 2 nand 2 nor 2 xor 2 也许有人可以告诉我如何实现和
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • 控制 Prolog 变量值选择

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

    我正在尝试构建一个 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
  • Prolog 过滤自定义目标失败的所有元素的列表

    我正在尝试写一个谓词filter List PredName Result 过滤一个List目标的所有要素PredName失败并随后返回Result列表 谓词PredName 1应该在调用过程时定义filter 3例如可以是 test N
  • 以系统的方式报告 Prolog 中查询失败的“原因”

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

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • 斜线(/)在序言中做什么?

    我有这个代码 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
  • Prolog 展平列表

    flatten A B R islist A gt flatten A R1 R R1 write A append A R1 R flatten B R1 flatten X X islist 这是我写的代码 但我有奇怪的问题 I get
  • 使用 prolog 添加另外两次出现

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

随机推荐

  • 在 UITableView 中对齐多个运行时生成的 UILabels

    我有一个UITableView需要通过列出类似的样式来支持内容 But the tricky part is that the amount of Label will vary with each cell some may have o
  • 在 Visual Studio 2015 中从 *.ts 生成 *.js

    当我将 ts 文件添加到 Visual Studio 2015 并对其进行编译时 js 文件不是 ts 的代码隐藏文件 它仅驻留在该文件夹中 而不是 Visual Studio 项目的一部分 这是设计使然还是我破坏了项目中的某些内容 如果是
  • 评估软件最低要求

    有没有办法评估软件的最低要求 我的意思是 我怎样才能发现我的应用程序需要的最小 RAM 量 Thanks 分析器在这里不会为您提供帮助 也不会估计数据结构的大小 探查器当然可以告诉您代码在哪里花费了最多的 CPU 时间 但它不会告诉您是否未
  • 如何从包含联系人详细信息且对象不在电话簿中的对象生成 .vcf 文件

    我想为一个对象生成一个 vcf 文件 其中包含姓名 图像 电话号码 传真号码 电子邮件地址 地址等联系信息 该对象未添加到手机的通讯录中 但存储在我的地址簿中 应用 生成 vcf 文件后 我可以像这样发送此 vcard Intent i n
  • Android 上的自定义字体和自定义 Textview

    从我需要开发的应用程序中 我收到了一种特定字体 其中包含许多文件 例如 FontName Regular 字体名称 粗体 字体名称 我需要在应用程序的所有文本视图中使用它 首先我认为这是一项容易的任务 查看SO并发现一个非常好的线程 her
  • C# Windows 控制台应用程序如何判断它是否以交互方式运行

    用 C 编写的 Windows 控制台应用程序如何确定它是在非交互式环境 例如从服务或计划任务 中调用还是在能够用户交互的环境 例如命令提示符或 PowerShell 中调用 编辑 4 2021 新答案 由于 Visual Studio 调
  • 使用 PyGame 将基于百分比的颜色值从绿色更改为红色

    我正在尝试制作一个健康栏 根据健康百分比将绿色缩放为红色 基本上 我试图使值 0 5 对应于 255 255 0 值 1 0 对应于 0 255 0 值 0 0 对应于 255 0 0 我看见这个帖子 https stackoverflow
  • 如何使用 cmake 编译 MPI 包含的 c 程序

    我正在尝试将 openmp 和 mpi 技术应用于需要构建 cmake make 的开源 C 程序 我已经找到了如何在 CMake 的 try compile 函数中设置 OpenMP 的链接器标志 https stackoverflow
  • 在 PostgreSQL 中使用 r sf::st_write 到非公共模式

    我正在尝试将空间表写入不是 PostgreSQL 数据库中默认公共模式的模式 library sf library DBI library RPostgreSQL library spData PostgreSQL DB parameter
  • 为什么我收到此错误警告:空感知操作的操作数“??”具有排除 null 的“Color”类型

    我正在使用这个包 flutter datetime picker 1 5 1 这是我的代码 String date Please pick Age Widget buildage return Column crossAxisAlignme
  • 根据另一个单元格的数值更改 x 个单元格的颜色

    I have range and i want to highlight my range of cells based value i enter in cell Range C5 If i enter 5 in cell C5 then
  • RPScreenRecorder stopRecording 块没有被调用

    我已经进行了足够的搜索 但未能找到解决方案 我正在使用 ReplayKit 来录制我的应用程序的屏幕 我已开始通过调用录制屏幕 let sharedRecorder RPScreenRecorder shared sharedRecorde
  • 通过多索引选择

    我有两个数据框 df a pd DataFrame data A B C A1 B1 C1 columns first secound third df a set index first secound inplace True df b
  • Java语言检测

    实际上 我正在使用 java 语言检测来检测文本语言 但出现以下错误 Exception in thread main java lang IllegalAccessError tried to access field com cyboz
  • 如何在 QML 上使用 JavaScript 库

    我在 5 12 2 上使用一些带有 QML 的 javascript 库 其中一些像 Proj4JS 一样工作 但我在使用时遇到错误地理库 js https geographiclib sourceforge io scripts geog
  • 如何在不同区域设置中对日期对象进行 strftime? [复制]

    这个问题在这里已经有答案了 我在 python 中有一个日期对象 我需要使用 a 工作日 和 b 月份 代码在旧系统的 C 语言环境中生成时间戳 但是 我不想更改应用程序的区域设置 因为其他部分需要尊重用户当前的区域设置 有没有办法在特定区
  • jQuery 可排序项目高度

    我有一个基于列表的简单 jQuery 可排序 如下所示 ul li Item 1 li li Item 2 li li Item 3 li li Item 4 li ul 我创建了一个辅助函数 以便无论项目的内容是什么 辅助函数始终具有相同
  • GitLab CI 缓存密钥

    假设我有以下步骤 gitlab ci yml file setup vue image stage setup script cd vue npm install no audit cache key node cache paths vu
  • python 3 中缺少 argparse

    有人知道为什么 argparse 模块没有在 python 3 中出现吗 它是 python 2 7 中的新功能 但 2 x 分支在 2 7 中已经耗尽 对我来说 不在实际的 python 3 分支中支持它是没有意义的 它将出现在 Pyth
  • 知道何时在序言中使用剪切

    我参加了一门课程 在其中学习了一些序言 我不知道如何 何时使用剪切 尽管我了解了剪切的一般概念 但我似乎无法正确使用它们 任何人都可以简要解释一下或提供一个关于他们可以推荐的 剪辑 的好教程 不是 learnprolognow org 吗