2015-02-10 18 views
1

嘿,我有一個關於Prolog的相當簡單的問題。在序言中有一個「out of global stack」

%on(Block,Object). 
% clear(Object). 
block(b1). 
block(b2). 
block(b3). 

place(p1). 
place(p2). 
place(p3). 
place(p4). 
state1([clear(p2),clear(p4),clear(b2),clear(b3),on(b1,p1),on(b2,p3),on(b3,b1)]). 
% visual state1 
% b3 
% b1 b2 
% = = = = 
% 1 2 3 4  <----Positions 
% can(Action,Condition). 
% adds(Action,AddRelationship). 
% deletes(Action,DeleteRelationship). 
% move(Block,From,To). 
can(move(Block, From, To), [ clear(Block), clear(To), on(Block, From)]) :- 
    block(Block),  % Block to be moved 
    object(To),   % "To" is a block or a place 
    To \== Block,   % Block cannot bå moved to itself 
    object(From),   % "From" is a block or a place 
    From \== To,   % Move to new position 
    Block \== From.  % Block not moved from itself 
adds(move(X,From,To),[on(X,To),clear(From)]). 
deletes(move(X,From,To),[on(X,From),clear(To)]). 
object(X):- 
     place(X) 
     ; 
     block(X). 
% plan(State,Goals,Plan,FinalState). 
plan(State,Goals,[],State):- 
    satisfied(State,Goals). 
plan(State,Goals,Plan,FinalState) :- 
    append(PrePlan,[Action|PostPlan],Plan), 
    select(State,Goals,Goal), 
    achieves(Action,Goal), 
    can(Action,Condition), 
    plan(State,Condition,PrePlan,MidState1), 
    apply(MidState1,Action,MidState2), 
    plan(MidState2,Goals,PostPlan,FinalState). 
% satisfied(State,[]). 
satisfied(State,[Goal|Goals]):- 
    member(Goal,State), 
    satisfied(State,Goals). 
select(State,Goals,Goal):- 
    member(Goal,Goals), 
    not(member(Goal,State)). 
achieves(Action,Goal):- 
    adds(Action,Goals), 
    member(Goal,Goals). 
apply(State,Action,NewState):- 
    deletes(Action,DelList), 
    delete_all(State,DelList,State1),!, 
    adds(action,AddList), 
    append(AddList,State1,NewState). 
delete_all([],_,[]). 
delete_all([X|L1],L2,Diff):- 
    member(X,L2),!, 
    delete_all(L1,L2,Diff). 
delete_all([X|L1],L2,[X|Diff]):- 
    delete_all(L1,L2,Diff). 

在編譯器運行此之後,它說,它已經沒有問題,但是當我嘗試執行命令 plan(state1,on(b1,b2),Plan,FinalState). 它只是說出來的全球棧。有人可以幫助我解決這個

+1

這是很多代碼。你不能提供一個最小的例子來證明這個問題嗎? – 2015-02-10 14:31:34

+1

如果你使用SWI,只需說'check.'你會得到一個警告,說'增加(action,_)'將總是失敗。 – false 2015-02-10 14:41:21

+0

你爲什麼這麼早就用所有可變參數調用'append'? – lurker 2015-02-10 15:39:21

回答

3

你只需要看看這個:

 
plan(State,Goals,[],State):- false, 
    satisfied(State,Goals). 
plan(State,Goals,Plan,FinalState) :- 
    append(PrePlan,[Action|PostPlan],Plan), false, 
    select(State,Goals,Goal), 
    achieves(Action,Goal), 
    can(Action,Condition), 
    plan(State,Condition,PrePlan,MidState1), 
    apply(MidState1,Action,MidState2), 
    plan(MidState2,Goals,PostPlan,FinalState). 

?- plan(state1,on(b1,b2),Plan,FinalState). 

因爲這個程序已經循環,同樣的程序將環與另外false目標中刪除。你首先需要解決這個問題。有關更多信息,請參見

+0

嘿,謝謝你的回覆,看起來你是完全正確的,但是因爲這是我與prolog的第一次「聯繫」,我很不好,你能提出什麼可以解決我的問題 – 2015-02-10 22:22:03

+0

請閱讀[關於本網站](http://stackoverflow.com/tour) – false 2015-02-11 18:15:16