Add a notation of cantions
This commit is contained in:
parent
1cf1acaa08
commit
8d3edb1ea8
35
ir.py
35
ir.py
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue