From 0bcd25c693a3e80db7c204bd7421ef7cff6eb586 Mon Sep 17 00:00:00 2001 From: bog Date: Wed, 1 May 2024 22:35:03 +0200 Subject: [PATCH] :zap: update only look at previous facts iteration. --- fol/kb.py | 29 +++++++++++++++++++++++++---- sine_patre.py | 1 + 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/fol/kb.py b/fol/kb.py index 785daf9..98acd44 100644 --- a/fol/kb.py +++ b/fol/kb.py @@ -4,6 +4,10 @@ import fol class Kb: def __init__(self): self.base = [] + + self.prev = [] + self.current = [] + self.indexes = {} self.counter = fol.cnf.Counter() @@ -107,18 +111,22 @@ class Kb: self.indexes[p.value] = [req] self.check_request(req) self.base.append(req) + self.current.append(req) def tell(self, request): req = self.make_f(request) self.add_req(req) - def ask(self, request): + def generate(self): while True: - n = len(self.base) self.update() - if n == len(self.base): + self.prev = [c for c in self.current] + self.current = [] + if len(self.prev) == 0: break + def ask(self, request): + self.generate() req = self.make_req(request) results = [] @@ -150,7 +158,12 @@ class Kb: facts = [f[0] for f in facts] - self.solve(rule, self.conds(rule), facts, solution, solutions) + rules = self.conds(rule) + + if not self.is_rule_needed(rules, self.prev): + continue + + self.solve(rule, rules, facts, solution, solutions) for sol in solutions: concl = conclusion.subst(sol) @@ -158,6 +171,14 @@ class Kb: self.add_req([concl]) return + def is_rule_needed(self, rule, prev): + for f in prev: + for r in rule: + s = fol.unify(r, f[0]) + if s is not None: + return True + return False + def merge_substs(self, substs): res = {} for s in substs: diff --git a/sine_patre.py b/sine_patre.py index d76f271..e6940d5 100644 --- a/sine_patre.py +++ b/sine_patre.py @@ -14,6 +14,7 @@ if __name__ == '__main__': answer = kb.ask('Est(ALICE, x, y)') print(answer) + # [print(k) for k in kb.base] if False: print(f'{len(kb.base)}----------------')