Source code for agent_logic.proofs.unification
from typing import Dict, Optional
from agent_logic.core.functions import Relation
[docs]
class Unification:
"""Handles unification for first-order logic terms."""
[docs]
@staticmethod
def unify(term1: Relation, term2: Relation) -> Optional[Dict[str, str]]:
"""
Unifies two predicates by finding a substitution θ such that term1(θ) = term2(θ).
Example:
P(x) and P(f(y)) → {x → f(y)}
"""
if term1.name != term2.name or len(term1.parameters) != len(term2.parameters):
return None # Cannot unify if predicate names or arity differ
substitution = {}
for p1, p2 in zip(term1.parameters, term2.parameters, strict=False):
if p1 == p2:
continue # Already matching
elif p1.islower() and p2.isupper(): # Variable → Constant
substitution[p1] = p2
elif p1.isupper() and p2.islower(): # Constant → Variable
substitution[p2] = p1
else:
return None # Cannot unify
return substitution