2015-02-10 2 views
1

Эй, ребята, у меня довольно простой вопрос о Prolog.Имея «из глобального стека» в прологе

%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

Это код. Не можете ли вы представить минимальный пример, демонстрирующий проблему? –

+1

Если вы используете SWI, просто скажите 'check.'. Вы получите предупреждение о том, что' add (action, _) 'всегда будет терпеть неудачу. – false

+0

Почему вы вызываете 'append' так рано со всеми переменными аргументами? – lurker

ответ

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

Эй, спасибо за ответ, и похоже, что вы совершенно правы, но так как это мой первый «контакт» с прологом, я очень плохо отношусь к нему, вы можете предложить, что может решить проблему в моем случае –

+0

Пожалуйста, прочитайте [о этот сайт] (http://stackoverflow.com/tour) – false