Source code for tensor_theorem_prover.prover.ProofStep
from __future__ import annotations
from dataclasses import dataclass
from typing import Dict
from tensor_theorem_prover.types import Variable, Term
from tensor_theorem_prover.types.Term import term_from_rust
from tensor_theorem_prover.normalize import CNFDisjunction, CNFLiteral
from tensor_theorem_prover._rust import RsProofStep
SubstitutionsMap = Dict[Variable, Term]
def subsitutions_to_str(substitutions: SubstitutionsMap) -> str:
inner_str = ", ".join(f"{var} -> {term}" for var, term in substitutions.items())
return "{" + inner_str + "}"
[docs]@dataclass
class ProofStep:
"""A single step in a proof of a goal"""
source: CNFDisjunction
target: CNFDisjunction
source_unification_literal: CNFLiteral
target_unification_literal: CNFLiteral
source_substitutions: SubstitutionsMap
target_substitutions: SubstitutionsMap
resolvent: CNFDisjunction
similarity: float
# this refers to the overall similarity of this step and all of its parents
running_similarity: float
depth: int
def __str__(self) -> str:
output = f"Similarity: {self.similarity}\n"
output += f"Source: {self.source}\n"
output += f"Target: {self.target}\n"
output += f"Unify: {self.source_unification_literal.atom} = {self.target_unification_literal.atom}\n"
output += f"Subsitutions: {subsitutions_to_str(self.source_substitutions)}, {subsitutions_to_str(self.target_substitutions)}\n"
output += f"Resolvent: {self.resolvent}"
return output
[docs] @classmethod
def from_rust(cls, rust_proof_step: RsProofStep) -> ProofStep:
source_substitutions = {
Variable.from_rust(var): term_from_rust(term)
for var, term in rust_proof_step.source_substitutions.items()
}
target_substitutions = {
Variable.from_rust(var): term_from_rust(term)
for var, term in rust_proof_step.target_substitutions.items()
}
return ProofStep(
source=CNFDisjunction.from_rust(rust_proof_step.source),
target=CNFDisjunction.from_rust(rust_proof_step.target),
source_unification_literal=CNFLiteral.from_rust(
rust_proof_step.source_unification_literal
),
target_unification_literal=CNFLiteral.from_rust(
rust_proof_step.target_unification_literal
),
source_substitutions=source_substitutions,
target_substitutions=target_substitutions,
resolvent=CNFDisjunction.from_rust(rust_proof_step.resolvent),
similarity=rust_proof_step.similarity,
running_similarity=rust_proof_step.running_similarity,
depth=rust_proof_step.depth,
)