!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 cached L> propClasses() { ret myNonAbstractClassesImplementing(Prop); } static cached LPair, S> classesAndPatterns() { ret map(propClasses(), c -> pair(dollarsToStarsAndSplitCamelCase(shortClassName(c)), c)); } static O parseArg(S s) { ret isInteger(s) ? parseInt(s) : s; } static Prop parseProp(S s) { new Matches m; for (Pair c, S> p : classesAndPatterns()) { if (match(p.b, s, m)) ret nuObject(p.a, map parseArg(m)); } null; } p-exp { for (S s : tlft([[ Did X happen before Y? when did Z happen ]])) print(s + " => " + parseProp(s)); }