Add a notation of cantions

This commit is contained in:
Emi Simpson 2023-03-05 20:54:48 -05:00
parent 1cf1acaa08
commit 8d3edb1ea8
Signed by: Emi
GPG key ID: A12F2C2FFDC3D847

35
ir.py
View file

@ -83,6 +83,14 @@ class IRProp:
return repr(self) return repr(self)
def __repr__(self) -> str: def __repr__(self) -> str:
return f'{self.name}({",".join(str(arg) for arg in self.arguments)})' return f'{self.name}({",".join(str(arg) for arg in self.arguments)})'
def __contains__(self, var: str) -> bool:
"""
Test if a variable with a given name exists in this term
>>> 'x1' in IRProp('friends', [IRProp('John'), IRProp('mother_of', [IRVar('x1')])])
True
"""
return any(var in term for term in self.arguments)
@dataclass(frozen=True) @dataclass(frozen=True)
class IRVar: class IRVar:
@ -111,6 +119,17 @@ class IRVar:
return repr(self) return repr(self)
def __repr__(self) -> str: def __repr__(self) -> str:
return f'*{self.name}' return f'*{self.name}'
def __contains__(self, var: str) -> bool:
"""
Test if a variable with a given name exists in this term
>>> 'x1' in IRVar('x1')
True
>>> 'x1' in IRVar('x2')
False
"""
return var == self.name
@dataclass(frozen=True) @dataclass(frozen=True)
class IRNeg: class IRNeg:
@ -137,6 +156,14 @@ class IRNeg:
return repr(self) return repr(self)
def __repr__(self) -> str: def __repr__(self) -> str:
return f'¬{self.inner}' return f'¬{self.inner}'
def __contains__(self, var: str) -> bool:
"""
Test if a variable with a given name exists in this term
>>> 'x1' in IRNeg(IRProp('round', [IRVar('x1')]))
True
"""
return var in self.inner
IRTerm: TypeAlias = IRVar | IRProp | IRNeg IRTerm: TypeAlias = IRVar | IRProp | IRNeg
Clause: TypeAlias = Sequence[IRTerm] Clause: TypeAlias = Sequence[IRTerm]
@ -175,11 +202,17 @@ def unify(t1: IRTerm, t2: IRTerm) -> Result[Substitutions, UnificationError]:
... IRProp('dating', [IRVar('x1'), IRProp('John')]) ... IRProp('dating', [IRVar('x1'), IRProp('John')])
... ) ... )
Err(UnificationMismatch(term1=Jade(), term2=John())) Err(UnificationMismatch(term1=Jade(), term2=John()))
>>> unify(
... IRProp('mother_of', [IRVar('x1')]),
... IRVar('x1')
... )
Err(UnificationMismatch(term1=mother_of(*x1), term2=*x1))
""" """
match (t1, t2): match (t1, t2):
case (IRVar(v1), IRVar(v2)) if v1 == v2: case (IRVar(v1), IRVar(v2)) if v1 == v2:
return Ok(tuple()) return Ok(tuple())
case (IRVar(v), t_other) | (t_other, IRVar(v)):#type:ignore #TODO if v not in t_other: case (IRVar(v), t_other) | (t_other, IRVar(v)) if v not in t_other: #type: ignore
return Ok((Subst(v, t_other),)) return Ok((Subst(v, t_other),))
case (IRProp(n1, a1), IRProp(n2, a2)) if n1 == n2 and len(a1) == len(a2): case (IRProp(n1, a1), IRProp(n2, a2)) if n1 == n2 and len(a1) == len(a2):
return unify_clauses(a1, a2) return unify_clauses(a1, a2)