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

prolog - Prolog:查询与规则/事实中的“剪切”

在learnprolognow上做练习 10.4 ,有人可以向我解释或帮助我想象为什么?- p(X),p(Y)我们得到:
X=1,Y=1; X=1,Y=2; X=2, Y=1; X=2, Y=1. 而且不仅仅是 X=1, Y=1; X=1, Y=2.

我想我误解了切割是如何发生的,当它在规则集中而不是在查询中时 - 因为我认为我可以将它可视?- p(X),!,p(Y).化为 ,它实际上的行为就像我认为的最后一个......

编辑:来自网站

0 投票
2 回答
84 浏览

prolog - 在 Prolog 中插入剪切以使关系子句绑定但双向

考虑以下 Prolog 程序:

有我会打电话的tranform([foo, 1, 2], X)情况和我想打电话的情况transform(X, [foo, 1, 2])

在这两种情况下,我都希望 X 与[bar, 1, 2]和统一[foobar, 1, 2],但不与[foo, 1, 2]. 也就是说,我希望一旦谓词正确地识别出第二个子句适用,它应该只使用第二个子句回溯。

我应该在哪里插入切口以实现这种行为?

0 投票
2 回答
3162 浏览

prolog - 有什么作用!序言中的符号是什么意思?

我真的需要知道这个符号在符号之后是什么意思......例如看看这个代码

0 投票
1 回答
405 浏览

prolog - swi prolog:连接和切割

我正在尝试在 java 中实现一个 prolog 解释器。我试图弄清楚“,”运算符应该如何工作。我试图实现这样的等效规则:

我正在使用测试用例 c1、c2 和 c3 基于下面的逻辑库测试我的实现。他们都应该输出'1'和'false'。然而,我注意到最后一条规则 (c3) 打印出“12”和“假”。我在 SWI prolog 中也运行了相同的测试,最后一条规则输出 '12' 和 'false'。

那么我的假设是否不正确,逗号运算符可以编码为','(X, Y) :- X, Y.

0 投票
0 回答
38 浏览

prolog - Prolog,正确给出结果但打印错误

例如,我有以下函数计算二叉树中所有内部节点的集合(节点至少有一个孩子,即没有叶子)

结果是

为什么它以假结尾,为什么下面的代码做同样的事情但不会导致假

0 投票
0 回答
115 浏览

prolog - 防止回溯而不切割

prolog 和尝试解决一些练习是相当新的。给定组件的知识库

我想同时找到每个不是 ElementY 的 ElementX。

这是预期的结果

这让我相信自从我得到这个我就不能使用削减

如果我不阻止回溯,我得到的只是

我将如何达到预期的结果?

编辑:

0 投票
3 回答
244 浏览

loops - 在 SWI-Prolog 中打破基于 /3 的“循环”,同时保持跟随它的选择点

我需要遍历between/3从 1 到LengthLength定列表长度的数字范围(例如使用 )。迭代的数字,比如说N,然后应用于谓词,do_something直到它停止失败。也就是说,do_something搜索一个正确的N,之后between/3必须删除所有的选择点。但是,必须执行do_something正确应用的所有选择点。N

拳头尝试是这样的:

这不起作用,因为freeze/2没有减少between/3选择点。一个版本when/2也不起作用。我收集,这是因为两者都在一个单独的线程中执行,freeze/2并且when/2不影响主线程所在between/3的位置。

过了一会儿,我最终得到了以下代码,它可以满足需要,但效率低下:

低效率是do_something正确的选择点N被执行了两次。首先是在切割之前,然后在切割之后再次。

虽然这个解决方案适用于我的情况,但它不适用于所有do_something选择点必须只执行一次的一般情况。

请注意,N必须是超出范围的最小值,1..Length并且事先不知道。因此用do_something.

有没有更好的解决方案?有没有办法实现类似于between/3可以在以某种方式发出信号时停止的谓词?是否有一个专门的内置谓词可以满足需要?任何富有成效的想法都将受到高度赞赏。

0 投票
1 回答
294 浏览

prolog - 在 Prolog 语句的末尾剪切

如果图 Graph 的某个节点 B 存在边 AB 或 BA,我遇到了这个 cut,它应该返回 true。

问题是我不明白为什么删除这个切口会对返回的解决方案产生任何影响。

据我了解,在 Prolog 语句末尾进行剪切的唯一用途是当有另一个同名的语句 [another node(...)] 如果第一个成功时我们不想被调用. 一个例子是一个函数,它接受 X 和 Y 并返回较大的一个作为第三个参数。

但是,没有其他名为 node(...) 的语句,所以我看不到剪切如何影响解决方案。

这是我的代码。它应该找到一棵生成树。这里有详细解释。编译器是 Linux 上的 SWI-Prolog 7.6.4。

未删减返回的解决方案(正确)

使用 cut 返回的解决方案(不正确)

0 投票
1 回答
49 浏览

prolog - 为什么 prolog 不会在 cut 时停止?

我想得到这个结果:

我尝试以下代码:

达到时结果是正确numberMatrixLines(X,[],ResultMatrix)的。但是,谓词不会像预期的那样停止并返回 X 。

可以做些什么让它停在那条线上?

0 投票
1 回答
141 浏览

prolog - Prolog 中的元解释逻辑剪切(编辑以容纳评论)

我正在 Sicstus Prolog 中实现几何定理证明器;为了克服 I/O 回溯的问题,我使用了元解释器。然而,最后一个似乎并没有像预期的那样处理削减。

我的元解释器如下所示。第一个参数solve/5是要评估的目标,第二个和第三个参数允许我控制搜索深度,第四个和第五个参数用于处理输出的回溯。

我已按照线程在跟踪元解释器序言中实现剪切中的说明,并将元解释器 更改为以下内容。

然而现在,solve/5对于一些提供给定理证明器的问题,它失败了。值得注意的是,我的定理证明器中没有任何谓词call/1catch/3或。throw/1下面是一个示例问题。

如果目标solve(test_goal(1,2),0,8,O1,O2)被评估,Prolog 使用修改后的元解释器的答案是:

O2 = [nl,2,' ',1,'Large Depth Outcome: '|_A] ?

但答案应该是

O2 = [nl,2,' ',1,'Large Depth Outcome: ',nl,'Small Depth Outcome 1',nl,'Small Depth Outcome 1'|O1] ?

这是我的元解释器在添加剪辑改编之前给出的。

新的元解释器实现在处理剪切运算符方面看起来是否正确?

非常感谢。


编辑

在尝试确定问题集和解决以下评论中的问题的方法时,以下内容很明显:

  1. TGTP包含我的程序解决的那种问题

  2. Pedro Quaresma 的几何定理证明,Days in Logic 2012,埃武拉大学,2012 年 2 月 6 日至 8 日

    (Gelernter 的作品)最好地捕捉我的程序。

    谎言:27/99

在此处输入图像描述

和 28/99

在此处输入图像描述

削减对我来说是必要的,因为它允许程序在找到一个解决方案后停止处理给定目标的替代解决方案。例如,如果我有

我不希望通过 p2/1 和 p3/1 找到其他解决方案。这节省了大量的计算量。