- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面给出的代码中,有一个!
(剪切),它会修剪选择点以提高效率。我非常确定 reverse
谓词和 agent_do_moves
谓词是必不可少的。
solve_task(Task,Cost):-
agent_current_position(oscar,P),
solve_task_a(Task,[b(0,0,P)],[],R,Cost,_NewPos),!, % prune choice point for efficiency
reverse(R,[_Init|Path]),
agent_do_moves(oscar,Path).
最佳答案
以上示例中的剪切具有以下效果:
理想情况下,它会将 solve_task_a/6
内可能发生的搜索提交给找到的第一个答案。这可以释放资源来寻找进一步的答案,从而减少空间消耗。
但是,与此同时,它也可能隐藏对agent_current_position/2
的进一步答案。当然,对于这个目标有进一步的答案没有多大意义,但这可能是一个错误,恰好休眠了一段时间,只是在最坏的情况下变得活跃但仍未被发现。
因此,最好是书写而不是剪切
...,
once( solve_task_a( ... ) ),
...
这将范围精确限制为您想要表达的内容。
但这并不是唯一可能的问题根源。我看到这个变量Cost
。当你调用solve_task(Task, Cost)
时它会被实例化吗?我可以在这里做很多猜测。但至少这个变量可能会影响 Prolog 将 promise 的答案。因此,solve_task(Task, 99)
和 solve_task(Task, Cost), Cost = 99
可能会产生不同的答案。事实上,后者甚至可能会失败。存在此类问题的谓词被称为缺乏稳定性。
为了说明在这种情况下如何容易失去坚定性,请考虑您的(已改进的)程序的(可运行的)草图:
solve_task(Task,Cost):- %agent_current_position(oscar,P),once(solve_task_a(Task,[b(0,0,P)],[],R,Cost,_NewPos)), true.solve_task_a(_, _, _, _, 20, _).solve_task_a(_, _, _, _, 30, _).
Now
?- solve_task(a, Cost).
Cost = 20.
?- solve_task(a, 30).
true.
?- solve_task(a, Cost), Cost = 30.
false.
通过彻底测试变量Cost
,可以轻松解决这个问题,例如产生实例化错误的 Cost >= 0
应该是一个未实例化的变量。但如果您想(正如您在评论中指出的那样)确定成本,您需要这样表述:
solve_task(Task,Cost):- %agent_current_position(oscar,P),once(solve_task_a(Task,[b(0,0,P)],[],R,CostX,_NewPos)), CostX = Cost true.
通过这种方式,我们可以确保 Cost
不会影响 solve_task_a/6
的结果(呃 - 前提是 Cost
之间没有混叠) > 和 Task
- 但我们暂时假设这一点)。有人还说输出统一放在提交后面。
许多人会告诉您,不需要如此额外的小心,因为您永远不会在给定成本的情况下使用 solve_task(Task, Cost)
。也许是这样,但你确定你会记住吗?您确定源代码会记住它(无需任何动态检查)吗?如果你的心智能力负担过重,这种隐含的假设很容易累积到一定程度。
并不总是有简单的出路。但很多时候坚持逻辑纯粹是可能的 logical-purity 。在这种情况下,您不必记住任何此类假设。
<小时/>无论如何,我建议您暂时不要进入 Prolog 的这些部分。而是坚持successor-arithmetics , clpfd ,以及其他干净、单调的程序,保留 logical-purity 。有很多东西要学!
关于prolog - 下面代码中的修剪选择点如何使其更加高效(Prolog)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30824700/
在字符串 (\test.something) 之后删除所有内容的命令是什么。 我在文本文件中有信息,但是在字符串之后有 1000 行我不想要的文本。如何删除包括字符串在内的所有内容。 这就是我所拥有的
我想删除每个项目的空白.amount 我在 .amount 类上使用 trim 和 each,但它似乎不起作用: jQuery('.amount').each(function(){ jQue
我列出了以下正在稳步增加的点,例如: [[0, 0], [9, 4], [18, 19], [25, 34], [48, 48], [54, 53], [61, 65], [69, 82], [73,
清理自动生成的 html 带来更多乐趣。标签中注入(inject)了大量无关的空格: Lorem Ipsum dolor sit... ( 代表实际空间,而不是实
计算 trimmed 的有效方法是什么?或winsorized列表的标准差? 我不介意使用numpy,但如果我必须制作列表的单独副本,它会非常慢。 最佳答案 这将制作两个副本,但您应该尝试一下,因为它
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: Leave only two decimal places after the dot Formatting
我正在使用绑定(bind)来填充 Listbox,其中包含 TextBlock 等。 问题是: 如何确保绑定(bind)到 TextBlock 的 Text 属性的文本具有特定长度,或者它是显示为某些
我正在按以下方式修剪 NSString: NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:
我有一个文本列,其内容在字符串的前后混合了换行符和空白字符。我正在尝试编写一个 SELECT 语句,它向我显示没有前导和尾随垃圾的内容。 以下查询修剪空格: SELECT TRIM(column) F
这个问题在这里已经有了答案: How to slice a pandas DataFrame by position? (5 个答案) 关闭 5 年前。 我似乎看不出这里有什么问题。我有一个长度为
我没有找到类似的问题可能是因为我没有找到正确的词(英语不是我的母语) 问题 我有一个 varchar 值,末尾有一个空格:"opt-193-381-markets " 当我执行 SELECT 的值没有
假设我有 $url="../folder/file",我想找到并删除 ../ 部分。 我正在使用 trim() ...... $url = trim($url,"../"); ……但它给了我一个警告:
这个问题在这里已经有了答案: Java String trim has no effect (7 个答案) string trim function is not working [closed]
我有以下 XML: tag:search.twitter.com,2005:22204349686 如何将第二个冒号后的所有内容写入变量? 例如22204349686 最佳答案 if(preg_mat
修剪在深度优先搜索中什么时候停止有效?我一直在研究一种有效的方法来解决 N-Queens 问题,并且我第一次关注修剪。我已经为前两行实现了它,但它什么时候停止有效?我应该修剪多远? 最佳答案 N 皇后
我有一个图表,按天将两种类型的数据制成表格,我希望只修剪图表中的第一个和最后一个标签。这是一个可重现的数据示例: library(dplyr) library(ggplot2) library(sca
如何去掉 excel 中的前导空格? 我有很多行有这个问题。 最佳答案 在您的空格删除请求中,请注意: TRIM仅删除字符 32,即标准空格。 CLEAN将删除非打印空格,例如回车符(字符 13)和换
当前正在编写指令,并且需要将空格作为字符传递给它。 喜欢: 结果证明 angular 消除了前导空间;但我想保留它。 有什么办法吗? 编辑:我将指令参数作为字符串传递(使用@,而不是作为变量,使用=
我正在为一个使用 Bold for Delphi 对象持久性框架的应用程序的数据库做一些维护。该数据库已经投入生产多年,其中一些表已经变得非常大。其中之一是 BOLD_CLOCKLOG这与 Bold
如何“修剪” NSString 以便仅用旧字符串的特定部分创建新字符串? 例如,我有字符串“Monday the 12th of September”,我如何仅选出“Monday”部分? 最佳答案 使
我是一名优秀的程序员,十分优秀!