List Prolog脱离全局堆栈
嗨,伙计们,我是Prolog的新手。 我试图在第3课中不重复地组合1000个元素。 我已经完成了代码,但是我有堆栈外的问题List Prolog脱离全局堆栈,list,stack,prolog,overflow,List,Stack,Prolog,Overflow,嗨,伙计们,我是Prolog的新手。 我试图在第3课中不重复地组合1000个元素。 我已经完成了代码,但是我有堆栈外的问题 member(T, [T|R], R) :- !. member(T, [_|L], R) :- member(T, L, R). last_element([H], H) :- !. last_element([H|[X]], X) :- !. last_element([H|T], R) :- last_element(T, R). macronutr
member(T, [T|R], R) :- !.
member(T, [_|L], R) :- member(T, L, R).
last_element([H], H) :- !.
last_element([H|[X]], X) :- !.
last_element([H|T], R) :- last_element(T, R).
macronutrienti(1).
macronutrienti(2).
macronutrienti(3).
and so on
percentuale_macronutrienti(Alimento, R) :-
macronutrienti(Alimento),
R = Alimento.
combina(NRAlimenti, RIS) :-
findall(PM, percentuale_macronutrienti(Alimento, PM), PMR),
f1(NRAlimenti, PMR, PMR, RIS), !.
f1(1, RParz, PMR, RParz) :- !.
f1(Index, RParz, PMR, RIS) :-
Index1 is Index - 1,
g2(RParz, PMR, RIS1, RIS1),
f1(Index1, RIS1, PMR, RIS).
f1(Index, RParz, PMR, RIS) :-
Index1 is Index - 1,
g1(RParz, PMR, RIS1, RIS1),
f1(Index1, RIS1, PMR, RIS).
g1([A|[TA]], A1, OldR, R) :-
q([A], L1, A1),
h1(A, L1, OldR, OldR), !.
g1([A|T], A1, Risultato, R) :-
q([A], L1, A1),
h1(A, L1, OldR, OldR),
append(OldR, TOldR,Risultato),
g1(T, A1, TOldR, R).
q(A, R, A1) :- last_element(A, LastElement), member(LastElement, A1, R).
g2([A|[TA]], A1, OldR, R) :-
q(A, L1, A1),
h2(A, L1, OldR, OldR), !.
g2([A|T], A1, Risultato, R) :-
q(A, L1, A1),
h2(A, L1, OldR, OldR),
append(OldR, TOldR, Risultato),
g2(T, A1, TOldR, R).
h1(_, [], _, _) :- !.
h1(Alimento, [Alimento1], [OldM], R) :- append([Alimento], [Alimento1], OldM).
h1(Alimento, [Alimento1|T1], [OldM|TOldM], NewM) :-
append([Alimento], [Alimento1], OldM),
h1(Alimento, T1, TOldM, NewM).
h2(_, [], _, _) :- !.
h2(Alimento, [Alimento1], [OldM], R) :- append(Alimento, [Alimento1], OldM).
h2(Alimento, [Alimento1|T1], [OldM|TOldM], NewM) :-
append(Alimento, [Alimento1], OldM),
h2(Alimento, T1, TOldM, NewM).
:- combinew(3,R).
怎么了?提前谢谢你这里有一段短得多的代码(我认为)与你的代码相同:
combine(N,L) :-
findall(PM, macronutrienti(PM), PMR),
findall(L0, combine0(N, PMR, L0), LL).
combine0(0, _, []) :- !.
combine0(I, PMR, [X|LR]) :-
member(X, PMR, PMRR),
I1 is I-1,
combine0(I1, PMRR, LR).
member(T, [T|R], R).
member(T, [_|L], R) :- member(T, L, R).
(我稍微更改了您的成员/3
谓词)
但是,这仍然不能解决堆栈溢出问题。基本上,如果我正确理解了您的问题,您希望从1000个元素集中提取长度为3的所有排序子集。您正在查看的组数是1000/(1000-3)!, i、 e.,997.002.000长度为3的列表。这相当多,所以如果你需要一个巨大的堆栈
如果您不需要完整的列表来继续,请更改您的工作流以一次生成一个这样的项目,然后立即处理它,然后继续下一个项目。prolog可能陷入某种无限循环或搜索中。使用trace来检查prolog试图找到解决方案的方式。同样的代码适用于400 macronutrienti(n),但如果我插入1000 macronutrienti(n),prolog将退出堆栈。问题不是无限循环,而是递归调用的数量。在这种情况下,您可以尝试扩展堆栈:我已经检查了堆栈,但问题依然存在。其他想法?如果你不能进一步扩展它,恐怕你需要改进算法的性能,这样它就不会消耗太多内存