问题标签 [failure-slice]
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 中枚举中序
我试图通过将中序列表转回 BST 来“反转”中序遍历。
BSTs 有谓词形式node(Value,Left,Right)
or leaf
,所以空树就是leaf
,只有一个节点的树就是node(_,leaf,leaf)
。
给定谓词enumerate_bst(Elems,Bst)
,目标是匹配Bst
中序列表的所有可能性Elems
。例如(注意setof/3):
我试图做的事情:
我已经有一个谓词将给定的 BST 与它的中序列表相匹配:
我试图通过放入一个列表来反向使用它,但这只返回一个结果,我不确定为什么。
我目前正在尝试做的事情
我正在尝试反向使用本机谓词append/3,但无法完全决定如何完成。
关于做到这一点的最佳方法的任何想法?谢谢!
prolog - Prolog - 无限循环
我想检查元素是否在列表中间。我搜索中间元素,然后检查是否是列表的成员,但我得到了无限循环。
我的谓词:
当我打电话时,我is_middle(1,[2,1,3])
就明白了。但是当我打电话时,我is_middle(1,[2,2,3])
没有得到结果。口译员不要中断处理。
recursion - Prolog DCG:匹配链上的不同符号
我正在尝试匹配一些句子(例如 001 [0,0,1], (1+(1/0)) ['(',1,+,'(',1,/,0,')' ,')'], 等等。
我已经让自己跟随小型 DCG。
现在我的问题是,它不会与使用 -、* 或 / 的句子匹配,但它适用于仅使用 + 的递归句子。
例如:
会工作,但是
不会工作。
任何帮助将不胜感激,谢谢!
prolog - n个动作中所有可能的骑士位置-序言中的无限循环
当在知道确切路径的情况下计算 n 移动中所有可能的骑士位置的计算解决方案时,我在 Prolog 中回溯时遇到问题。
我的解决方案会打印一些最初的结果,然后在寻找不可能的结果时永远不会终止。
这是我的代码:
示例调用:
结果,我期望 n 3 次移动中的所有可能路径。sb 可以帮助我向我的代码添加条件以阻止我的代码回溯到移动和循环到无穷大吗?
list - 规则中的一些好的答案,但不能全部获得
这些是我的规则,我的问题出在哪里:
问题是,最后一条规则生成了大约 20 个好的答案,但之后它进入了无限循环。第一条规则中有一个调试写入。
它写出像这样的行(总是改变数字),同时无限循环:
我们等待的解决方案是一个 4x4 矩阵。在第一行中,如果我们去掉前 4 个元素,这是一个很好的解决方案。
以 _ 开头的变量数量一直在增加,而矩阵的第一行 ([1,2,3,4]) 永远不会改变。
你有什么想法,这里出了什么问题?
实际查询:
prolog - 初学者 Prolog 堆栈溢出
我正在处理我的第一个 Prolog 任务,并且在递归问题上,我似乎无法停止溢出堆栈。就像上瘾一样;我不知道怎么停下来。
让我给你举个例子。我想创建一个函数来确定一个对象 Y 是否是另一个对象 X 的一部分。这是我正在使用的数据库:
从这里开始,我想编写一个函数partof(X,Y)
,如果 Y 是 X 的一部分,则返回 true。这就是我目前拥有的:
这适用于所有true
查询,但会溢出堆栈而不是返回false.
例如:
我知道你们都在想,“这个愚蠢的白痴,不知道什么是基本情况。不知道如何退出递归。” 好吧,我不怪你。我觉得很笨。不过,一些耐心的指导会很有帮助。提前致谢!
list - 在任何位置插入序言列表
Prolog 的新手,试图编写一个谓词来提供一个元素可以插入到列表中任何位置的所有选项。前任:
ins(a, [b,c], R).
应该给:
它确实如此,但随后给出错误“超出全局堆栈”。有没有办法让这更具确定性,给出结果并完成?当它反向运行时,即。ins(X, Y, [a,b,c])。它给出了预期的结果,然后说 false 表示它已经完成。代码:
这是在在线编译器SWISH中运行代码的链接(这也有一个我希望如何使用 ins 的示例,但 ins 是现在的问题)任何帮助将不胜感激!
prolog - 合并排序的 Prolog 实施不会停止
我是一个新的 Prolog 开发人员,正在尝试让合并排序工作。查询
将产生
因此,尽管它似乎“正确”对序列进行了排序,但它并没有停止
另一方面,如果我有一个查询,例如
它进入一个无限循环。我想知道为什么会这样?
prolog - 如何避免整数基本情况的非终止?
我想编写一个递归到 0 的谓词,但它始终无法终止。我使用失败切片来缩小范围:
当我将文件加载为swipl -f test.pl
,然后f(X, 0).
在提示中运行时,我得到了输出X = a
,但我没有看到X = b
或得到新的提示。我希望它表现得像A is 1 + 1
,在那里我得到A = 2.
一个句号和一个新的?-
提示。
我能够让它与这样的东西一起工作,但它看起来并不干净:
对于列表,我可以编写更一般的情况,f(X, [A|B])
以确保它仅在列表具有至少一个元素时适用。我可以做一些类似的事情来确保这里更一般的情况只适用于Y
不为 0 的情况吗?
我看过这个问题,虽然它暗示了正确的方向,但这也不起作用:
prolog - Prolog 在目标重新排序后不会终止
我目前正在研究 Learn Prolog Now 示例,对于一个练习,如果我对一条规则进行微小更改,我的 KB 会用完本地堆栈。这是知识库:
和相关规则:
这是有问题的查询,它用完了堆栈:
但是,如果我将规则更改为
然后它工作。
如果我跟踪查询,我会很快陷入这样的困境:
但我不明白为什么。难道它不应该只了解 raglan 是一个终端站,因此它必须再回溯一个级别吗?
谢谢!
编辑:我使用 SWI Prolog
编辑:我一步步解决后发现了问题。在插肩的情况下,任何地方都没有规则。因此,在尝试之后byPlane, byTrain, byCar
,它travel(raglan, X)
再次尝试(最后一条规则的第一个目标),从而循环。但我看不出另一条规则有什么更好的地方。