Not logged in. Login

Assignment 4 Solutions

Course Offerings

Helper routines make it possible to set up the standard scheduling patterns.

schedule(mwf(N), Campus, [slot(mon, N, Campus), slot(wed, N, Campus), slot(fri, N, Campus)]).
schedule(t2r(N), Campus, [slot(tue, N, Campus), slot(tue, N1, Campus), slot(thu, N, Campus)]) :- N1 is N+1.
schedule(tr2(N), Campus, [slot(tue, N, Campus), slot(thu, N, Campus), slot(thu, N1, Campus)]) :- N1 is N-1.
schedule(eve(D), Campus, [slot(D, 17, Campus), slot(D, 18, Campus), slot(D, 19, Campus)]).

Here a few offerings. More are given at the end.

offering(cmpt300, 1161, e100, eve(mon), bby).
offering(cmpt307, 1161, d100, t2r(14), bby).
offering(cmpt320, 1161, e100, eve(thu), bby).
offering(cmpt354, 1161, d100, mwf(13), bby).
offering(cmpt361, 1161, d100, tr2(13), bby).

Using this information, we can determine schedule compatibility.

% Schedules are compatible if there are no conflicting time slots.
compatible_schedules([], _).
compatible_schedules(_, []).
compatible_schedules([Slot1 | M1], [Slot2 | M2]) :-
   conflict_free_slots(Slot1, Slot2), compatible_schedules([Slot1|M1], M2), compatible_schedules(M1, [Slot2|M2]), !.

% Slots are conflict-free if they are on different days, are on the same campus 
% but at different times, or they allow at least an hour travel time.
conflict_free_slots(slot(Day1, _, _), slot(Day2, _, _)) :- Day1 \== Day2.
conflict_free_slots(slot(Day, Hour1, Campus), slot(Day, Hour2, Campus)) :- Hour1 =\= Hour2.
conflict_free_slots(slot(Day, Hour1, _), slot(Day, Hour2, _)) :- TimeDiff is abs(Hour1-Hour2), TimeDiff > 1.

feasible_semester_schedule(_, [], []).

feasible_semester_schedule(Sem, [Course|More], Schedule) :-
  feasible_semester_schedule(Sem, More, Subschedule),
  offering(Course, Sem, Section, SchedPattern, Campus),
  schedule(SchedPattern, Campus, CourseSched),
  compatible_schedules(CourseSched, Subschedule),
  append(CourseSched, Subschedule, Schedule).

Prerequisites

Each course has a list of 300-level prerequisites. Here are some examples; more at the end.

prerequisites(cmpt365, []).
prerequisites(cmpt370, [cmpt354]).
prerequisites(cmpt405, [cmpt307]).
prerequisites(cmpt407, [cmpt307]).
prerequisites(cmpt431, [cmpt300, cmpt371]).

Determining prerequisite satisfication uses the built-in subset predicate.

% prerequisites_satisfied(Crses, Taken) is true, if all the
% prerequisites for Crses are satisfied by the Taken set of
% courses.
prerequisites_satisfied([], _).
prerequisites_satisfied([C|Cs], Taken) :-
   prerequisites(C, Prereqlist),
   subset(Prereqlist, Taken),
   prerequisites_satisfied(Cs, Taken).

Semester Plans

Check that a plan is feasible both for prerequisites (given taken courses) and from a scheduling point of view.

feasible_semester_plan(_, [], _).

feasible_semester_plan(Sem, Crses, Taken) :-
   feasible_semester_schedule(Sem, Crses, _),
   is_ordered(Crses),
   is_set(Crses),
   prerequisites_satisfied(Crses, Taken).

is_ordered([]).
is_ordered([_]).
is_ordered([C1, C2|Cs]) :- C1 @< C2, is_ordered([C2|Cs]).

Graduation Plans

Put together a list of taken courses and a set of semester plans as a graduation plan. Check all major requirements.

graduation_plan(Taken, []) :-
   meets_cmpt_major_requirements(Taken).

