问题标签 [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 - Prolog:如何检查当前评估的子句是否被剪切?
如标题所示,例如
会产生
肯定询问 SWI 和/或 SIRSTUS 实施,但也欢迎其他实施
prolog - 选择点修剪需要削减,但我认为编译器应该足够清晰,可以自己完成
我正在编写一个between/3
需要额外步长值的练习。
这是一个有趣的练习,快速显示:
- 标记整数的优势(即使用
pos(X)
而不是X
ifX
是一个正整数来利用模式匹配) - 使谓词尽可能具有确定性的内在魔力(不要在序列末尾留下选择点)
- 将“标志”数组传递给谓词以微调行为的兴趣(在这种情况下,如果序列为空,它应该抛出还是失败?)
但是也:
- 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。
编辑
可能是编译器只索引前两个参数。没有必要切入
紧随其后的是
也
所以它可以很好地区分inf
,minf
和int(_)
。
prolog - 为什么 Cut 不会阻止 Visual Prolog 寻找其他解决方案
如果我们fail
在 cut ( ) 之后在谓词中使用!
,它仍然会以某种方式找到另一个使用回溯的解决方案,但我认为它不应该。考虑 Visual Prolog 中的下一个示例
它的输出是
但是,我只期望1
,因为正如官方文档中所写,
切 ”!” 删除自当前谓词入口以来创建的所有回溯点,这意味着所有回溯点到后续子句,加上在“!”之前在当前子句中进行的谓词调用中的回溯点。
此外,如果我们在 SWI-Prolog 中运行类似的代码,其输出将是1
forp :- m(X), !, write(X), fail.
和1234
for p :- m(X), write(X), fail.
,正如预期的那样。我错过了什么?
prolog - Prolog 中的切割和失败语义
下面的代码有什么作用?
以及它与以下 2 个代码的工作方式有何不同:
prolog - !/0 是否应该穿过 (\+)/1 ?
一方面:
... 另一方面 ...
...另一方面:
令人困惑,不是吗?请帮忙!
prolog - 填充列表(作为数组):没有切割,回溯在给出正确的产生后导致无限递归
我需要用有限数量的元素初始化一些列表,都是一样的。
切割是强制性的,以避免无限递归和失败结果。
我试图修改规则#2,但在给出预期的解决方案后,目标失败:
这个怎么运作:
prolog - 在子句的开头剪切
p(integer),q(integer),r(integer)
考虑以流模型(o)
和谓词为谓词的 Prolog s
:
给出以下目标的结果:s
。证明答案。
结果是 111,112,121,122,211,212,221,222。我已经看到如果它位于子句的开头,则剪切无效。这是真的?
prolog - 我使用“cut”太多了吗?
我是 Prolog 和一般逻辑编程的新手,我正在编写一个小定理证明器来取乐,并在这样做的过程中编写了一个规范化程序。我希望这个过程是确定性和坚定的,所以我写了这样的东西:
我现在想知道这是否是正确的方法。它目前似乎可以工作,但我想知道这是否不符合我在某些极端情况下所期望的属性,我编写它的方式是否可能存在一些性能问题,或者这只是糟糕的编码风格/一般练习。
prolog - 切割在基本情况下的作用是什么?
我得到了第二次切割的 if else 性质,但我不明白为什么程序会在第一次切割时中止。
prolog - (lambda)prolog 中以 cut 开头的子句
我正在阅读在高阶约束逻辑编程中实现类型理论的论文,在 p7 上我看到了以下 lambda-prolog 代码:
!
我对第三条中cut的位置感到困惑。我对 cut 的理解是它总是成功的,但会阻止回溯到该成功之后,特别是会导致同一谓词的后续子句被忽略。特别是,在子句中首先出现的剪切应该意味着一旦与该子句的头部统一成功,所有后面的子句都将被忽略。
考虑到这一点,上面第一条和第二条开始的削减对我来说是有意义的:他们说如果被归约的术语是 anapp
或 a lam
,那么只有一个规则可以适用于它。但在我看来,第三个子句的开头似乎是完全一般的——所有的论点都是不同的变量——所以它不能不统一。因此,在我看来,总是会调用从第三个子句开始的剪切,因此永远不会到达第四个子句。我本来希望第三个子句写成类似
所以它只适用于他们所谓的“val-bound variables”;然后剪切将指示 ifX
是这样一个变量,只有这个子句适用,而 if X
is not such a variable 那么我们将能够回溯并尝试第四个子句。
但是,我对 cut 的理解非常初级,所以我希望我遗漏了一些东西。有人可以解释吗?