问题标签 [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 回答
31 浏览

prolog - Prolog:如何检查当前评估的子句是否被剪切?

如标题所示,例如

会产生


肯定询问 SWI 和/或 SIRSTUS 实施,但也欢迎其他实施

0 投票
2 回答
69 浏览

prolog - 选择点修剪需要削减,但我认为编译器应该足够清晰,可以自己完成

我正在编写一个between/3需要额外步长值的练习。

这是一个有趣的练习,快速显示:

  • 标记整数的优势(即使用pos(X)而不是XifX是一个正整数来利用模式匹配)
  • 使谓词尽可能具有确定性的内在魔力(不要在序列末尾留下选择点)
  • 将“标志”数组传递给谓词以微调行为的兴趣(在这种情况下,如果序列为空,它应该抛出还是失败?)

但是也:

  • ISO 标准异常术语的未经过深思熟虑的格式(使用复合术语而不是列表来传递信息...... WTF!)
  • 抛出异常的谓词的命名library(error)(为什么不调用它们throw_...而不是混淆地给它们与异常术语相同的名称,人们真的想要call(domain_error(...))吗?
  • must_be/2无法获取有关哪个 arg 确切导致问题的附加位置信息的事实(为什么!)

完整的代码是between_with_step.pl ...尚未完全单元测试。

现在我已经设置了以下谓词

它发出整数递增或递减序列的下一个值。它使用标记值的模式匹配。特别是,“如果序列是整数的结束值”(与表示无穷大的原子相反)和“步长为正”的情况由以下与术语匹配的子句int(End)和子句给出pos(Step)

现在,为了在枚举结束时完全确定,以下子句需要删减:

否则:

带切割:

无剪裁:

编译器不应该足够强大,以确定之后没有进一步的匹配between_enum(Start,int(End),pos(Step),Value)- 这是该系列中标记为的最后一个

  • int/1在第二个位置和
  • pos/1排在第三位?

这个 SWI-Prolog 8.1。

编辑

可能是编译器只索引前两个参数。没有必要切入

紧随其后的是

所以它可以很好地区分infminfint(_)

0 投票
0 回答
80 浏览

prolog - 为什么 Cut 不会阻止 Visual Prolog 寻找其他解决方案

如果我们fail在 cut ( ) 之后在谓词中使用!,它仍然会以某种方式找到另一个使用回溯的解决方案,但我认为它不应该。考虑 Visual Prolog 中的下一个示例

它的输出是

但是,我只期望1,因为正如官方文档中所写,

切 ”!” 删除自当前谓词入口以来创建的所有回溯点,这意味着所有回溯点到后续子句,加上在“!”之前在当前子句中进行的谓词调用中的回溯点。

此外,如果我们在 SWI-Prolog 中运行类似的代码,其输出将是1forp :- m(X), !, write(X), fail.1234for p :- m(X), write(X), fail.,正如预期的那样。我错过了什么?

0 投票
1 回答
321 浏览

prolog - Prolog 中的切割和失败语义

下面的代码有什么作用?

以及它与以下 2 个代码的工作方式有何不同:

0 投票
1 回答
62 浏览

prolog - !/0 是否应该穿过 (\+)/1 ?

一方面:

... 另一方面 ...

...另一方面:

令人困惑,不是吗?请帮忙!

0 投票
2 回答
86 浏览

prolog - 填充列表(作为数组):没有切割,回溯在给出正确的产生后导致无限递归

我需要用有限数量的元素初始化一些列表,都是一样的。

切割是强制性的,以避免无限递归和失败结果。

我试图修改规则#2,但在给出预期的解决方案后,目标失败:

这个怎么运作:

0 投票
2 回答
69 浏览

prolog - 在子句的开头剪切

p(integer),q(integer),r(integer)考虑以流模型(o)和谓词为谓词的 Prolog s

给出以下目标的结果:s。证明答案。

结果是 111,112,121,122,211,212,221,222。我已经看到如果它位于子句的开头,则剪切无效。这是真的?

0 投票
1 回答
111 浏览

prolog - 我使用“cut”太多了吗?

我是 Prolog 和一般逻辑编程的新手,我正在编写一个小定理证明器来取乐,并在这样做的过程中编写了一个规范化程序。我希望这个过程是确定性和坚定的,所以我写了这样的东西:

我现在想知道这是否是正确的方法。它目前似乎可以工作,但我想知道这是否不符合我在某些极端情况下所期望的属性,我编写它的方式是否可能存在一些性能问题,或者这只是糟糕的编码风格/一般练习。

0 投票
1 回答
44 浏览

prolog - 切割在基本情况下的作用是什么?

我得到了第二次切割的 if else 性质,但我不明白为什么程序会在第一次切割时中止。

0 投票
0 回答
36 浏览

prolog - (lambda)prolog 中以 cut 开头的子句

我正在阅读在高阶约束逻辑编程中实现类型理论的论文,在 p7 上我看到了以下 lambda-prolog 代码:

!我对第三条中cut的位置感到困惑。我对 cut 的理解是它总是成功的,但会阻止回溯到该成功之后,特别是会导致同一谓词的后续子句被忽略。特别是,在子句中首先出现的剪切应该意味着一旦与该子句的头部统一成功,所有后面的子句都将被忽略。

考虑到这一点,上面第一条和第二条开始的削减对我来说是有意义的:他们说如果被归约的术语是 anapp或 a lam,那么只有一个规则可以适用于它。但在我看来,第三个子句的开头似乎是完全一般的——所有的论点都是不同的变量——所以它不能不统一。因此,在我看来,总是会调用从第三个子句开始的剪切,因此永远不会到达第四个子句。我本来希望第三个子句写成类似

所以它只适用于他们所谓的“val-bound variables”;然后剪切将指示 ifX是这样一个变量,只有这个子句适用,而 if Xis not such a variable 那么我们将能够回溯并尝试第四个子句。

但是,我对 cut 的理解非常初级,所以我希望我遗漏了一些东西。有人可以解释吗?