/* 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--------------*/ /* */ rule(add_b,[[a],not,[b]],[[add,[b]]]). rule(read_in_an_a,[not,[a],not,[b]],[[read,please_enter_a_bracketed_a]]). rule(del_a,[[a],[b]], [[del,[a]],[print,[just,deleted,a,[a]]],[add,[countexamp]]]). rule(add_counter,[[countexamp],not,[count,Num],not,[counting_done,true]], [[add,[count,0]],[add,[counting_done,false]]]). rule(add_to_counter,[[count,Num],[counting_done,false]], [[exec,add1,[Num,NumPlusOne]], [print,[new,count,value,NumPlusOne]], [del,[count,Num]], [add,[count,NumPlusOne]], [exec,gt,[NumPlusOne,5,TrueOrFalse]], [print,[new,count_done,value,TrueOrFalse]], [del,[counting_done,false]], [add,[counting_done,TrueOrFalse]]]). rule(end_counter1,[[countexamp],[counting_done,true]], [[del,[countexamp]], [del,[counting_done,true]],[add,[countexamp2]]]). exec(add1,[Num,NumPlusOne]) :- NumPlusOne is Num + 1. exec(gt,[X,Y,true]) :- X > Y. exec(gt,[X,Y,false]). rule(add_counter2,[[countexamp2],not,[count2,Num]], [[add,[count2,0]],[del,[countexamp2]]]). rule(add2,[[count2,Num],test,[testlt,[Num,5]]], [[exec,add1,[Num,NumPlusOne]],[del,[count2,Num]], [add,[count2,NumPlusOne]]]). test(testlt,[X,Y]) :- X < Y. tryit :- run([],STMOut,1,Answer),write(Answer),nl.