prolog-cut相关内容

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

这个 Prolog 程序将第三个参数定义为前两个数字参数的最大值: max(X, Y, X) :- X >= Y, !.最大值(X,Y,Y). 我认为这个程序运行良好.但我被告知它可能会给出不正确的结果.你能说出时间和原因吗? 解决方案 这是教科书的例子. ?- max(5,1,1).真的. 作业:为什么程序出错了?我们如何使程序正确? 编辑 max(X, Y, X) :- ..
发布时间:2022-01-12 10:48:34 其他开发

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

我目前正在阅读 Bratko Prolog 书,并且正在研究冒泡排序程序.我似乎无法弄清楚为什么 cut(!) 是必要的.假设剪辑不存在,Prolog 会回溯,它怎么可能找到错误的答案?因为如果我把它删掉,Prolog 会先给我正确的答案,然后也会给出替代的错误答案. 在我看来,swap 怎么会返回一个未排序的列表?一个未排序的列表怎么可能达到目标bubblesort(Sorted, Sor ..
发布时间:2022-01-12 10:21:01 其他开发

后继算术和的最佳绿色削减是什么?

为了了解 Prolog 中的绿色切割,我试图将它们添加到后继算术中 sum 的标准定义中(请参阅 这个查询的 SLD 树是什么?).这个想法是通过消除所有无用的回溯(即,没有 ... ; false)尽可能“清理"输出,同时在所有可能的参数实例化组合下保持相同的行为 - 所有实例化,一/二/三完全未实例化,以及所有变体,包括部分实例化的参数. 这是我在尝试尽可能接近这个理想时能够做到的(我承 ..
发布时间:2022-01-12 10:16:56 其他开发

Prolog - 红色切割和绿色切割之间的区别

我开始学习 prolog,并且想让整个剪辑更清晰.我读过“绿色剪切不会改变程序的声明性含义,而红色剪切会".但是,程序的含义并不是真正纯粹的声明性(仅从 prolog 实际上回溯所有选项这一事实). 这是一个例子: p(1).p(2) :- !.p(3). 据说这是绿切.但如果我运行这个: p(X), X =:= 3. 没有剪辑我会得到“真",而有剪辑我会得到“假".那么,我错过了什 ..
发布时间:2022-01-12 10:06:35 其他开发

Prolog 附加切割运算符

当我们使用 append 和 cut 操作符时会出现什么问题? append2([],L,L):-!.append2([H|T],L,[H|TL]):-append2(T,L,TL). 我尝试了几种不同的输入,但总是成功. ?- append2([1,2],[5],L).L = [1, 2, 5].?- append2([1,2],[1,2],L).L = [1, 2, 1, 2].?- ..
发布时间:2022-01-12 09:58:50 其他开发

知道何时在 prolog 中使用 cut

我参加了一门课程,在其中学习了一些序言.我不知道如何/何时使用削减.即使我了解削减的一般概念,但我似乎无法正确使用它们.任何人都可以简要解释一下或提供一个关于他们可以推荐的“削减"的好教程(不是 learnprolognow.org)吗? 解决方案 TL;DR: 不要. cut 修剪 Prolog 的搜索树.也就是说,给定一个没有切割的纯 Prolog 程序和有切割的相同程序,唯一的 ..
发布时间:2022-01-12 09:57:21 其他开发

读一剪!在序言中

我正在阅读 立即学习 Prolog!的章节切割,同时 Bratko 的 Prolog 人工智能编程,第 5 章:控制回溯.起初,cut 似乎是模仿其他编程语言中已知的 if-else 子句的直接方式,例如 # 找出最大的数最大值(X,Y,Y):- X = 然而,正如下面提到的,在所有变量都被实例化的情况下,即使我们期望 false,例如 ?- max(2,3,2).真的. 原因很明显:第 ..
发布时间:2021-06-22 18:56:42 其他开发

'!' 在执行上有什么区别?存在?

计数器([],[]).counter([H|T],[[H,C1]|R]) :- counter(T,[[H,C]|R]),!, C1 是 C+1.counter([H|T],[[H,1]|R]) :- counter(T,R). “!"的作用是什么?因为我在上面和下面的代码中都获得了相同的输入输出? 计数器([],[]).counter([H|T],[[H,C1]|R]) :- counte ..
发布时间:2021-06-22 18:55:55 其他开发

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

我正在阅读这个的答案 问题, p(X) :- 读取(A), q(A,X-[]).q(end,X-X) :- !.q(A,[A|X]-Y) :- 读取(B), q(B,X-Y). 上面的代码使用语法List-List.我有点明白发生了什么,但我想知道“-"符号/谓词在这里做了什么.另外,这个 SWI 是特定的吗? 解决方案 (-)/2 表示差异列表是一个相当不常见的约定.在旧书中,还使用 ..
发布时间:2021-06-22 18:55:47 其他开发

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

本学期我将参加一门 AI 课程,我们正在学习 Prolog.我们的讲师告诉我们尽量避免在我们的作业中使用删减,但是,对于一些问题,我似乎无法避免使用它们.我只是好奇为什么削减被认为是一种罪过(讲师的话)?我知道这是一种捷径,但我已经使用它们,确切地知道它们如何影响我的程序. 解决方案 我同意 @dasblinkenlight 和 @mbratch.此外,我认为从绿色切割和红色切割的角度来思 ..
发布时间:2021-06-22 18:55:41 其他开发

在 Prolog 中使用 cut 定义一个 once_member/2 函数

免责声明:这是在我自己的时间完成的非正式和未经评估的课程作业.我自己尝试过,失败了,现在正在寻找一些指导. 我正在尝试实现 member/2 函数的一个版本,它只会返回一个列表的成员一次. 例如: |?- 成员(X, [1,2,3,1]).X = 1 ?;X = 2 ?;X = 3 ?;X = 1 ?; 我希望每个数字最多只打印一次. |?- once_member(X, [1, ..
发布时间:2021-06-22 18:46:37 其他开发

Prolog - 红切和绿切之间的区别

我开始学习序言,并想让整个剪辑更清晰.我读过“绿色切割不会改变程序的声明性含义,而红色切割会".但是,该程序的含义并不是真正纯粹的声明性(仅因为 prolog 实际上对所有选项都进行了回溯). 这是一个例子: p(1).p(2) :- !.p(3). 据说这是绿色切割.但是如果我运行这个: p(X), X =:= 3. 我会在没有剪辑的情况下得到“真",而经过剪辑我会得到“假".那么 ..
发布时间:2021-06-22 18:41:34 其他开发

带有剪切运算符的 Prolog 追加

使用 append 和 cut 操作符会出现什么问题? append2([],L,L):-!.append2([H|T],L,[H|TL]):-append2(T,L,TL). 我尝试了几种不同的输入,但总是成功. ?- append2([1,2],[5],L).L = [1, 2, 5].?- append2([1,2],[1,2],L).L = [1, 2, 1, 2].?- appe ..
发布时间:2021-06-22 18:40:31 其他开发

知道何时在序言中使用 cut

我参加了一门课程,在其中学习了一些序言.我不知道如何/何时使用削减.尽管我对削减有了大致的了解,但我似乎无法正确使用它们.任何人都可以简要解释一下,或者就他们可以推荐的“剪辑"提供一个很好的教程(不是 learnprolognow.org)吗? 解决方案 TL;DR:不要. cut 修剪 Prolog 的搜索树.也就是说,给定一个没有剪切的纯 Prolog 程序和有剪切的同一个程序, ..
发布时间:2021-06-22 18:40:28 其他开发

如何用cut来解释这个Prolog目标,提高效率

我一直在阅读我之前的问题的答案和评论,我已尝试将给定的解释应用于 Bratko(人工智能的 Prolog 编程,第 130 页)的示例,但我不确定我是否完全理解它.示例描述如下: 我阅读了树和代码如下: 在目标列表中 C :- P, Q, R, !, S, T, U. Prolog 会一一尝试实例化这些变量,像往常一样,最终达到 真..假设为 P 和 Q 找到一个值,并且第一次尝试 R ..
发布时间:2021-06-15 19:53:51 其他开发