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

prolog - 在处理列表时,Prolog 中的“-”符号是什么意思?

我正在阅读这个问题的答案,

上面的代码使用语法List-List。我有点理解发生了什么,但我想知道“-”符号/谓词在这里究竟做了什么。另外,这个 SWI 是特定的吗?

0 投票
1 回答
169 浏览

prolog - Prolog 剪切行为对我来说没有意义

关于特定剪辑,我遇到了非常奇怪的行为(对我来说)。据我了解,一旦执行通过切割,它就不能回溯到它上面。但这正是这段代码所做的。有人可以解释为什么会这样吗?

这是代码:

现在没有削减,这个特定输入的输出如下:

现在,如果我添加以下剪辑:

我希望它会回来

一旦它通过了第三条的删减,它就不能再回溯了。

相反,它返回:

为什么会这样?它从字面上跳回剪辑并开始执行第 4 条,为什么?

为什么它执行第 4 条,如果我将切割移至第 2 条:

它只产生:

为什么削减在第 2 条中有效,但在第 3 条中无效?这对我来说毫无意义。

0 投票
2 回答
135 浏览

prolog - Prolog 剪切操作符行为

我有这些条款:

当我运行查询 c(X,Y,Z) 时,答案是:

所以基本上,切割运算符(在这里 d(B,C) :- a(B),!,a(C).)忽略了最近的选择点,即它不会进一步搜索 d() 和一个()。我认为剪辑忽略了所有先前的选择点并且不会进行任何回溯。

有人可以解释确切的行为,为什么我错了?

0 投票
2 回答
680 浏览

prolog - 查找 prolog 程序给出错误结果的查询

这个 Prolog 程序将第三个参数定义为前两个数字参数的最大值:

我认为这个程序工作得很好。但我被告知它可能会给出不正确的结果。你能说出时间和原因吗?

0 投票
2 回答
2669 浏览

prolog - 请解释 Bubblesort Prolog 程序中的削减?

我目前正在阅读 Bratko Prolog 书,并且正在研究冒泡排序程序。我似乎无法弄清楚为什么 cut( !) 是必要的。假设剪辑不存在,Prolog 会回溯,它怎么可能找到错误的答案?因为如果我把它删掉,Prolog 会首先给我正确的答案,然后也会给出替代的错误答案。

如我所见,交换如何返回未排序的列表?一个未排序的列表怎么可能达到目标bubblesort(Sorted, Sorted)

当然,除非第一个 List 也被更改......我无法理解它。

Prolog BubbleSort 程序:

离开它给了我:

我想不知何故我明白了,但我不确定。难道是在某个时刻,它回溯swap(List, List1)到第二个冒泡排序谓词并达到目标,这意味着两个列表排序是相等的?

用英语来说,这是否意味着冒泡排序需要继续进行交换,直到无法再进行交换,然后才需要终止?或者这是否意味着每次成功进行交换时,回溯该成功是没有用的?

0 投票
4 回答
551 浏览

prolog - 如何在不回溯所有不同路径的情况下检查 Prolog 中是否存在任何统计子句?

假设我有以下内容:

现在,如果我要黛安的兄弟姐妹,我会得到查理和夏娃——两次,一次是通过鲍勃,一次是通过爱丽丝。我只想要一次。
我不认为我可以在这里使用剪切,因为这会完全防止回溯。我想要的是一种检查是否存在的方法。

释义


我尝试了几次削减,但都没有奏效。
我尝试findall/3检查(parent(X, A), parent(X, B))结果列表是否为非空,但这并不能统一 A 或 B。


按照下面的建议使用setof/3是可行的,但我真的想找到一种方法将其合并到 的定义中sibling/2,而不必在问题中使用它。我真的很想能够做到以下几点:

或这个


就像我在下面所说的那样,我有一个针对这种特定情况的解决方案。我想要的,以及我设置赏金的,是一个通用的解决方案。

代替

我想做

它统一了AB

我该如何定义exists/1

0 投票
2 回答
10757 浏览

prolog - 让 Prolog 返回一个解决方案并停止显示查询选项

我是 prolog 的新手,正在尝试如何让它在找到一个答案后停止查询。我正在使用这段代码:

结果是:

我不知道如何让 Prolog 停止打印“true”?而是打印“是”。我试过使用 if/else 构造和格式函数,但它仍然打印“true?”。有任何想法吗?

0 投票
2 回答
140 浏览

prolog - Prolog-切割如何与 OR 运算符结合使用?

我写了这个小程序:

印刷:

我的目的是打印已婚夫妇,但每人打印一次。上面的规则对我有用,但我不明白为什么!这是如何运作的?

这有什么区别: married_to(X,Y):- married(X,Y); married(Y,X).

这打印:

0 投票
2 回答
517 浏览

prolog - 编程中的削减有那么糟糕吗?

这个学期我正在学习一门人工智能课程,我们正在学习 Prolog。我们的讲师告诉我们尽量避免在我们的作业中使用削减,然而,对于一些我似乎无法避免使用它们的问题。我只是好奇为什么削减被认为是一种罪过(讲师的话)?我知道这是一种捷径,但我使用它们确切地知道它们如何影响我的程序。

0 投票
1 回答
171 浏览

prolog - 在 Prolog 中更上一层楼

假设你有一个程序:

a(X)将返回一个查询A=a; X=a。然而,我正在寻找一种机制,其中 cut ( !) 不仅阻止人们在执行树的同一节点中进一步执行谓词,而且会简单地回溯到某个级别。


虚拟剪辑 ( ?)

例如,如果该运算符是?,

该程序:

将导致X=a,因为它首先与b(a)(this X=a) 绑定,下一次尝试绑定b(b)并失败,并且由于?放置在 的级别上a(X),因此该“虚拟剪切”被激活以及阻止a(X)采用下一个分支。

但是,如果是以下程序:

结果应该是X=a; X=b; X=c; X=a.因为切割从未在a(X)SLD 树下激活。

问题是这种虚拟剪辑是否存在。