75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
"""
|
|
Data structures for expressions and goals
|
|
"""
|
|
from dataclasses import dataclass
|
|
from typing import Optional, Union
|
|
|
|
Expr = str
|
|
|
|
def parse_expr(payload: dict) -> Expr:
|
|
return payload["pp"]
|
|
|
|
@dataclass(frozen=True)
|
|
class Variable:
|
|
t: Expr
|
|
v: Optional[Expr] = None
|
|
name: Optional[str] = None
|
|
|
|
@staticmethod
|
|
def _parse(payload: dict) -> "Variable": # Replace 'Self' with 'Variable'
|
|
name = payload.get("userName")
|
|
t = parse_expr(payload["type"])
|
|
v = payload.get("value")
|
|
if v:
|
|
v = parse_expr(v)
|
|
return Variable(t, v, name)
|
|
|
|
def __str__(self):
|
|
result = self.name if self.name else "_"
|
|
result += f" : {self.t}"
|
|
if self.v:
|
|
result += f" := {self.v}"
|
|
return result
|
|
|
|
@dataclass(frozen=True)
|
|
class Goal:
|
|
variables: list[Variable]
|
|
target: Expr
|
|
name: Optional[str] = None
|
|
is_conversion: bool = False
|
|
|
|
@staticmethod
|
|
def sentence(target: Expr) -> "Goal": # Replace 'Self' with 'Goal'
|
|
return Goal(variables=[], target=target)
|
|
|
|
@staticmethod
|
|
def _parse(payload: dict) -> "Goal": # Replace 'Self' with 'Goal'
|
|
name = payload.get("userName")
|
|
variables = [Variable._parse(v) for v in payload["vars"]]
|
|
target = parse_expr(payload["target"])
|
|
is_conversion = payload["isConversion"]
|
|
return Goal(variables, target, name, is_conversion)
|
|
|
|
def __str__(self):
|
|
front = "|" if self.is_conversion else "⊢"
|
|
return "\n".join(str(v) for v in self.variables) + f"\n{front} {self.target}"
|
|
|
|
@dataclass(frozen=True)
|
|
class GoalState:
|
|
state_id: int
|
|
goals: list[Goal]
|
|
|
|
@property
|
|
def is_solved(self) -> bool:
|
|
return not self.goals
|
|
|
|
@dataclass(frozen=True)
|
|
class TacticNormal:
|
|
payload: str
|
|
|
|
@dataclass(frozen=True)
|
|
class TacticHave:
|
|
branch: str
|
|
|
|
Tactic = Union[TacticNormal, TacticHave]
|