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.