Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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