问题标签 [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.

0 投票
0 回答
45 浏览

prolog - 使用剪切,错误:超出本地堆栈

这是我的代码,只关注最后 3 条规则:

我不关心任何其他答案,只关心这个问题的答案:

给出名字 costac 和 anne,我确实得到了我想要的,因为这是我规则的第一行。我尝试的其他一切都失败了,并给出了标题的错误!我尝试使用 cut,但没有任何效果。当我追踪时,例如我给玛丽和迈克,我看到的是,即使它进入步骤(mother(X,Y), !,Ans = mother(X,Y));并产生mother(mary,anne) 忽略它,并进入接下来的两个并继续循环那个东西:

0 投票
1 回答
8244 浏览

list - 什么是 ”!” 在序言中

有人可以解释一下“!”是什么意思吗?在 Prolog 中做什么?我不明白。在这里,我有一个代码可以计算异构列表中有多少子列表具有山区特征。

munteMain验证线性列表是否具有山脉特征。

0 投票
2 回答
531 浏览

prolog - 用示例(Prolog 语言)理解 Cut(!) 运算符的问题

我有以下规则:

此规则用于确定列表中是否没有重复元素,并且成员规则确定特定元素是否属于列表。我的问题与此规则中的 cut 运算符有关,因为我不确定它的作用。

我已经为一个问题制定了以下跟踪?-noRepetition([a,b,b,c,d])并遇到了一个问题(可能与我对剪切运算符缺乏了解有关):

现在我被卡住了,因为在这种情况下不是成员返回 true,因此剪切被证明是正确的,但是我不确定这个剪切是否会阻止程序进入 noRepetition(第三个目标)或者它是否会执行其他操作。如果它确实阻止程序进入 noRepetition,那么该规则将被评估为 true,但情况并非如此,因为列表中有重复。

0 投票
1 回答
994 浏览

prolog - Prolog:“if then else”,使用 cut

这是一个简单的问题:我在 Prolog 教科书中看到了这个例子。它正在使用 cut 实现 if-then-else。

谁能解释这个程序在做什么,为什么它有用?

0 投票
2 回答
635 浏览

prolog - Prolog:避免使用和不使用切割运算符的冗余选择点(非确定性)

首先,我已经阅读了关于在 Prolog 中使用 cut 的所有其他帖子,并且肯定看到了与使用它们相关的问题。但是,对我来说仍然存在一些不确定性,我想一劳永逸地解决这个问题。

在下面的简单示例中,我们递归地遍历列表并检查每个第二个元素是否等于 1。这样做时,递归过程可能会以以下任一基本情况结束:空列表或具有单个元素的列表仍然存在。

执行时:

在这种情况下,我总是在第二种基本情况(即表示列表中剩下的一个元素的那个)中使用显式切割运算符,如下所示,以消除冗余选择点。

现在我们得到:

我了解此切割的行为特定于规则的位置,可以被视为不好的做法。

然而,继续前进,可以将案例重新定位如下:

这也将在不使用切割的情况下消除冗余选择点,但当然,我们只需将选择点转移到具有偶数位数的列表的查询,如下所示:

所以这显然也不是解决办法。但是,我们可以通过以下方式调整此规则顺序:

因为这实际上不会留下选择点。查看一些查询:

然而,再一次,由于规则的排序,这种切割的行为只能正常工作。如果有人将基本案例重新定位回原始形式,如下所示:

我们仍然会得到不需要的行为:

在这种情况下,我总是在第二个基本情况中使用单切,因为我是唯一一个经历过我的代码的人,而且我已经习惯了。但是,我在另一篇 SO 帖子上的一个答案中被告知,不建议使用 cut 运算符,我应该尽量避免使用它。

这让我想到了我的双向问题:

  • 如果一个剪切,无论它存在的规则的位置如何,都改变了行为,但没有改变解决方案(如上面的例子),它仍然被认为是不好的做法吗?

  • 如果我想取消上面示例中的典型冗余选择点以使谓词完全确定,是否有其他推荐的方法来完成此操作而不是使用削减?

提前致谢!

0 投票
0 回答
58 浏览

prolog - DCG中的重构切割,一般原则?[评论回答]

考虑一个带有 cut 的子句

我认为我们可以将削减重构如下:

然而,对于 DCG 来说,这种类宏的削减重构似乎不起作用。例如,我尝试像这样重构 DCG 子句

变成下面的东西

但它只是没有用。也就是说,h(X)后者的失败,而在重构剪辑之前它没有在前者中回溯。

用削减重构 DCG 时是否有一般原则?或者,在 DCG 中使用剪辑时需要考虑一些额外的暗角?

0 投票
4 回答
524 浏览

prolog - 如何在 Prolog 中模拟软剪辑?

如何模拟软切I *-> T; ISO Prolog中的E?我有副作用,所以我不能多次调用它。

除了最后一个要求,我认为以下定义有效:

(我实际上正在使用 XSB prolog;XSB 的解决方案对我也很有用。)

0 投票
2 回答
3474 浏览

prolog - 读一剪!在序言中

我正在阅读Learn Prolog Now!的关于削减的章节以及 Bratko 的人工智能 Prolog 编程,第 5 章:控制回溯。起初,cut 似乎是模仿其他编程语言中已知的 if-else 子句的直接方式,例如

然而,正如下面所述,如果所有变量都被实例化,即使我们期望,该代码也会失败false,例如

原因很清楚:第一个规则失败,第二个规则不再有任何条件与之相关,所以它会成功。我明白这一点,但随后提出了一个解决方案(这里是嗖嗖声):

我很困惑我应该如何阅读这个。我!的意思是:'如果在此之前的所有内容!都是真实的,请停止终止,包括具有相同谓词的任何其他规则'。但是,这不可能是正确的,因为这意味着实例化Y = Z仅在失败的情况下发生,这对于该规则是无用的。

那么应该如何以“人类”的方式阅读剪辑呢?而且,作为扩展,我应该如何阅读上述建议的解决方案max/3

0 投票
1 回答
230 浏览

performance - 如何用一个cut来解释这个Prolog目标,并提高效率

我一直在阅读我上一个问题的答案和评论,并尝试将给定的解释应用于 Bratko 的一个示例(Prolog Programming for Artificial Intelligence,第 130 页),但我不确定我是否完全理解它。该示例描述如下:

布拉特科页。 130

我阅读了树和代码如下:

在目标列表中C :- P, Q, R, !, S, T, U.,Prolog 会像往常一样一一尝试实例化变量,最终达到true.. 假设为Pand找到了一个值Q,并且第一次尝试R失败,那么 Prolog 可以回溯到找到 and 的情况PQ并尝试另一个选项(R如果可用)。但是,如果R也找到(导致P, Q, R = true.),并且!一如既往地成功,我们会丢弃任何选择点,并且从该点开始(甚至没有C :- V.)没有任何东西可以回溯。这意味着如果找不到 的结果S,目标C :- P, Q, R, !, S, T, U.将立即失败。但是Prolog 仍然可以回溯到A :- B, C, D.找到 的其他值B。如果找到另一个匹配项BC将重新尝试。等等。

假设我的解释是正确的,如果目标C :- P, Q, R, !, S, T, U.成功或失败而不管 的值B,你将如何提高效率?我的猜测是重写A :- B, C, D.A :- B, !, C, D.

我的解释正确吗?考虑到一些先验信息,我的效率提高又如何C呢?

0 投票
1 回答
80 浏览

loops - 循环一次后如何防止递归

我才意识到这是一个愚蠢的问题。好奇是否有人仍然可以找到漏洞。

源代码:

我想要它做的是再次尝试结婚(普京,特朗普),但所有早期的基本案例都会再次失败。我们之前尝试过切换参数但失败了。所以不要递归。只返回假。

我收到堆栈错误,因为直到结婚(普京,特朗普)或其他方式之前!永远不会返回 true 或 false,因此 cut 将无法触发。

更简单和更理智的方法是重写代码以防止递归。我很好奇是否有办法尝试切换 args 一次,如果失败则返回失败。如果您有很长的事实列表,如果您可以尝试 arg1、arg2,则可以将该长列表减少一半,反之亦然。如果我们得到疯狂的排列场景,可能会呈指数级增长。

任何见解都会非常感谢。