【问题标题】:Having a "out of global stack" in prolog在序言中有一个“全局堆栈之外”
【发布时间】:2015-04-10 14:23:34
【问题描述】:

大家好,我有一个关于 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). 它只是说在全局堆栈之外。有人可以帮我解决这个问题吗

【问题讨论】:

  • 那是很多代码。您不能提供一个演示问题的最小示例吗?
  • 如果您使用 SWI,只需说 check. 您将收到警告,adds(action,_) 将始终失败。
  • 你为什么这么早就给append打电话?

标签: prolog planning failure-slice


【解决方案1】:

你只需要看看这个:

plan(State,Goals,[],State):- false, 满意(状态,目标)。 计划(状态,目标,计划,最终状态):- append(PrePlan,[Action|PostPlan],Plan), false, 选择(状态,目标,目标)达到(行动,目标)可以(动作,条件)plan(State,Condition,PrePlan,MidState1), 申请(MidState1,Action,MidState2), 计划(MidState2,Goals,PostPlan,FinalState)。 ?- 计划(state1,on(b1,b2),Plan,FinalState)。

由于该程序已经循环,因此相同的程序将循环并删除额外的 false 目标。你需要先解决这个问题。请参阅 了解更多信息。

【讨论】:

  • 嘿,谢谢你的回复,看起来你是完全正确的,但由于这是我第一次与 prolog 的“接触”,我很不擅长它,你能建议什么可以解决问题我的情况
猜你喜欢
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2019-02-16
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多