graduation_plan(Taken, [semester_plan(Sem, Crses)|More]) :-
   feasible_semester_plan(Sem, Crses, Taken),
   append(Crses, Taken, TakenAfterSem),
   graduation_plan(TakenAfterSem, More).

meets_cmpt_major_requirements(Taken) :-
   member(cmpt300, Taken),
   member(cmpt307, Taken),
   member(cmpt320, Taken),
   member(macm316, Taken),
   breadth_areas(A1, A2, A3),
   area_covered(A1, Taken),
   area_covered(A2, Taken),
   area_covered(A3, Taken),
   cmpt400courses(Taken, DepthCourses),
   length(DepthCourses, D),
   D >= 3,
   is_set(Taken),
   length(Taken, N),
   N >= 13.

area_covered(A, Taken) :-
   cmpt_concentration(A, Crses),
   has_one(Taken, Crses).

has_one([H|_], L) :- member(H, L), !.
has_one([_|T], L) :- has_one(T, L).


breadth_areas(A1, A2, A3) :- 
   append(_, [A1|L1], [ai, cgmm, infosys, pl]),
   append(_, [A2|L2], L1),
   append(_, [A3|_], L2).

cmpt_concentration(ai, [cmpt310, cmpt340, cmpt411, cmpt412, cmpt413, cmpt414, cmpt417, cmpt418, cmpt419]).
cmpt_concentration(sys-required, [cmpt300]).
cmpt_concentration(cgmm, [cmpt361, cmpt363, cmpt365, cmpt461, cmpt464, cmpt466, cmpt467, cmpt468, cmpt469]).
cmpt_concentration(infosys, [cmpt301, cmpt354, cmpt370, cmpt441, cmpt454, cmpt459, cmpt470, cmpt474]).
cmpt_concentration(pl, [cmpt373, cmpt375, cmpt383, cmpt384, cmpt473, cmpt475, cmpt477, cmpt489]).
cmpt_concentration(theory-required, [cmpt307]).

cmpt400level(Crse) :- atom_concat('cmpt4', _, Crse).
cmpt400courses([], []).
cmpt400courses([Crse|Cs], [Crse|Ds]) :- atom_concat('cmpt4', _, Crse), !, cmpt400courses(Cs, Ds).
cmpt400courses([_|Cs], Ds) :- cmpt400courses(Cs, Ds).

More Offerings Data

offering(cmpt365, 1161, d100, mwf(14), bby).
offering(cmpt376, 1161, d100, mwf(11), bby).
offering(cmpt405, 1161, d100, mwf(10), bby).
offering(cmpt412, 1161, d100, mwf(13), bby).
offering(cmpt454, 1161, d100, tr2(10), bby).
offering(cmpt464, 1161, d100, t2r(14), bby).
offering(cmpt471, 1161, d100, mwf(9), bby).
offering(cmpt475, 1161, e100, eve(wed), bby).
offering(cmpt479, 1161, d100, t2r(11), bby).
offering(cmpt371, 1161, d100, t2r(14), sur).
offering(cmpt379, 1161, d100, mwf(13), sur).
offering(cmpt383, 1161, d100, mwf(12), sur).
offering(cmpt473, 1161, d100, mwf(14), sur).
offering(cmpt489, 1161, d100, tr2(16), sur).
offering(cmpt371, 1161, e100, eve(wed), vcr).
offering(cmpt470, 1161, e100, eve(thu), vcr).

offering(cmpt300, 1164, d100, mwf(13), bby).
offering(cmpt307, 1164, d100, mwf(14), bby).
offering(cmpt310, 1164, d100, tr2(10), bby).
offering(cmpt354, 1164, d100, t2r(14), bby).
offering(cmpt371, 1164, d100, t2r(14), bby).
offering(cmpt376, 1164, d100, mwf(10), bby).
offering(cmpt379, 1164, d100, t2r(11), bby).
offering(cmpt405, 1164, d100, mwf(15), bby).
offering(cmpt419, 1164, d100, tr2(13), bby).
offering(cmpt454, 1164, d100, mwf(12), bby).
offering(cmpt471, 1164, e100, eve(thu), bby).
offering(cmpt471, 1164, d100, t2r(14), bby).
offering(cmpt475, 1164, e100, eve(thu), vcr).


