问题标签 [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 中的“-”符号是什么意思?
我正在阅读这个问题的答案,
上面的代码使用语法List-List。我有点理解发生了什么,但我想知道“-”符号/谓词在这里究竟做了什么。另外,这个 SWI 是特定的吗?
prolog - Prolog 剪切行为对我来说没有意义
关于特定剪辑,我遇到了非常奇怪的行为(对我来说)。据我了解,一旦执行通过切割,它就不能回溯到它上面。但这正是这段代码所做的。有人可以解释为什么会这样吗?
这是代码:
现在没有削减,这个特定输入的输出如下:
现在,如果我添加以下剪辑:
我希望它会回来
一旦它通过了第三条的删减,它就不能再回溯了。
相反,它返回:
为什么会这样?它从字面上跳回剪辑并开始执行第 4 条,为什么?
为什么它执行第 4 条,如果我将切割移至第 2 条:
它只产生:
为什么削减在第 2 条中有效,但在第 3 条中无效?这对我来说毫无意义。
prolog - Prolog 剪切操作符行为
我有这些条款:
当我运行查询 c(X,Y,Z) 时,答案是:
所以基本上,切割运算符(在这里 d(B,C) :- a(B),!,a(C).)忽略了最近的选择点,即它不会进一步搜索 d() 和一个()。我认为剪辑忽略了所有先前的选择点并且不会进行任何回溯。
有人可以解释确切的行为,为什么我错了?
prolog - 查找 prolog 程序给出错误结果的查询
这个 Prolog 程序将第三个参数定义为前两个数字参数的最大值:
我认为这个程序工作得很好。但我被告知它可能会给出不正确的结果。你能说出时间和原因吗?
prolog - 请解释 Bubblesort Prolog 程序中的削减?
我目前正在阅读 Bratko Prolog 书,并且正在研究冒泡排序程序。我似乎无法弄清楚为什么 cut( !
) 是必要的。假设剪辑不存在,Prolog 会回溯,它怎么可能找到错误的答案?因为如果我把它删掉,Prolog 会首先给我正确的答案,然后也会给出替代的错误答案。
如我所见,交换如何返回未排序的列表?一个未排序的列表怎么可能达到目标bubblesort(Sorted, Sorted)
。
当然,除非第一个 List 也被更改......我无法理解它。
Prolog BubbleSort 程序:
离开它给了我:
我想不知何故我明白了,但我不确定。难道是在某个时刻,它回溯swap(List, List1)
到第二个冒泡排序谓词并达到目标,这意味着两个列表排序是相等的?
用英语来说,这是否意味着冒泡排序需要继续进行交换,直到无法再进行交换,然后才需要终止?或者这是否意味着每次成功进行交换时,回溯该成功是没有用的?
prolog - 如何在不回溯所有不同路径的情况下检查 Prolog 中是否存在任何统计子句?
假设我有以下内容:
现在,如果我要黛安的兄弟姐妹,我会得到查理和夏娃——两次,一次是通过鲍勃,一次是通过爱丽丝。我只想要一次。
我不认为我可以在这里使用剪切,因为这会完全防止回溯。我想要的是一种检查是否存在的方法。
释义
我尝试了几次削减,但都没有奏效。
我尝试findall/3
检查(parent(X, A), parent(X, B))
结果列表是否为非空,但这并不能统一 A 或 B。
按照下面的建议使用setof/3
是可行的,但我真的想找到一种方法将其合并到 的定义中sibling/2
,而不必在问题中使用它。我真的很想能够做到以下几点:
或这个
就像我在下面所说的那样,我有一个针对这种特定情况的解决方案。我想要的,以及我设置赏金的,是一个通用的解决方案。
代替
我想做
它统一了A
和B
。
我该如何定义exists/1
?
prolog - 让 Prolog 返回一个解决方案并停止显示查询选项
我是 prolog 的新手,正在尝试如何让它在找到一个答案后停止查询。我正在使用这段代码:
结果是:
我不知道如何让 Prolog 停止打印“true”?而是打印“是”。我试过使用 if/else 构造和格式函数,但它仍然打印“true?”。有任何想法吗?
prolog - Prolog-切割如何与 OR 运算符结合使用?
我写了这个小程序:
印刷:
我的目的是打印已婚夫妇,但每人打印一次。上面的规则对我有用,但我不明白为什么!这是如何运作的?
这有什么区别:
married_to(X,Y):- married(X,Y); married(Y,X).
这打印:
prolog - 编程中的削减有那么糟糕吗?
这个学期我正在学习一门人工智能课程,我们正在学习 Prolog。我们的讲师告诉我们尽量避免在我们的作业中使用削减,然而,对于一些我似乎无法避免使用它们的问题。我只是好奇为什么削减被认为是一种罪过(讲师的话)?我知道这是一种捷径,但我使用它们确切地知道它们如何影响我的程序。
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 树下激活。
问题是这种虚拟剪辑是否存在。