!7 replace SimpleStatements with MatchableRecords. replace Env with SimpleStatements. abstract sclass Prop implements IFieldsToList {} static withToList record Did$HappenBefore$(A event1, B event2) {} static withToList record WhenDid$Happen(O event) extends Prop {} static withToList record $HappensAtSecond$(A event, B y) extends Prop {} static O answer(Env env, O p) { if p is WhenDid$Happen(O event) ret env.fulfillVariable(var -> $HappensAtSecond$(event, var)); if p is Did$HappenBefore$(O event1, O event2) once { Int time1 = opt cast answer(env, WhenDid$Happen(event1)); if (time1 == null) break; Int time2 = opt cast answer(env, WhenDid$Happen(event2)); if (time2 == null) break; ret time1 < time2; } null; } p-exp { SimpleStatements env = new( $HappensAtSecond$("stuff", 10), $HappensAtSecond$("more stuff", 20)); assertEqualsVerbose(true, answer(env, print(Did$HappenBefore$("stuff", "more stuff")))); assertEqualsVerbose(false, answer(env, print(Did$HappenBefore$("more stuff", "stuff")))); assertEqualsVerbose(null, answer(env, print(Did$HappenBefore$("stuff", "any other stuff")))); }