forked from pythaiml/automindx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
nonmonotonic.py
63 lines (49 loc) · 1.93 KB
/
nonmonotonic.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Rule:
def __init__(self, conditions, conclusions):
if not isinstance(conditions, set) or not isinstance(conclusions, set):
raise ValueError("Conditions and conclusions must be sets.")
self.conditions = conditions
self.conclusions = conclusions
def applies(self, beliefs):
return self.conditions.issubset(beliefs)
class Default:
def __init__(self, conditions, conclusions):
if not isinstance(conditions, set) or not isinstance(conclusions, set):
raise ValueError("Conditions and conclusions must be sets.")
self.conditions = conditions
self.conclusions = conclusions
def applies(self, beliefs):
return self.conditions.isdisjoint(beliefs)
class DefaultLogic:
def __init__(self):
self.rules = []
self.defaults = []
def add_rule(self, rule):
if not isinstance(rule, Rule):
raise ValueError("Rule must be an instance of Rule.")
self.rules.append(rule)
def add_default(self, default):
if not isinstance(default, Default):
raise ValueError("Default must be an instance of Default.")
self.defaults.append(default)
def evaluate(self, query):
beliefs = set()
new_beliefs = set()
while True:
new_beliefs.clear()
for rule in self.rules:
if rule.applies(beliefs):
new_beliefs.update(rule.conclusions)
for default in self.defaults:
if default.applies(beliefs):
new_beliefs.update(default.conclusions)
if new_beliefs.issubset(beliefs):
break
beliefs.update(new_beliefs)
return query in beliefs
if __name__ == "__main__":
# Example usage
dl = DefaultLogic()
dl.add_rule(Rule({"A", "B"}, {"C"}))
dl.add_default(Default({"D"}, {"E"}))
print("Query 'C' concluded:", dl.evaluate("C"))