I'm trying to create a relation with unify for example:
Boy(Mike) --> Mike is a boy
Girl(Lisa) --> Lisa is a girl
isSister(Mike,Lisa) --> Lisa is Mike's sister
and this is my code:
from fact import Fact
from logic import get, unify, var
from itertools import chain
import regex as re
facts = {}
pattern = r"(\w+)\((?:([^,\)]+)\,(?:([^,\)]+)))+\)\.?"
rule = input('Ingrese un hecho o consulta:')
while rule != '!':
match = re.match(pattern, rule)
print(match)
name = match.captures(1)[0]
argument1 = match.captures(2)
argument2 = match.captures(3)
if rule.endswith('.'):
if not name in facts:
facts[name] = Fact()
facts[name].append(argument1[0])
facts[name].append(argument2[0])
else:
X = var()
Y = var()
for _ in facts[name](X,Y): print(get(X),get(Y))
rule = input('Ingrese un hecho o consulta:')
What I want, is that when I ask for isSister(?,Lisa), it returns Mike. This is what I get:
Traceback (most recent call last): File "main.py", line 17, in name = match.captures(1)[0] AttributeError: 'NoneType' object has no attribute 'captures'
match
returnsNone
if there is no match, and this appears to happen somewhere in yourwhile
loop. You'll need to handle this case somehow, either by:or:
It's up to you to pick the handling that fits your solution, but these are the two patterns I generally go for. There are others I'm sure, but I would suggest starting here.