### Rules to create a 365-day calendar. ### This version adds the days of the week. ### This requires making each day a separate object ### rather than just an attribute of its month. max-elaborations 5000 sp {initialize*calendar (state ^superstate nil) --> ( ^year ) ( ^value 2003)} sp {initialize*months (state ^year ) --> ( ^month.name january) ( ^month.name february) ( ^month.name march) ( ^month.name april) ( ^month.name may) ( ^month.name june) ( ^month.name july) ( ^month.name august) ( ^month.name september) ( ^month.name october) ( ^month.name november) ( ^month.name december)} sp {initialize*31day*length (state ^year.month ) ( ^name << january march may july august october december >> ) --> ( ^days 31)} sp {initialize*30day*length (state ^year.month ) ( ^name << september april june november >> ) --> ( ^days 30)} sp {initialize*february*length (state ^year.month ) ( ^name february) --> ( ^days 28)} sp {initialize*first*days (state ^year.month ) --> ( ^day ) ( ^date 1)} sp {initialize*remaining*days (state ^year.month ) ( ^days ) ( ^day.date {
< } ) --> ( ^day ) ( ^date ( +
1 ))} sp {initialize*newyearsday (state ^year ) ( ^value 2003) ( ^month ) ( ^name january) ( ^day ) ( ^date 1) --> ( ^dayofweek wednesday)} sp {elaborate*daysofweek*onemonth (state ^year.month ) ( ^day ) ( ^day ) ( ^date
^dayofweek ) ( ^date { >
} ) - ( ^date { >
< } ) ( ^nextday ) ( ^day ^next ) --> ( ^dayofweek )} ### This version of the rule makes Soar go into an infinite loop, ### because it wraps around from december to january and keeps ### re-initializing the days of the week. #sp {elaborate*daysofweek*startnewmonth # (state ^year.month ) # ( ^name ) # (state ^year.month ) # ( ^name ) # ( ^nextmonth ) # ( ^month ^next ) # ( ^days ^day ) # ( ^date ^dayofweek ) # ( ^days ^day ) # ( ^date 1) # ( ^nextday ) # ( ^day ^next ) # --> # ( ^dayofweek )} ### This version of the rule works. sp {elaborate*daysofweek*startnewmonth (state ^year.month ) ( ^name ) (state ^year.month ) ( ^name { <> january } ) ( ^nextmonth ) ( ^month ^next ) ( ^days ^day ) ( ^date ^dayofweek ) ( ^days ^day ) ( ^date 1) ( ^nextday ) ( ^day ^next ) --> ( ^dayofweek )} sp {initialize*orderofdays (state ^superstate nil) --> ( ^nextday ) ( ^day monday ^next tuesday) ( ^nextday ) ( ^day tuesday ^next wednesday) ( ^nextday ) ( ^day wednesday ^next thursday) ( ^nextday ) ( ^day thursday ^next friday) ( ^nextday ) ( ^day friday ^next saturday) ( ^nextday ) ( ^day saturday ^next sunday) ( ^nextday ) ( ^day sunday ^next monday)} sp {initialize*orderofmonths (state ^superstate nil) --> ( ^nextmonth ) ( ^month january ^next february) ( ^nextmonth ) ( ^month february ^next march) ( ^nextmonth ) ( ^month march ^next april) ( ^nextmonth ) ( ^month april ^next may) ( ^nextmonth ) ( ^month may ^next june) ( ^nextmonth ) ( ^month june ^next july) ( ^nextmonth ) ( ^month july ^next august) ( ^nextmonth ) ( ^month august ^next september) ( ^nextmonth ) ( ^month september ^next october) ( ^nextmonth ) ( ^month october ^next november) ( ^nextmonth ) ( ^month november ^next december) ( ^nextmonth ) ( ^month december ^next january)}