- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 (SWI-) Prolog 程序,它以非常庞大的方式 (²) 使用 CLP(FD) 变量。我正在将 CLP(FD) 项列表移入和移出几个谓词 (¹),并且它们的约束呈指数增长。我的代码适用于小列表,但是当我尝试将它用于长元素列表(其中每个元素的约束量变得巨大)时,我最终得到了 超出全局堆栈 错误。
我的观点是我是否可以使用不同的方法在不使用堆栈的情况下传递如此巨大的参数。我的第一个想法是使用 asserta
将中间结果存储在动态数据库中,但我不确定是否能够以这种方式存储未实例化的变量或 CLP(FD) 约束。而且我也不知道这是否是最佳解决方案......
¹ 更多详情:我需要的是 N 个长度为 L 的列表的重叠,其中第一个元素被偏移。但是,偏移量不受限制,而是 CLP(FD) 变量。
² 更多详情:基本上,我有许多列表,其中每个元素都有数千个约束。每个元素约束基本上都保存有关其值的信息,这些信息与“主变量”值相关联。根据主变量的值,每个列表项都有一个或另一个值。
由于我已经在实现此类列表生成器时遇到了问题,因此我在这里征求了一些建议,因此您可以看到实际的列表生成器谓词 overlap_at/5
, here .overlap_lists/4
是发出错误的谓词(它 是否 工作正常 Rs
的长度小于 140 个元素且小于 10 Cs
个元素):
% Cs -> lists that have to be overlapped. Their items are integers.
% Ss -> Offsets per each list. They are CLP(FD) variables.
% Rs -> (not important here)
% Os -> List of overlapped elements.
overlap_lists(Cs,Ss,Rs,Os) :-
length(Rs,L),
zeros(Zs,L), % The initial list to overlap with is a list filled with zeros.
overlap(Cs,Ss,Zs,Os),
list_limit(Os,Rs). % Constrains the consumptions
overlap([],[],Fs,Fs) :- !.
overlap([C|Cs],[S|Ss],Os,Fs) :-
fd_inf(S,Inf),
overlap_at(Os,C,S,Inf,Os2),!,
overlap(Cs,Ss,Os2,Fs).
overlap_at([], _, _, _, []).
overlap_at([A|As], Bs, S, N0, [AB|ABs]) :-
overlap_here(Bs, [A|As], [AB|ABs], Conj),
S #= N0 #==> Conj,
S #> N0 #==> AB #= A,
N1 #= N0 + 1,
overlap_at(As, Bs, S, N1, ABs).
overlap_here(_, [], _, 1) :- !.
overlap_here([], [A|As], [AB|ABs], (AB #= A #/\ Rest)) :-
overlap_here([], As, ABs, Rest).
overlap_here([B|Bs], [A|As], [AB|ABs], (AB #= A + B #/\ Rest)) :-
overlap_here(Bs, As, ABs, Rest).
最佳答案
想到的第一件事:增加SWI-Prolog通过的全局堆栈分配swipl -G128M ...
它可能会帮助您阅读有关 Prolog 堆栈的更多信息:例如,不要将全局堆栈与本地堆栈混淆。以不同的方式传递参数通常不会帮助您减少全局堆栈的使用。 Richard O'Keefes Prolog 的工艺包含一个关于空间去向的很好的讨论。
在 64 位处理器上,使用 SWI-Prolog 的全局堆栈可能大于 128MB,因此对于严重的计算,您可能需要一台具有大量 RAM 的 64 位机器。
话虽如此,我发布的代码仅使用多项式而非指数内存量。如果您以需要指数空间的方式来表述问题,您可能首先尝试找到更(内存)效率更高的公式。这个问题本质上似乎并不需要指数空间。
如果您需要保留对 assertz/1
的约束, 使用 copy_term/3
获取作为剩余目标的约束,并将这些剩余目标与变量一起声明,以便您稍后可以通过 maplist(call, Gs)
恢复目标.
关于list - 如何避免 SWI-Prolog 中的 "out of global stack"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20903540/
谁赋予了 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
我是一名优秀的程序员,十分优秀!