offering(cmpt300, 1167, d100, mwf(15), bby).
offering(cmpt307, 1167, d100, t2r(14), bby).
offering(cmpt310, 1167, d100, mwf(12), bby).
offering(cmpt320, 1167, e100, eve(wed), bby).
offering(cmpt354, 1167, d100, mwf(11), bby).
offering(cmpt361, 1167, e100, eve(tue), bby).
offering(cmpt371, 1167, d100, mwf(11), bby).
offering(cmpt376, 1167, d100, mwf(10), bby).
offering(cmpt379, 1167, d100, mwf(15), bby).
offering(cmpt405, 1167, d100, mwf(12), bby).
offering(cmpt411, 1167, d100, mwf(14), bby).
offering(cmpt417, 1167, d100, mwf(15), bby).
offering(cmpt419, 1167, d100, mwf(10), bby).
offering(cmpt431, 1167, d100, tr2(10), bby).
offering(cmpt441, 1167, d100, tr2(13), bby).
offering(cmpt454, 1167, d100, t2r(14), bby).
offering(cmpt459, 1167, d100, t2r(11), bby).
offering(cmpt470, 1167, e100, eve(mon), bby).
offering(cmpt471, 1167, d100, mwf(13), bby).
offering(cmpt477, 1167, d100, t2r(11), bby).
offering(cmpt307, 1167, d200, mwf(11), sur).
offering(cmpt354, 1167, d100, mwf(9), sur).
offering(cmpt373, 1167, d100, mwf(12), sur).
offering(cmpt383, 1167, d100, t2r(8), sur).
offering(cmpt433, 1167, d100, mwf(10), sur).
offering(cmpt473, 1167, d100, tr2(16), sur).
offering(cmpt363, 1167, e100, eve(mon), vcr).
offering(cmpt475, 1167, e100, eve(wed), vcr).
offering(macm316, 1167, d100, mwf(13), bby).

More Prerequisite Data

prerequisites(cmpt300, []).
prerequisites(cmpt301, []).
prerequisites(cmpt305, []).
prerequisites(cmpt307, []).
prerequisites(cmpt308, []).
prerequisites(cmpt310, []).
prerequisites(cmpt320, []).
prerequisites(cmpt340, []).
prerequisites(cmpt354, []).
prerequisites(cmpt361, []).
prerequisites(cmpt363, []).
prerequisites(cmpt371, []).
prerequisites(cmpt376, []).
prerequisites(cmpt379, []).
prerequisites(cmpt383, []).
prerequisites(cmpt384, []).
prerequisites(cmpt404, []).
prerequisites(cmpt408, [cmpt307]).
prerequisites(cmpt409, [cmpt307]).
prerequisites(cmpt411, []).
prerequisites(cmpt412, []).
prerequisites(cmpt413, []).
prerequisites(cmpt414, []).
prerequisites(cmpt417, []).
prerequisites(cmpt433, [cmpt300]).
prerequisites(cmpt441, [cmpt307]).
prerequisites(cmpt454, [cmpt300, cmpt354]).
prerequisites(cmpt456, [cmpt354]).
prerequisites(cmpt459, [cmpt354]).
prerequisites(cmpt461, [cmpt361, macm316]).
prerequisites(cmpt464, [cmpt361, macm316]).
prerequisites(cmpt466, [cmpt361, macm316]).
prerequisites(cmpt467, [cmpt361, macm316]).
prerequisites(cmpt469, [cmpt361]).
prerequisites(cmpt470, [cmpt354]).
prerequisites(cmpt471, [cmpt300, cmpt371]).
prerequisites(cmpt473, [cmpt373]).
prerequisites(cmpt474, [cmpt371]).
prerequisites(cmpt475, []).
prerequisites(cmpt479, [cmpt431]).
prerequisites(cmpt489, [cmpt383]).
prerequisites(macm316, []).
Updated Sun Nov. 29 2015, 15:18 by cameron.