new-lang/checker/props.py

86 lines
2.0 KiB
Python

"""
This module hosts propositions.
"""
from __future__ import annotations
from .terms import Term
from dataclasses import dataclass
class Prop:
"""
A proposition is a logical statement. It can be proven by the proof
checker, or it can be used as a hypothesis to prove another
proposition.
"""
def as_assumption(self, goal : Prop) -> list[list[tuple[list[Prop], Prop]]]:
"""
Propositions can simplify the proof by creating simpler theorems
and sub-lemmas to prove instead. If this proposition is part of
the assumptions, this function helps transform the goal into
simpler sub-goals.
:return: Tuples of added assumptions with a new goal.
:rtype: list[list[tuple[list[Prop], Prop]]]
"""
return []
def as_proof(self) -> list[list[tuple[list[Prop], Prop]]]:
"""
Determine which hypotheses are required in the context to prove
this proposition.
The function returns a list of various methods to prove the
proposition. If any of the methods is an empty list, it means
the proposition requires no assumptions and can instead be
computed.
:return: Methods to prove this proposition.
:rtype: list[tuple[list[Prop], Prop]]
"""
return []
@dataclass(frozen=True)
class And(Prop):
"""
The logical and-operator `P ^ Q`.
"""
P : Prop
Q : Prop
class Eq(Prop):
"""
Compare whether two terms are equal.
"""
x : Term
y : Term
def as_assumption(self, goal: Prop) -> list[list[tuple[list[Prop], Prop]]]:
return []
def as_proof(self) -> list[list[tuple[list[Prop], Prop]]]:
return super().as_proof()
@dataclass(frozen=True)
class Implies(Prop):
"""
The logical operator `P -> Q`.
"""
P : Prop
Q : Prop
@dataclass(frozen=True)
class Or(Prop):
"""
The logical and-operator `P v Q`.
"""
P : Prop
Q : Prop