- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
step_n(0, I, I).
step_n(N, In, Out) :-
N > 0, plus(N1, 1, N), phase_step(In, T),
step_n(N1, T, Out).
phase_step
是一个转换数据的函数。
step_n
在与
phase_step
几乎相同的内存中运行?如果没有,我应该如何重写它来做到这一点?这将取决于 phase_step 有一个单一的解决方案吗?
prolog_current_frame
进行一些调试后,我发现如果
phase_step
是一个简单的函数,如
Out is In + 1
, 然后优化发生但不在
my use case .
phase_step
谓词?
最佳答案
Will this depend on phase_step having a single solution?
phase_step
具有确定性,这意味着不留下任何“选择点”。一个选择点是 future 要探索的路径;不一定会产生进一步的解决方案,但 Prolog 仍然需要检查。
phase_step_det(X, X).
它有一个单一的解决方案,Prolog 不会提示我们更多:
?- phase_step_det(42, Out).
Out = 42.
以下有一个单一的解决方案,但它不是确定性的:
phase_step_extrafailure(X, X).
phase_step_extrafailure(_X, _Y) :-
false.
看到解决方案后,Prolog还有一点需要检查。即使我们可以通过查看代码来判断某些东西(第二个子句)会失败:
?- phase_step_extrafailure(42, Out).
Out = 42 ;
false.
以下有多个解决方案,因此它不是确定性的:
phase_step_twosolutions(X, X).
phase_step_twosolutions(X, Y) :-
plus(X, 1, Y).
?- phase_step_twosolutions(42, Out).
Out = 42 ;
Out = 43.
Why is TCO dependent on phase_step predicate?
step_n
的副本以及我相应的
phase_step
上面的变体):
?- time(step_n_det(100_000, 42, Out)).
% 400,002 inferences, 0.017 CPU in 0.017 seconds (100% CPU, 24008702 Lips)
Out = 42 ;
% 7 inferences, 0.000 CPU in 0.000 seconds (87% CPU, 260059 Lips)
false.
?- time(step_n_extrafailure(100_000, 42, Out)).
% 400,000 inferences, 4.288 CPU in 4.288 seconds (100% CPU, 93282 Lips)
Out = 42 ;
% 100,005 inferences, 0.007 CPU in 0.007 seconds (100% CPU, 13932371 Lips)
false.
?- time(step_n_twosolutions(100_000, 42, Out)).
% 400,000 inferences, 4.231 CPU in 4.231 seconds (100% CPU, 94546 Lips)
Out = 42 ;
% 4 inferences, 0.007 CPU in 0.007 seconds (100% CPU, 548 Lips)
Out = 43 ;
% 8 inferences, 0.005 CPU in 0.005 seconds (100% CPU, 1612 Lips)
Out = 43 ;
% 4 inferences, 0.008 CPU in 0.008 seconds (100% CPU, 489 Lips)
Out = 44 ;
% 12 inferences, 0.003 CPU in 0.003 seconds (100% CPU, 4396 Lips)
Out = 43 ;
% 4 inferences, 0.009 CPU in 0.009 seconds (100% CPU, 451 Lips)
Out = 44 . % many further solutions
探索这一点的一种方法是使用 SWI-Prolog 调试器,它可以向您展示替代方案(= 选择点 = future 要探索的路径):
?- trace, step_n_det(5, 42, Out).
Call: (9) step_n_det(5, 42, _1496) ? skip % I typed 's' here.
Exit: (9) step_n_det(5, 42, 42) ? alternatives % I typed 'A' here.
[14] step_n_det(0, 42, 42)
Exit: (9) step_n_det(5, 42, 42) ? no debug % I typed 'n' here.
Out = 42 ;
false.
?- trace, step_n_extrafailure(5, 42, Out).
Call: (9) step_n_extrafailure(5, 42, _1500) ? skip
Exit: (9) step_n_extrafailure(5, 42, 42) ? alternatives
[14] step_n_extrafailure(0, 42, 42)
[14] phase_step_extrafailure(42, 42)
[13] phase_step_extrafailure(42, 42)
[12] phase_step_extrafailure(42, 42)
[11] phase_step_extrafailure(42, 42)
[10] phase_step_extrafailure(42, 42)
Exit: (9) step_n_extrafailure(5, 42, 42) ? no debug
Out = 42 ;
false.
所有这些替代方案都对应于额外的解释器框架。如果您使用 SWI-Prolog 的可视化调试器,它还会向您显示堆栈的图形表示,包括所有打开的选择点(尽管我一直觉得这很难理解)。
phase_step
来做到这一点。谓词本身是确定性的。您也可以在
phase_step
之后进行删减。调用内线
step_n
.
phase_step
后面都有一个删减。 :
?- time(step_n_det(100_000, 42, Out)).
% 400,001 inferences, 0.017 CPU in 0.017 seconds (100% CPU, 24204529 Lips)
Out = 42 ;
% 7 inferences, 0.000 CPU in 0.000 seconds (83% CPU, 737075 Lips)
false.
?- time(step_n_extrafailure(100_000, 42, Out)).
% 400,000 inferences, 0.023 CPU in 0.023 seconds (100% CPU, 17573422 Lips)
Out = 42 ;
% 5 inferences, 0.000 CPU in 0.000 seconds (93% CPU, 220760 Lips)
false.
?- time(step_n_twosolutions(100_000, 42, Out)).
% 400,000 inferences, 0.023 CPU in 0.023 seconds (100% CPU, 17732727 Lips)
Out = 42 ;
% 5 inferences, 0.000 CPU in 0.000 seconds (94% CPU, 219742 Lips)
false.
不要盲目地进行切割,只有在您了解您真正需要它们的位置和原因之后。注意
extrafailure
中的方法如果切割只消除失败,但在
twosolutions
如果它删除了实际的解决方案。
关于prolog - 这将是 SWI-Prolog 中优化的尾调用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64605047/
谁赋予了 SWI-Prolog 幽默感? Welcome to SWI-Prolog (threaded, 64 bits, version 7.3.35) SWI-Prolog comes with
简单的例子: ?- between(1,10,X). X = 1 ; X = 2 ; X = 3 ; X = 4 ; X = 5 ; X = 6 ; X = 7 ; X = 8 ; X = 9 ; X
我有这个字符串: B='Dogs cats birds and fish'. 我需要它以下面的格式出现: Dogs, cats, birds, and fish 有没有可能发生这种情况? 我试过 nl
我正在为 Prolog 查询编写一个部分评估器。我尝试使用 expand_goal/2 扩展查询,但它只是统一了 Input与 Output在这种情况下: :- initialization(main
在 SWI Prolog 终端中如何查看当前工作目录并更改当前工作目录? 我发现: 工作目录(CWD,CWD) 但我不认为这是我需要的 最佳答案 要获取当前工作目录,请使用 working_direc
如何关闭 swi-prolog 中的警告。 Clauses of XXX/AA are not together in the source-file 很烦人。 最佳答案 相反,您可以修复警告。 di
我正在尝试使用此处文档中所谓的内置谓词 split_string/4:http://www.swi-prolog.org/pldoc/man?predicate=split_string/4 但是,当
从https://stackoverflow.com/a/44524628?noredirect=1跟进 :-use_module(library(http/http_client)). :-use_
我在序言SWI与CHR(约束处理规则)创建多个谜题解决者 一切都很好,但是,我喜欢测试哪个求解器是最好的。 因此,我想搞清楚,这解算器使用回溯的最少。 是否有一种聪明的方法可以找出(或打印出)求解器解
我正在尝试开发有关使用 swi-prolog 的常见问题解答(faq)。我将 swi-prolog 用于桌面(AMD64,多线程,版本 8.2.3)。 常见问题解答中的问题和答案以土耳其的母语编写。当
我在 Prolog 中编写了一个快速谓词,尝试使用 CLP(FD) 及其求解方程组的能力。 problem(A, B) :- A-B #= 320, A #= 21*B. 当我在 SW
我对 prolog 很困惑,它与我曾经使用过的任何语言(多种语言)都不同,我如何从以下位置获取 argv[0]: current_prolog_flag(argv, Argv), write(Argv
我正在尝试使用SWI-prolog将规则动态添加到知识库中,其中该规则的主体事先未知。 所需的规则如下所示: rule(a) :- fact(1), fact(2). 通常,您只需声明 assert(
我正在使用 SWI-Prolog 并且我正在尝试打印一个列表,但是如果该列表有 9 个以上的项目 - 它看起来像这样 - [1, 15, 8, 22, 5, 19, 12, 25, 3|...] 有没
我将用户输入重定向到文件see('entradasaida.txt')。很好 虽然,当我尝试从该流输入文件读取时,swi给了我这个错误: ERROR: entradasaida.txt:3:0: Sy
在“序言中的专家系统”一书中,我遇到了一个障碍。书中定义了一个简单的shell如下: solve :- abolish(known, 3), define(known, 3), to
我正在尝试比较 prolog 中的两个 peano 数,但有些结果是错误的。 任何人都可以帮助我,这是我的代码: %Not Equal notequal(0,s(A),X). notequal(s(A
假设我有一个包含以下内容的文件 main.pl /* I tried these one at a time, not all at once... */ [externalFile]. ['exte
append/3是一个非常强大的谓词。假设我想要一个以相同方式工作的谓词,但对于 SWI-Prolog 的字符串。 我看到的最简单的方法是使用 string_codes/2 将这些字符串转换为列表。
我正在努力理解如何正确使用 discontiguous/1 (SWI) Prolog 中的谓词。 让 buumi.pl成为这个伪事实的小文件: discontiguous(buumi/1). buum
我是一名优秀的程序员,十分优秀!