def backward_chaining(kb, query): all_variables = find_variables_symbol(query) query, var_map = standardize_variables(query) result = __backward_chaining_or(kb, query, {}) if result is not problem.FAILURE: propagate_substitutions(result) query_vars = {var: result[var_map[var]] for var in all_variables} return query_vars return result
def __resolution_step(new_inferrences, already_resolved, clauses, max_clause_len, clause_mapping, empty_set=frozenset()): new_inferrences.clear() pairs = ((clauses[i], clauses[j]) for i in range(len(clauses)) for j in range(i + 1, len(clauses)) if (clauses[i], clauses[j]) not in already_resolved) for c1, c2 in pairs: resolvents = __resolve(c1, c2, max_clause_len, clause_mapping) if empty_set in resolvents: bindings = clause_mapping.container[empty_set][0] bindings = propagate_substitutions(bindings) return True, bindings new_inferrences.update(resolvents) already_resolved.add((c1, c2)) if new_inferrences.issubset(clauses): return False, {} clauses.extend(clause for clause in new_inferrences if not is_subsumed_in(clause, clauses)) return None