1%:-prolog_flag(compiling,_,profiledcode). 2?-use_module(library(lists)). 3 4 5 6reduceLoops(Actions, Ordering, FinalOrdering):- 7 8 %locate any loops which exist 9 member( happens(edgeProgression(loop(LoopDestination), _),LoopCallTimepoint,LoopCallTimepoint) , Actions ), 10 11 %Find the destination they loop to 12 !, matchHappens(LoopDestination,Timepoint,DestinationTimepoint, Actions), 13 14 removeGoalAchievement(LoopCallTimepoint, Ordering, NewOrdering), 15 16 addLoopAchievement(DestinationTimepoint,LoopCallTimepoint, NewOrdering, FinalOrdering ). 17 18%If We ever fail the plan does not have a loop in it so return the same Ordering 19reduceLoops(_, Ordering, Ordering). 20 21 22removeGoalAchievement(LoopCallTimepoint, Ordering, NewOrdering):- 23 24 delete(Ordering,before(LoopCallTimepoint,t), NewOrdering),!. 25 26 27addLoopAchievement(DestinationTimepoint,LoopCallTimepoint, Ordering, NewOrdering):- 28 29 append([before(LoopCallTimepoint,DestinationTimepoint)], Ordering, NewOrdering), !. 30 31 32listMember([], CheckList) :- !, fail. 33 34listMember([Head|Tail], CheckList):- 35 36 member(Head, CheckList), !. 37 38listMember([Head|Tail], CheckList):- 39 !, listMember(Tail, CheckList), !. 40 41 42 43% --------------Tests ---------------------- 44/* 45%simple plan 46test_reduceLoops :- reduceLoops([happens(formEntry(assessForm,user,group), t6,t6),happens(edgeProgression(loop(formEntry(assessForm,user,group)), formElement( test2 ,match, off )),t9,t9)], [before(t9,t),before(t2,t)]). 47 48%complex plan 49test1_reduceLoops :- reduceLoops([happens(formEntry(admissionForm,jw99,receptionist),t12,t12),happens(createFormElement(textbox,patientName,'',[size=30]),t17,t17),happens(createFormElement(textbox,houseNumber,'',[size=100]),t18,t18),happens(createFormElement(textbox,road,'',[size=100]),t19,t19),happens(createFormElement(textbox,age,'',[size=100]),t20,t20),happens(createFormElement(textbox,ward,'',[size=100]),t21,t21),happens(entry(form,element,childddddddd),t29,t29),happens(entry(form,elementss,level1childrensward),t30,t30),happens(formSubmission(admissionForm),t16,t16),happens(edgeProgression(admissionForm,formElement(patientName,presence,none)),t33,t33),happens(formEntry(assessForm,jw99,doctor),t37,t37),happens(createFormElement(textarea,drugs,'',[rows=30,cols=30]),t42,t42),happens(formSubmission(assessForm),t41,t41),happens(edgeProgression(assessForm,formElement(drugs,presence,none)),t45,t45),happens(formEntry(checkdrugs,jw99,pharmacist),t49,t49),happens(createFormElement(checkbox,correctDrugs,true,[size=2]),t58,t58),happens(createFormElement(checkbox,doctorDrugs,database,[size=2]),t59,t59),happens(databaseFetch(drugsSpec),t55,t55),happens(formSubmission(checkdrugs),t57,t57),happens(edgeProgression(checkdrugs,formElement(correctDrugs,match,false)),t62,t62),happens(formEntry(failedDrugsApproval,jw99,doctor),t66,t66),happens(createFormElement(textbox,patientNameFailed,'',[multline]),t71,t71),happens(formSubmission(failedDrugsApproval),t70,t70),happens(edgeProgression(loop(formEntry(assessForm,_,_)),formElement(test2,match,off)),t77,t77)],[before(t66,t71),before(t71,t70),before(t49,t58),before(t59,t55),before(t58,t59),before(t55,t57),before(t37,t42),before(t42,t41),before(t12,t17),before(t20,t21),before(t19,t20),before(t18,t19),before(t17,t18),before(t70,t77),before(t77,t),before(t57,t62),before(t62,t66),before(t41,t45),before(t45,t49),before(t16,t33),before(t33,t37),before(t30,t16),before(t21,t29),before(t29,t30)]). 50*/