From 8e68b951c72d6dfd8d0bb1da83176a9f87b0db99 Mon Sep 17 00:00:00 2001 From: Maxim Tarasov Date: Thu, 28 Mar 2024 18:49:22 -0700 Subject: [PATCH] fix issue with incorrect rules added to strong_rules; keep subset for each theorem to speed up structural inference --- pynars/NARS/InferenceEngine/KanrenEngine/KanrenEngine.py | 9 +++++---- pynars/NARS/InferenceEngine/KanrenEngine/util.py | 8 +++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/pynars/NARS/InferenceEngine/KanrenEngine/KanrenEngine.py b/pynars/NARS/InferenceEngine/KanrenEngine/KanrenEngine.py index 3ca82b2..b3056c5 100644 --- a/pynars/NARS/InferenceEngine/KanrenEngine/KanrenEngine.py +++ b/pynars/NARS/InferenceEngine/KanrenEngine/KanrenEngine.py @@ -33,12 +33,12 @@ def __init__(self): higher_order.append(rule) # save subset for backward inference - self.rules_backward = [convert(r) for r in nal1_rules + nal2_rules + self.rules_backward = [convert(r, True) for r in nal1_rules + nal2_rules + higher_order # + conditional_syllogistic ] - self.rules_conditional_syllogistic = [convert(r) for r in conditional_syllogistic] + self.rules_conditional_syllogistic = [convert(r, True) for r in conditional_syllogistic] for rule in nal3_rules: # replace --> with ==> and <-> with <=> in NAL3 (except difference) @@ -251,8 +251,9 @@ def inference_structural(self, t: Sentence, theorems = None): theorems = self.theorems l1 = logic(t.term, structural=True) - for (l2, sub_terms) in theorems: - for rule in rules_strong: + for (l2, sub_terms, matching_rules) in theorems: + for i in matching_rules: + rule = rules_strong[i] res = self.apply(rule, l2, l1) if res is not None: # ensure no theorem terms in conclusion diff --git a/pynars/NARS/InferenceEngine/KanrenEngine/util.py b/pynars/NARS/InferenceEngine/KanrenEngine/util.py index 57cf38a..4ecb1a9 100644 --- a/pynars/NARS/InferenceEngine/KanrenEngine/util.py +++ b/pynars/NARS/InferenceEngine/KanrenEngine/util.py @@ -125,8 +125,14 @@ def convert_theorems(theorem): # print(l) # print(term(l)) # print("\n\n") + matching_rules = [] + for i, rule in enumerate(rules_strong): + (p1, p2, c) = rule[0] + if run(1, c, eq(p1, l)): + matching_rules.append(i) + sub_terms = frozenset(filter(lambda x: x != place_holder, t.sub_terms)) - return (l, sub_terms) + return (l, sub_terms, tuple(matching_rules)) #################