def ParseRule(rule_str): rule_str = rule_str.strip().rstrip('.').replace(' ', '') index = rule_str.find(':-') conclusion = Fact.ParseFact(rule_str[:index]) premises = [] premises_str = rule_str[index + 2:].split('),') if 'not' in premises_str[len(premises_str) - 1]: premises_str.remove(premises_str[len(premises_str) - 1]) for idx, premise_str in enumerate(premises_str): if idx != len(premises_str) - 1: premise_str += ')' premise = Fact.ParseFact(premise_str) premises.append(premise) return Rule(conclusion, premises)
def CreateKB(kb, clauses): while clauses: clause, clauses = Clause.NextClause(clauses) clause_type = Clause.Categorize(clause) if clause_type == 'fact': fact = Fact.ParseFact(clause) kb.AddFact(fact) elif clause_type == 'rule': if ';' in clause: idx = clause.index(':-') temp_clause = clause[idx + 2:].rstrip('.') conclusion = clause[0:idx] conditions_raw = temp_clause.split(';') conditions = [] for condition in conditions_raw: temp = condition.strip() temp = temp[1:len(temp) - 1] conditions.append(temp) rules = [] for condition in conditions: rule_str = conclusion + ':-' + condition + '.' rules.append(rule_str) for clause in rules: rule = Rule.ParseRule(clause) kb.AddRule(rule) elif ';' not in clause: rule = Rule.ParseRule(clause) kb.AddRule(rule)
from kb import KB from fact import Fact import sys kb = KB() kb_file = sys.argv[1] query_file = sys.argv[2] answer_file = sys.argv[3] kb_file = open(kb_file, 'r') clauses = kb_file.readlines() KB.CreateKB(kb, clauses) query_file = open(query_file, 'r') answer_file = open(answer_file, 'w') count_query = 1 for query in query_file.readlines(): alpha = Fact.ParseFact(query) alpha_str = str(alpha) + '.' print(str(count_query) + "/", alpha_str) substs = set(kb.Query(alpha)) substs_str = ' ;\n'.join([str(subst) for subst in substs]) + '.\n' print(substs_str) answer_file.write(alpha_str + '\n') answer_file.write(substs_str + '\n') count_query += 1