def search(clauses, env, depth): """Search for an application of rules to establish all the clauses, non-destructively extending the unifier env. Limit the search to the nested application of depth rules.""" if clauses is nil: yield env elif DEPTH_LIMIT is None or depth <= DEPTH_LIMIT: for fact in facts: fact = rename_variables(fact, get_unique_id()) env_head = Frame(env) if unify(fact.first, clauses.first, env_head): for env_rule in search(fact.second, env_head, depth + 1): for result in search(clauses.second, env_rule, depth + 1): yield result
from scheme import Frame from scheme_reader import Pair, nil, read_line from scheme_primitives import * from ucb import main, trace import scheme import scheme_reader facts = [] ############# # Inference # ############# glob = Frame(None) glob.stack = [] def do_query(clauses): """Yield all bindings that simultaneously satisfy clauses.""" for env in search(clauses, glob, 0): yield [(v, ground(v, env)) for v in get_vars(clauses)] DEPTH_LIMIT = 20 def search(clauses, env, depth): """Search for an application of rules to establish all the clauses, non-destructively extending the unifier env. Limit the search to
def do_query(clauses): """Yield all bindings that simultaneously satisfy clauses.""" for env in search(clauses, Frame(None), 0): yield [(v, ground(v, env)) for v in get_vars(clauses)]