Skip to content

Commit 98a810e

Browse files
committed
forward chaining first implementaion
1 parent 7282ab9 commit 98a810e

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import re
2+
3+
4+
def find_symbols_in_kb(knowledge_base: list[str]) -> dict:
5+
'''
6+
'''
7+
inferred = {}
8+
9+
for i in range(len(knowledge_base)):
10+
symbols = re.findall(r'[a-zA-Z]', knowledge_base[i])
11+
for symbol in symbols:
12+
if symbol not in inferred:
13+
inferred[symbol] = False
14+
15+
return inferred
16+
17+
18+
def number_of_symbols_in_premise(knowledge_base: list[str]) -> dict:
19+
20+
'''
21+
'''
22+
23+
count = {}
24+
for clause in knowledge_base:
25+
if(len(clause) != 1):
26+
index = clause.find("=>")
27+
premise = clause[:index]
28+
letters = ''.join(e for e in premise if e.isalpha())
29+
count[premise] = len(letters)
30+
31+
return count
32+
33+
34+
def get_known_facts(knowledge_base: list[str]) -> list[str]:
35+
36+
'''
37+
'''
38+
facts = []
39+
for clause in knowledge_base:
40+
if len(clause) == 1:
41+
facts.append(clause)
42+
43+
return facts
44+
45+
46+
47+
48+
def forward_chianing(knowledge_base: list[str], query:str) -> bool:
49+
50+
count = number_of_symbols_in_premise(knowledge_base)
51+
inferred = find_symbols_in_kb(knowledge_base)
52+
queue = get_known_facts(knowledge_base)
53+
54+
while(len(queue) > 0):
55+
p = queue.pop()
56+
if p == query: return True
57+
if inferred[p] == False:
58+
inferred[p] = True
59+
for clause in knowledge_base:
60+
index = clause.find("=>")
61+
premise = clause[:index]
62+
if p in premise:
63+
count[premise] -= 1
64+
if count[premise] == 0:
65+
queue.append(clause[-1])
66+
67+
return False
68+
69+
70+
71+
if __name__ == "__main__":
72+
73+
kb = ["p => q", "q => r", "r => p", "s => t", "u => v", "v => w", "w => u", "a", "b", "c" , "w" , "u&q=>r", "q"]
74+
75+
result = forward_chianing(kb, "t")
76+
print(result)

0 commit comments

Comments
 (0)