interface Course {
extent courses;
keys name,number;
attribute string name;
attribute string number;
relationship List<Section> has_sections
inverse Section::is_section_of
{order_by Section::number};
relationship Set<Course> has_prerequisites
inverse Course::is_prerequisite_for;
relationship Set<Course> is_prerequisite_for
inverse Course::has_prerequisites;
offer(in Semester) raises(already_offered);
drop(in Semester) raises(not_offered);
}
interface Section {
extent sections;
keys is_section_of, number;
attribute string number;
relationship Professor is_taught_by inverse Professor::teaches;
relationship TA has_TA inverse TA::assists;
relationship Course is_section_of inverse Course::has_sections;
relationship Set<Student> is_taken_by inverse Student::takes;
}
interface Employee {
extent employees;
keys name, id;
attribute string name;
attribute int id;
attribute int annual_salary;
hire(in Person);
fire(in Employee) raises(no_such_employee);
}
interface Professor:Employee {
extent professors;
attribute string rank;
relationship Set<Section> teaches inverse Section::is_taught_by;
grant_tenure() raises (ineligible_for_tenure);
}
interface TA:Employee, Student{
relationship Section assists inverse Section::has_TA;
}
interface Student{
extent students;
keys name,student_id;
attribute string name;
attribute string student_id;
attribute string dorm_address;
relationship Set<Section> takes inverse Section::is_taken_by;
register_for_course(in Course, in Section)
raises (unsatisfied_prerequisites, section_full, course_full);
drop_course(in Course) raises(not_registered_for_that_course);
assign_mayor(in Department);
transfer(in from:Section, in to:Section)
raises (section_full, not_registered_for_section);
}