[英]Prolog Action Planner Out Of Local Stack Error
我正在嘗試實現一種計划程序,即對於給定的整數N,使用N個動作生成X個可能的計划。 動作具有必須滿足的條件和限制,以及將應用於當前狀態的影響列表。 我實現了檢查限制和條件的謂詞,以及應用了影響的謂詞。 我創建的此方法已經生成了帶有N個動作的計划,但是當我按“;”時 在swi-prolog中查看其他結果,我得到以下錯誤:
ERROR: Out of local stack
這是我的代碼:
makePlan(0,_,List):- List = [].
makePlan(N,I,R):- makeSinglePlan(N,I,R).
makeSinglePlan(0, _ ,_).
makeSinglePlan(N,I,[X|LIST]):-
accao(nome : X, condicoes : Y, efeitos : Z, restricoes : W),
checkAllConditions(Y, I),
checkRestrictions(W),
applyEffects(I, Z, Current),
decrement(N, B),
list_to_set(Current, NC),
makeSinglePlan(B,NC,LIST).
decrement(N,B):- B is N-1.
這就是我從控制台調用謂詞的方式,第一個參數是整數N,代表計划應執行的操作數,第二個參數是初始狀態,第三個參數是返回值:
makePlan(2, [clear(b),on(b,a),on(a,mesa),clear(d),on(d,c),on(c,mesa)], R).´
動作示例:
accao(nome : putOn(X,Y), %name
condicoes : [on(X,Z),clear(X),clear(Y)], %conditions
efeitos : [clear(Z),on(X,Y),-on(X,Z),clear(b)], %effects
restricoes : [(Y\==mesa),(X\==Y),(X\==Z),(Y\==Z)]) %restrictions
輔助謂詞:
% 1 - conditions to be checked 2 - current state
checkAllConditions([],_).
checkAllConditions([X|T],L):- checkCond(X,L) , checkAllConditions(T,L) .
checkCond(X,[X|_]).
checkCond(X,[_|T]):-checkCond(X,T).
% 1 - restrictions to be checked
checkRestrictions([]).
checkRestrictions([X|T]):- X, checkRestrictions(T).
% 1 -current state 2 - effects to be applied 3 - result
applyEffects(L,[],L).
applyEffects(L, [-X|YTail], A):- ! ,remove(X, L, B), applyEffects(B,YTail, A).
applyEffects(L, [Y|YTail], A):- insert(Y, L, B), applyEffects(B,YTail, A).
insert(E, L1, [E|L1] ).
remove(_,[],[]).
remove(X, [X|L1], A):- !, remove(X,L1,A).
remove(X, [Y|L1], [Y|A]):- remove(X,L1,A).
必須進行兩項更改:
makeSinglePlan(0, _ ,[]).
makeSinglePlan(N,I,[X|LIST]):-
N > 0,
....
動作列表應以[]
結尾,並且該規則僅適用於N > 0
。
?- makePlan(2, [clear(b),on(b,a),on(a,mesa),clear(d),on(d,c),on(c,mesa)], R).
R = [putOn(b, d), putOn(b, a)] ;
R = [putOn(b, d), putOn(a, b)] ;
R = [putOn(b, d), putOn(a, d)] ;
R = [putOn(b, d), putOn(d, b)] ;
R = [putOn(b, d), putOn(d, a)] ;
R = [putOn(d, b), putOn(d, c)] ;
R = [putOn(d, b), putOn(b, c)] ;
R = [putOn(d, b), putOn(b, d)] ;
R = [putOn(d, b), putOn(c, b)] ;
R = [putOn(d, b), putOn(c, d)] ;
false.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.