- 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/
我正在学习序言。 在我看来,prolog 的规则(关系和简单的事实)是“肯定的”——他们说的是或可能是真的。 向 prolog 程序添加新的此类规则只会增加“正面”知识。它不能添加“负面”事实来说明某
希望你一切都好。我是 prolog 的新手,我在编写代码时遇到问题。这段代码的目的很简单。它将列表中的每个元素添加到最后一个。我可以用 Java 做的事情是: static void add(
在closed-world assumption下, what is not currently known to be true, is false Prolog 的语义通常被称为遵循封闭世界假设,
我正在 Prolog (swi-prolog) 中做我的第一步,但无法解决以下问题:如何将存在量化的规则包含在我的事实中;具体来说,我如何包含句子“每个人都是某人的 friend ”\forall x
我知道如何以过程方式(即,在 C++、Java 等中)对 BST 执行范围查询,但我发现很难转换为 Prolog 语言。 程序的方式应该是这样的: http://www.geeksforgeeks.o
Prolog 中是否有(相对)当前最佳实践的引用资料?一本适合没有学习过逻辑编程或“Prolog 的工艺”等高级文本的商业 Prolog 开发人员? 有很多通用教程,但我能找到的关于最佳实践的唯一一个
这是CFG: S -> T | V T -> UU U -> aUb | ab V -> aVb | aWb W -> bWa | ba 所以这将接受某种形式的: {a^n b^n a^m b^m |
我目前有以下问题,我想用 Prolog 解决。这是一个简单的例子,很容易在 Java/C/whatever 中解决。我的问题是,我认为与 Java 的思想联系太紧密,无法以利用 Prolog 逻辑能力
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我无法理解差异列表,尤其是在这个谓词中: palindrome(A, A). palindrome([_|A], A). palindrome([C|A], D) :- palindrome(A
(这不是一个类(class)作业问题。只是我自己的个人学习。) 我正在尝试在 Prolog 中进行练习以从列表中删除元素。这是我的代码: deleteall([],X,[]). deleteall([
我最近试图了解 Prolog,它似乎可以很好地映射到很多领域,但我无法弄清楚它可能不擅长什么。 那么它有什么不好的(除了需要实时/无 gc 性能的东西)? 最佳答案 我同意你的一般评估,即 Prolo
我正在组装一个简单的元解释器,它输出证明的步骤。我无法将证明步骤作为输出参数。我的谓词 explain1 以我想要的详细形式返回证明,但不是作为输出参数。我的谓词 explain2 将证明作为输出参数
hi(g,plus(A,B),int) :- hi(g,A,int),hi(g,B,int),!. 在上面的语句中 '!' 是什么意思?在声明的末尾签名吗? 最佳答案 那是 cut operator
有没有一种简单的方法可以让 prolog 中的查询只返回每个结果一次? 例如我正在尝试类似的东西: deadly(Xn) :- scary(X), Xn is X - 1, Xp is X + 1,
我正在尝试学习 Prolog。这是我使用这种语言的第一步。作为练习,我想编写可以识别一些扑克手牌的程序(同花顺、同花顺、满屋等)。 我正在 Prolog 中寻找良好的卡片表示。我需要有可能检查一张卡片
我刚刚被介绍到 Prolog 并且正在尝试编写一个谓词来查找整数列表的最大值。我需要写一个从头开始比较,另一个从结尾比较。到目前为止,我有: max2([],R). max2([X|Xs], R):-
我试图在Prolog中编写谓词palindrome/1,当且仅当其列表输入包含回文列表时才为true。 例如: ?- palindrome([1,2,3,4,5,4,3,2,1]). 是真的。 有什么
我正在尝试编写一个程序,该程序将两个列表作为输入并检查适当的子集。我开始于: proper([A],[]). proper([],[A]). proper([A|T1],[A|T2]) :- prop
我是 Prolog 的新手,我正在使用 SWI-Prolog v6.6 在 *.pl 中存储断言文件。 :- dynamic fact/2. assert(fact(fact1,fact2)). 使用
我是一名优秀的程序员,十分优秀!