问题标签 [prolog-cut]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - 使用剪切,错误:超出本地堆栈
这是我的代码,只关注最后 3 条规则:
我不关心任何其他答案,只关心这个问题的答案:
给出名字 costac 和 anne,我确实得到了我想要的,因为这是我规则的第一行。我尝试的其他一切都失败了,并给出了标题的错误!我尝试使用 cut,但没有任何效果。当我追踪时,例如我给玛丽和迈克,我看到的是,即使它进入步骤(mother(X,Y), !,Ans = mother(X,Y));
并产生mother(mary,anne)
忽略它,并进入接下来的两个并继续循环那个东西:
list - 什么是 ”!” 在序言中
有人可以解释一下“!”是什么意思吗?在 Prolog 中做什么?我不明白。在这里,我有一个代码可以计算异构列表中有多少子列表具有山区特征。
munteMain
验证线性列表是否具有山脉特征。
prolog - 用示例(Prolog 语言)理解 Cut(!) 运算符的问题
我有以下规则:
此规则用于确定列表中是否没有重复元素,并且成员规则确定特定元素是否属于列表。我的问题与此规则中的 cut 运算符有关,因为我不确定它的作用。
我已经为一个问题制定了以下跟踪?-noRepetition([a,b,b,c,d])
并遇到了一个问题(可能与我对剪切运算符缺乏了解有关):
现在我被卡住了,因为在这种情况下不是成员返回 true,因此剪切被证明是正确的,但是我不确定这个剪切是否会阻止程序进入 noRepetition(第三个目标)或者它是否会执行其他操作。如果它确实阻止程序进入 noRepetition,那么该规则将被评估为 true,但情况并非如此,因为列表中有重复。
prolog - Prolog:“if then else”,使用 cut
这是一个简单的问题:我在 Prolog 教科书中看到了这个例子。它正在使用 cut 实现 if-then-else。
谁能解释这个程序在做什么,为什么它有用?
prolog - Prolog:避免使用和不使用切割运算符的冗余选择点(非确定性)
首先,我已经阅读了关于在 Prolog 中使用 cut 的所有其他帖子,并且肯定看到了与使用它们相关的问题。但是,对我来说仍然存在一些不确定性,我想一劳永逸地解决这个问题。
在下面的简单示例中,我们递归地遍历列表并检查每个第二个元素是否等于 1。这样做时,递归过程可能会以以下任一基本情况结束:空列表或具有单个元素的列表仍然存在。
执行时:
在这种情况下,我总是在第二种基本情况(即表示列表中剩下的一个元素的那个)中使用显式切割运算符,如下所示,以消除冗余选择点。
现在我们得到:
我了解此切割的行为特定于规则的位置,可以被视为不好的做法。
然而,继续前进,可以将案例重新定位如下:
这也将在不使用切割的情况下消除冗余选择点,但当然,我们只需将选择点转移到具有偶数位数的列表的查询,如下所示:
所以这显然也不是解决办法。但是,我们可以通过以下方式调整此规则顺序:
因为这实际上不会留下选择点。查看一些查询:
然而,再一次,由于规则的排序,这种切割的行为只能正常工作。如果有人将基本案例重新定位回原始形式,如下所示:
我们仍然会得到不需要的行为:
在这种情况下,我总是在第二个基本情况中使用单切,因为我是唯一一个经历过我的代码的人,而且我已经习惯了。但是,我在另一篇 SO 帖子上的一个答案中被告知,不建议使用 cut 运算符,我应该尽量避免使用它。
这让我想到了我的双向问题:
如果一个剪切,无论它存在的规则的位置如何,都改变了行为,但没有改变解决方案(如上面的例子),它仍然被认为是不好的做法吗?
如果我想取消上面示例中的典型冗余选择点以使谓词完全确定,是否有其他推荐的方法来完成此操作而不是使用削减?
提前致谢!
prolog - DCG中的重构切割,一般原则?[评论回答]
考虑一个带有 cut 的子句
我认为我们可以将削减重构如下:
然而,对于 DCG 来说,这种类宏的削减重构似乎不起作用。例如,我尝试像这样重构 DCG 子句
变成下面的东西
但它只是没有用。也就是说,h(X)
后者的失败,而在重构剪辑之前它没有在前者中回溯。
用削减重构 DCG 时是否有一般原则?或者,在 DCG 中使用剪辑时需要考虑一些额外的暗角?
prolog - 如何在 Prolog 中模拟软剪辑?
如何模拟软切I *-> T; ISO Prolog中的E?我有副作用,所以我不能多次调用它。
除了最后一个要求,我认为以下定义有效:
(我实际上正在使用 XSB prolog;XSB 的解决方案对我也很有用。)
prolog - 读一剪!在序言中
我正在阅读Learn Prolog Now!的关于削减的章节以及 Bratko 的人工智能 Prolog 编程,第 5 章:控制回溯。起初,cut 似乎是模仿其他编程语言中已知的 if-else 子句的直接方式,例如
然而,正如下面所述,如果所有变量都被实例化,即使我们期望,该代码也会失败false
,例如
原因很清楚:第一个规则失败,第二个规则不再有任何条件与之相关,所以它会成功。我明白这一点,但随后提出了一个解决方案(这里是嗖嗖声):
我很困惑我应该如何阅读这个。我!
的意思是:'如果在此之前的所有内容!
都是真实的,请停止终止,包括具有相同谓词的任何其他规则'。但是,这不可能是正确的,因为这意味着实例化Y = Z
仅在失败的情况下发生,这对于该规则是无用的。
那么应该如何以“人类”的方式阅读剪辑呢?而且,作为扩展,我应该如何阅读上述建议的解决方案max/3
?
performance - 如何用一个cut来解释这个Prolog目标,并提高效率
我一直在阅读我上一个问题的答案和评论,并尝试将给定的解释应用于 Bratko 的一个示例(Prolog Programming for Artificial Intelligence,第 130 页),但我不确定我是否完全理解它。该示例描述如下:
我阅读了树和代码如下:
在目标列表中C :- P, Q, R, !, S, T, U.
,Prolog 会像往常一样一一尝试实例化变量,最终达到true.
. 假设为P
and找到了一个值Q
,并且第一次尝试R
失败,那么 Prolog 可以回溯到找到 and 的情况P
,Q
并尝试另一个选项(R
如果可用)。但是,如果R
也找到(导致P, Q, R = true.
),并且!
一如既往地成功,我们会丢弃任何选择点,并且从该点开始(甚至没有C :- V.
)没有任何东西可以回溯。这意味着如果找不到 的结果S
,目标C :- P, Q, R, !, S, T, U.
将立即失败。但是Prolog 仍然可以回溯到A :- B, C, D.
找到 的其他值B
。如果找到另一个匹配项B
,C
将重新尝试。等等。
假设我的解释是正确的,如果目标C :- P, Q, R, !, S, T, U.
成功或失败而不管 的值B
,你将如何提高效率?我的猜测是重写A :- B, C, D.
为A :- B, !, C, D
.
我的解释正确吗?考虑到一些先验信息,我的效率提高又如何C
呢?
loops - 循环一次后如何防止递归
我才意识到这是一个愚蠢的问题。好奇是否有人仍然可以找到漏洞。
源代码:
我想要它做的是再次尝试结婚(普京,特朗普),但所有早期的基本案例都会再次失败。我们之前尝试过切换参数但失败了。所以不要递归。只返回假。
我收到堆栈错误,因为直到结婚(普京,特朗普)或其他方式之前!永远不会返回 true 或 false,因此 cut 将无法触发。
更简单和更理智的方法是重写代码以防止递归。我很好奇是否有办法尝试切换 args 一次,如果失败则返回失败。如果您有很长的事实列表,如果您可以尝试 arg1、arg2,则可以将该长列表减少一半,反之亦然。如果我们得到疯狂的排列场景,可能会呈指数级增长。
任何见解都会非常感谢。