agent_name(calendar_manager). abducible([insert_decision]). recursive([priorities_all]). % this agent deals with the interactions with the calendar % process % The status of appointments is indicated by atomic functors % meeting % blocked % private %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% %%%%%%% initialization %%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% assimilate(T,agent_init,initial) -: c_module(sc_link,scheduler(calendar_manager)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%% %%%%%% schedule a new meeting %%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% assimilate(T,calendar,schedule(Year,Month,Day,<0,0,Title,Memo,Status,Participants>)) ->schedule_new_meeting(T,Year,Month,Day,<0,0,Title,Memo,Status,Participants>). schedule_new_meeting(T,Year,Month,Day,<0,0,Title,Memo,Status,Participants>) -:get_priorities(Participants,T). get_priorities(Participants,T) -:x_window(query,"would you like to assign priorites to the participants?",priorities_query(Participants,T)). assimilate(T1,x_window,), member(X,Participants) -:x_window(dialog,X,priority(X,T)). schedule_new_meeting(T,Year,Month,Day,<0,0,Title,Memo,Status,Participants>), assimilate(T1,x_window,), same_priority(Participants,Priorities), convert_participants(Participants,FullParticipants), convert_priorities(FullParticipants,Priorities,FullPriorities) -:request(proto_scheduler,schedule_meeting(,FullParticipants,FullPriorities,)). priorities_all([],[],T). priorities_all([X|Participants],[Y|Priorities],T)<- priority(T,X,Y), priorities_all(Participants,Priorities,T). assimilate(T1,x_window,), string_integer(Priority,D_Priority) ->priority(T,Participant,D_Priority). schedule_new_meeting(T,Year,Month,Day,<0,0,Title,Memo,Status,Participants>), priorities_all(Participants,Priorities,T), convert_participants(Participants,FullParticipants), convert_priorities(FullParticipants,Priorities,FullPriorities) -:request(proto_scheduler,schedule_meeting(,FullParticipants,FullPriorities,)). convert_participants([],[]). convert_participants([Name|RestP],[F|RestF]):- concatenate(["self@",Name],FName), string_term(FName,F), convert_participants(RestP,RestF). convert_priorities([],[],[]). convert_priorities([Participant|Rest],[Priority|RestP],[|RestC]):- convert_priorities(Rest,RestP,RestC). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%% %%%%%%%%% deal with request for free times on a given day %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% assimilate(T,Agent,request_free_times(meeting(M,P,))) -:c_module(sc_link,enquire(free_times(T),list,Year,Month,Day)). assimilate(T,Agent,request_free_times(meeting(M,P,Date))), assimilate(T1,calendar,), compute_free_times(Date,AppointmentList,FreeTimes) -:inform(Agent,free_times(meeting(M,P,Date),FreeTimes)). compute_free_times(Date,BusyTimes,Times):- weekday(Date,Day), free_times(Day,Default), filter(Default,BusyTimes,Times). filter([],BusyTimes,[]). filter([Time|RestTimes],BusyTimes,[Time|RestFreeTimes]):- not(busy(Time,BusyTimes)), filter(RestTimes,BusyTimes,RestFreeTimes). filter([Time|RestTimes],BusyTimes,RestFreeTimes):- busy(Time,BusyTimes), filter(RestTimes,BusyTimes,RestFreeTimes). busy(Time,BusyTimes):- times([Time,100],Stime), add([Stime,100],Etime), occursIn(Stime,Etime,BusyTimes). occursIn(ST,ET,[|Rest]):- overlaps(ST,ET,Start,End). occursIn(ST,ET,[A|Rest]):- occursIn(ST,ET,Rest). overlaps(ST,ET,Start,End):- less([Start,ST],yes), less([ST,End],yes). overlaps(ST,ET,Start,End):- less([ST,Start],yes), less([Start,ET],yes). overlaps(ST,ET,ST,ET). defaultFreeTimes([8,9]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%% %%%%%%%%% mark a given time as blocked %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% assimilate(T,Agent,mark_blocked(meeting(,Participants,),Time,Ref)), times([Time,100],StartTime), add([StartTime,100],EndTime) -:c_module(sc_link,enquire(block_query(inform(Agent,Ref),Year,Month,Day,),start,Year,Month,Day,StartTime)). assimilate(T,calendar,) -:c_module(sc_link,insert(inform(Agent,Ref),Year,Month,Day,Appointment)). assimilate(T,calendar,>) -:x_window(inform,"Error: Trying to block a busy slot",0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%% %%%%%%%%% mark a given time as unblocked %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% assimilate(T,Agent,mark_unblocked(,Time,Ref)), times([Time,100],StartTime), add([StartTime,100],EndTime) -:c_module(sc_link,enquire(ref(T),start,Year,Month,Day,StartTime)). assimilate(T,Agent,mark_unblocked(,Time,Ref)), assimilate(T1,calendar,>) -:c_module(sc_link,delete(inform(Agent,Ref),Year,Month,Day,)). assimilate(T,calendar,inform(Agent,Ref)) -:inform(Agent,Ref). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%% insert a scheduled meeting in the calendar %%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% assimilate(T,Agent,new_meeting(meeting(,Participants,),Time)), times([Time,100],StartTime), add([StartTime,100],EndTime) -> insert_meeting(T,Year,Month,Day,). insert_meeting(T,Year,Month,Day,) -:c_module(sc_link,enquire(enquire(T),start,Year,Month,Day,StartTime)). insert_meeting(T,Year,Month,Day,Appointment), assimilate(T1,calendar,) -:c_module(sc_link,insert(inserted(T),Year,Month,Day,Appointment)). insert_meeting(T,Year,Month,Day,Appointment), assimilate(T1,calendar,>) -:c_module(sc_link,delete(delete(T),Year,Month,Day,)). insert_meeting(T,Year,Month,Day,Appointment), assimilate(T1,calendar,delete(T)) -:c_module(sc_link,insert(inserted(T),Year,Month,Day,Appointment)). assimilate(T,Agent,new_meeting(Meeting,Time)), assimilate(T1,calendar,inserted(T)) -:inform(Agent,confirm(Meeting)). %(may involve bumping off an activity, which can kick off a cancellation %dialog) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% %%%%%%% echo %%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% assimilate(T,Agent,echo(Term)) -:c_module(sc_link,Term). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% %%%%%%% deal with user requested insert %%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% assimilate(T,calendar,insert(Year,Month,Day,)) -:c_module(sc_link,enquire(enquire(T),start,Year,Month,Day,Start)). assimilate(T,calendar,insert(Year,Month,Day,)), assimilate(T1,calendar,) -:c_module(sc_link,insert(0,Year,Month,Day,)). assimilate(T,calendar,insert(Year,Month,Day,Appointment)), assimilate(T1,calendar,>) -:c_module(sc_link,delete(delete(T),Year,Month,Day,)). assimilate(T,calendar,insert(Year,Month,Day,Appointment)), assimilate(T1,calendar,>) -:x_window(query,"Do you really want to schedule for blocked period?",enquire_blocked(T,)). assimilate(T,calendar,insert(Year,Month,Day,Appointment)), assimilate(T1,calendar,>) -:x_window(query,"Do you really want to withdraw from meeting?",enquire_delete_meeting(T,)). assimilate(T,calendar,insert(Year,Month,Day,Appointment)), assimilate(T1,x_window,) -:c_module(sc_link,delete(delete(T),Year,Month,Day,OldAppointment)). %should give withdrawal notice assimilate(T,calendar,insert(Year,Month,Day,Appointment)), assimilate(T1,calendar,delete(T)) -:c_module(sc_link,insert(0,Year,Month,Day,Appointment)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% %%%%%%% deal with user requested delete %%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% assimilate(T,calendar,delete(Year,Month,Day,)) -:c_module(sc_link,delete(0,Year,Month,Day,)). assimilate(T,calendar,delete(Year,Month,Day,)) -:c_module(sc_link,delete(0,Year,Month,Day,)). assimilate(T,calendar,delete(Year,Month,Day,)) -:x_window(query,"Do you really want to withdraw from meeting?",enquire_delete_meeting(T,)). assimilate(T,calendar,delete(Year,Month,Day,)) -:x_window(query,"Do you really want to delete blocked slot?",enquire_delete_blocked(T,)). assimilate(T,calendar,delete(Year,Month,Day,Appointment)), assimilate(T1,x_window,) -:c_module(sc_link,delete(0,Year,Month,Day,Appointment)). assimilate(T,calendar,delete(Year,Month,Day,Appointment)), assimilate(T1,x_window,) -:c_module(sc_link,delete(0,Year,Month,Day,Appointment)). %should give withdrawal notice %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% %%%%%%% direct predicates %%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% member(X,[X|Y]). member(X,[Y|Z]):- member(X,Z). same_priority([],[]). same_priority([X|Y],[1|Rest]):- same_priority(Y,Rest).