package Ġcom . mu and rew . y ra i . goal Ċ Ċ import Ġcom . mu and rew . y ra i . agent . Agent Ċ import Ġjava . util .* Ċ Ċ abstract Ġclass ĠStack Goal < A Ġ: ĠAgent >( agent : ĠA ) Ġ: ĠGoal < A >( agent ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsub Go als : ĠStack < Goal < A >> Ġ= ĠStack () ĊĊĠĠĠ Ġoverride Ġfun Ġon Process () Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Ġ= Ġprocess Sub Go als () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Sub Go als (): ĠStatus Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! sub Go als . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( sub Go als . peek (). status Ġ== ĠStatus . COMPLETE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġsub Go als . peek (). status Ġ== ĠStatus . FAILED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= Ġsub Go als . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoal . terminate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! sub Go als . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġsub Go als . peek (). process () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠStatus . COMPLETE Ġ&& Ġsub Go als . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . ACTIVE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . COMPLETE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Terminate () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! sub Go als . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Go als . pop (). terminate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message ( telegram : ĠTelegram ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( sub Go als . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Go als . peek (). handle Message ( telegram ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSince Ġthis Ġis Ġstack Ġbased , Ġl ifo . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġgoal ĠThe ĠGoal Ġto Ġadd . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpush Sub Goal ( goal : ĠGoal < A >) Ġ{ ĊĠĠĠĠĠĠĠ Ġgoal . parent Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġsub Go als . push ( goal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPush Ġwith Ġgoals Ġin Ġorder Ġto ĠStack . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġgoals Ġwill Ġbe Ġadded Ġfrom Ġthe Ġend Ġto Ġthe Ġbeginning Ġto Ġthe Ġstack . ĊĠĠĠĠ Ġ* ĠThis Ġmeans Ġthat Ġthe Ġgoals Ġwill Ġbe Ġprocessed Ġin Ġthe Ġorder Ġyou Ġexpect ĊĠĠĠĠ Ġ* Ġthem Ġto Ġbe Ġprocessed Ġin . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġgoals ĠA ĠList Ġof ĠGo als Ġto Ġadd . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpush Sub Go als ( goals : ĠList < Goal < A >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( goal Ġin Ġgoals . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Sub Goal ( goal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