!7 /* Event 1 happens before event 2 := vars {event 1, event 2, X, Y} Event 1 happens at day X. Event 2 happens at day Y. X < Y. */ sclass Obj { class Fact {} class StatementsWithVars { L statements; Set vars; *() {} *(Fact... statements) { statements = asList(statements); collectVars(); } void collectVars { vars = new Set; fOr (Fact f : statements) vars.addAll(print("Vars", findVars(statement))); } } L findVars(Fact statement) { Cl out = transitiveHullOfFunction nonStaticNonPrimitiveNonTransientFieldValues(statement); print(classNames(out)); ret instancesOf Var(out); } record $HappensBefore$(A event1, B event2) extends Fact {} record $HappensAtDay$(A event, B y) extends Fact {} record $LessThan$(A x, A y) extends Fact {} // Enrolling happens before graduation. // Enrolling happens at day 200. // Graduation happens at day 100. // Contradiction! L facts = ll( new $HappensBefore$("enrolling", "graduation"), new $HappensAtDay$("enrolling", 200), new $HappensAtDay$("graduation", 200) ); void rule1($HappensBefore$ in) { O event1 = in.event1, event2 = in.event2; Var X = new("X"), Y = new("Y"); emit(new StatementsWithVars( $HappensAtDay$(event1, X), $HappensAtDay$(event2, Y), $LessThan$(X, Y) )); } *() { pnlWithHeading("Facts", facts); } } p-exp { new Obj; }