Basic idea: Connect Java and NL. Example problem: Compare two numbers. We need a MICROTHEORY and a PROGRAM. MICROTHEORY: Two numbers A and B can be compared using "bigint(A).compareTo(bigint(B))". For this microtheory, there will also exist a program that parses and "runs" it. PROGRAM (PSEUDO-CODE): // prepare matchRule("Two numbers $1 and $2 can be compared using $3."); S a, b, code = $1, $2, $3; // answer if (matchInput("Is $1 bigger than $2?")) { int x = evalWith(code, a, $1, b, $2); ret x > 0 ? "yes" : "no"; } And that's it for this example.