/* rules2.pl plj 2/16/94 */ /* rules.pl plj 2/21/93 */ /* plj updated 3/2/93 with exec */ run(STMStart,STMFinal,ProblemNum,Answer) :- run_rule(STMStart,STM2,ProblemNum,Answer),run(STM2,STMFinal,ProblemNum,Answer). run(STM,STM,ProblemNum,[rules,stoped,because,no,more,rules,can,fire, probmemnumber,ProblemNum,endingSTM,STM]). run_rule(STMStart,STMFinal,ProblemNum,Answer) :- rule(RuleName,RuleLHS,RuleRHS), list_match(RuleLHS,STMStart,STMStart,_), write(firing_rule),write(RuleName),nl, !, fire_rule(RuleRHS,STMStart,STMFinal), write(new_stm),write(STMFinal),nl. fire_rule([],STM,STM). fire_rule([Command|RestCommands],STMStart,STMFinal) :- do_command(Command,STMStart,STM2), fire_rule(RestCommands,STM2,STMFinal). do_command([add,AddItem],STM,[AddItem|STM]). do_command([del,DelItem],STMStart,STMFinal) :- add_member(DelItem,STMFinal,STMStart). do_command([exec,ExecName,PatternExec],STM,STM) :- exec(ExecName,PatternExec). do_command([read,PromptMessage],STM,[ReadItem|STM]) :- write(PromptMessage),nl,read(ReadItem). do_command([print,Message],STM,STM) :- write(Message),nl. list_match([],_,List,List). list_match([not,Item|RestItems],ListFull,ListIn,ListUnmatched) :- not_member(Item,ListFull), list_match(RestItems,ListFull,ListIn,ListUnmatched). list_match([test,[NameTest,ParmTest]|RestItems],ListFull,ListIn,ListUnmatched) :- test(NameTest,ParmTest), list_match(RestItems,ListFull,ListIn,ListUnmatched). list_match([Item|RestItems],ListFull,ListIn,ListUnmatched) :- add_member(Item,List2,ListIn), list_match(RestItems,ListFull,List2,ListUnmatched). add_member(Item,[],[Item]). add_member(Item,List,[Item|List]). add_member(Item,[HeadList|RestList],[HeadList|NewRestList]) :- add_member(Item,RestList,NewRestList). not_member(Item,List) :- member(Item,List),!,fail. not_member(Item,List). member(Item,[Item|RestList]). member(Item,[OtherItem|RestList]) :- member(Item,RestList). /*-------------------------start rules--------------*/ /* */ /* example.rules plj 2/22/93 */ rule(p1,[[put-on,Object,Support]], [[del,[put-on,Object,Support]], [add,[put-at,Object,[space,on,Support]]]]). rule(p2,[[put-at,Object,Newplace],not,[grasp,Object]], [[del,[put-at,Object,Newplace]], [add,[target,Object,Newplace]], [add,[grasp,Object]]]). rule(p3,[[move,Object],[Support,supports,Object]], [[del,[move,Object]], [del,[Support,supports,Object]]]). rule(p4,[[move,Object]], [[del,[move,Object]], [print,[move-hand,Newplace]], [print,[ungrasp]]]). rule(p5,[[grasp,Object],[Object,supports,nothing]], [[del,[grasp,Object]], [del,[Object,supports,nothing]], [add,[move,Object]], [print,[move-hand,[top-of,Object]]], [print,[grasp,Object]]]). rule(p6,[[grasp,Object],[Object,supports,Obstruction], not,[grasp,Obstruction]], [[add,[put-on,Obstruction,floor]]]). rule(p7,[[grasp,Object],not,[Object,supports,Obstruction]], [[read,[what,is,on,Object]]]). tryit :- run([[put-at,table,xyz]],STMFinal,1,Answer),write(Answer),nl.