问题标签 [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 投票
1 回答
1438 浏览

prolog - Prolog 中递归谓词末尾的剪切

通常,我会编写一个与内存性能相关的递归谓词,类似于上面的代码片段。使用 cut 试图强制进行尾调用优化。我最近一直在浏览一个大型的 prolog 代码库,并发现了一些示例,其中剪切实际上是在递归调用之后而不是在它之前。据推测,这具有防止尾调用优化发生而不是协助它的效果。

我的问题是我可以在不影响程序含义的情况下将递归调用之后的剪切移动到它之前吗?这是假设谓词的每个子句在相同的相对位置都有一个切割。

现在我一直在考虑更多,我在想答案可能是“不一定”,但是在调用之前用 cut 重写了所有代码并发现测试套件仍然通过,我也在想知道编写这样的谓词是否还有其他深奥的原因。或者它只是糟糕的编码?

0 投票
4 回答
5070 浏览

prolog - Prolog,失败,不要回溯

SWI-Prolog 中是否有任何内置谓词总是会失败并防止机器回溯 - 它是停止程序立即执行(这不是什么fail/0)?我可以使用剪辑,但我不喜欢它们。

做类似的事情!, fail对我来说不是问题,但为了完成我想要的,我必须在更多位置使用剪辑,这是我不喜欢的。

0 投票
2 回答
192 浏览

python - 在第一个答案中停止生成器,改用 return

我使用了太多不符合我口味的模式(在搜索的每个可能的解决方案分支之后)。这是在给定方块中查找单词的代码。如果没有预先选择单词以仅包括其字母对是邻居的单词,则会出现错误,我现在通过将比较 not pos 更改为 pos is None 来解决这个问题。

有没有更好的替代方法可以让生成器在找到任何答案后停止?

基于为什么不使用return的解决方案

最后它得到了我并且返回的序列是迭代器,无论它返回没有产生值。所以我更改了我的 word_path 代码以使用 return 并通常清理表达式。函数返回 (False,),而不是给出 None 或 False。然后我对 None 不接受 for 声明没有问题。

0 投票
3 回答
4245 浏览

prolog - 避免在 Prolog 绝对值谓词中使用 cut

我在 prolog 中使用以下代码实现了以下功能:

如何在不使用 cut ("!") 的情况下实现此功能?

0 投票
1 回答
331 浏览

recursion - prolog cut 需要的建议?

在这个任务中,我有一个 Prolog 数据库,其中填充了例如 edge(1,0) edge(2,0) edge(1,3)

一条边表示两个点连接在一起。

我被要求编写一个名为reach(i,j,k) 的函数,其中i 是起点,j 是终点,k 是您可以使用的步数。需要 K 来停止递归循环,例如

假设我唯一的优势是从 1 到 3,而我正试图达到 6。那么我不能一口气从 1 到 6。所以我会找一个我能到的地方,看看我能不能从那里到6。我一次能到达的第一个地方是3,所以我会尝试从那里到6。

我这样做了:

这行得通,但是我坚持第二部分,我们被要求不要使用 k 而是使用“cut”来做到这一点。

有谁知道如何做到这一点或可以给我一些指示?

0 投票
1 回答
1069 浏览

prolog - Prolog - 在特殊情况下消除重复答案的更好方法?

我在这两条线上遇到了麻烦:

问题是如果前两个参数都是空列表,那么前两个语句都将被使用,返回相同的答案。但是,如果我将其中一个切入,它会破坏回溯。我最终在它们上面加上了这一行:

它有效。但我想知道是否有更优雅的解决方案。

0 投票
1 回答
4829 浏览

prolog - Prolog 中的奇怪运算符 (!)

在上面的陈述中,'!'是什么意思?在声明的末尾签名吗?

0 投票
3 回答
1224 浏览

parsing - 在没有剪切的情况下解析 Prolog?

我在 Prolog 中找到了这个用于解析 lisp 的好片段(来自这里):

然而,表达式使用剪切。我假设这是为了提高效率。是否可以编写此代码以使其无需剪切即可有效工作?

也会对涉及 Mercury 的软切/承诺选择感兴趣的答案。

0 投票
1 回答
227 浏览

recursion - Prolog递归溢出

它导致stackoverflow(不是站点)!这不应该是因为cut(!)。它在 SWI-Prolog 中有效吗?

0 投票
1 回答
186 浏览

prolog - Prolog 剪切查询

在 Prolog 中使用剪切。为什么下面查询的效果返回如下:

但此查询返回以下内容: