!7 abstract sclass Prop implements IStatement, IFieldsToList {} static withToList record $HappensBefore$<A, B>(A event1, B event2) extends Prop {} static withToList record $HappensAtDay$<A, B>(A event, B y) extends Prop {} static withToList record $LessThan$<A, B>(A x, A y) extends Prop {} static withToList record $BiggerThanOrEqualTo$<A, B>(A x, A y) extends Prop {} // full define $LessThan(int x, int y) = x < y; static Bool checkProposition(Prop p) { if p is $LessThan$(int x, int y) { ret x < y; } if p is $BiggerThanOrEqualTo$(int x, int y) { ret not(checkProposition($LessThan$(x, y))); } null; } p-exp { assertEqualsVerbose(true, checkProposition($LessThan$(1, 5))); assertEqualsVerbose(false, checkProposition($LessThan$(5, 1))); assertEqualsVerbose(null, checkProposition($LessThan$("what", "ever"))); assertEqualsVerbose(false, checkProposition($BiggerThanOrEqualTo$(1, 5))); assertEqualsVerbose(true, checkProposition($BiggerThanOrEqualTo$(5, 1))); assertEqualsVerbose(null, checkProposition($BiggerThanOrEqualTo$("what", "ever"))); }