abstract Person ada : Person cyd : Person eve : Person bob : Person dan : Person abstract Exam date: string [this != ""] recorder -> Person examiner -> Person examinee -> Person ada_bob_cyd:Exam [date = "20001023" recorder = cyd examiner = bob examinee = ada] dan_bob_ada:Exam [date = "20040817" recorder = ada examiner = bob examinee = dan] eve_ada_dan:Exam [date = "20080331" recorder = dan examiner = ada examinee = eve] examineeAda -> Exam * [this.examinee = ada] [all e:Exam|e.examinee = ada => e in examineeAda] recorderAda -> Exam * [this.recorder = ada] [all e:Exam|e.recorder = ada => e in recorderAda] examinerAda -> Exam * [this.examiner = ada] [all e:Exam|e.examiner = ada => e in examinerAda] examineeOfAdaAsExaminer -> Person * [one e:Exam|e.examiner = ada && e.examinee = this] [all e:Exam|e.examiner = ada => e.examinee in examineeOfAdaAsExaminer] examineeOfAdaAsRecorder -> Person * [one e:Exam|e.recorder = ada && e.examinee = this] [all e:Exam|e.recorder = ada => e.examinee in examineeOfAdaAsRecorder] examinerOfAdaAsExaminee -> Person * [one e:Exam|e.examinee = ada && e.examiner = this] [all e:Exam|e.examinee = ada => e.examiner in examinerOfAdaAsExaminee] examinerOfAdaAsRecorder -> Person * [one e:Exam|e.recorder = ada && e.examiner = this] [all e:Exam|e.recorder = ada => e.examiner in examinerOfAdaAsRecorder] recorderOfAdaAsExaminee -> Person * [one e:Exam|e.examinee = ada && e.recorder = this] [all e:Exam|e.examinee = ada => e.recorder in recorderOfAdaAsExaminee] recorderOfAdaAsExaminer -> Person * [one e:Exam|e.examiner = ada && e.recorder = this] [all e:Exam|e.examiner = ada => e.recorder in recorderOfAdaAsExaminer]