Создание отношений с унифицированным и регулярным выражением

Я пытаюсь создать отношение с помощью унификации, например:

Мальчик (Майк) -> Майк мальчик

Девушка (Лиза) -> Лиза это девушка

isSister(Майк, Лиза) -> Лиза - сестра Майка

и это мой код:

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:')

Что я хочу, так это то, что когда я спрашиваю isSister(?,Lisa), он возвращает Майка. Вот что я получаю:

Traceback (последний вызов был последним): файл "main.py", строка 17, в name = match.captures(1)[0] AttributeError: у объекта 'NoneType' нет атрибута 'captures'

1 ответ

match возвращается None если нет совпадения, и это, кажется, происходит где-то в вашем while петля. Вам нужно как-то разобраться с этим делом, либо:

if match == None:
    # handle

или же:

try:
   name=match.captures(1)[0]
except AttributeError as e:
    # handle

Вы сами выбираете подход, который подходит для вашего решения, но это две модели, которые я обычно использую. Я уверен, что есть и другие, но я бы предложил начать здесь.

Другие вопросы по тегам