Implemented in every prolog implementation (but only tabled
prologs like XSB are immune to stupid infinite loops)
load input into kb
read a query q, call kb.query(q) to get response(s)
output them
sub kb.query(s):
if query matches data in KB, return match(es)
for each rule:
if rule output (consequent) could match part of query:
kb.query(rule.inputs)
for each result, prepare more matches we could return
A little harder to implement, mostly because you want to return
results from deep inside recursive calls, then continue on your way.
Python's new "yield" makes this easy. NILE used it's own stack
instead of the function-call stack.