예제 #1
0
 def test___init__(self):
     NamedOpetope.Typing(NamedOpetope.Term(NamedOpetope.Variable("a", 0)),
                         NamedOpetope.Type([NamedOpetope.Term()]))
     NamedOpetope.Typing(
         NamedOpetope.Term(NamedOpetope.Variable("f", 1)),
         NamedOpetope.Type([
             NamedOpetope.Term(NamedOpetope.Variable("a", 0)),
             NamedOpetope.Term()
         ]))
     with self.assertRaises(DerivationError):
         NamedOpetope.Typing(
             NamedOpetope.Term(NamedOpetope.Variable("a", 1)),
             NamedOpetope.Type([NamedOpetope.Term()]))
     with self.assertRaises(DerivationError):
         NamedOpetope.Typing(
             NamedOpetope.Term(NamedOpetope.Variable("f", 2)),
             NamedOpetope.Type([
                 NamedOpetope.Term(NamedOpetope.Variable("a", 0)),
                 NamedOpetope.Term()
             ]))
     with self.assertRaises(DerivationError):
         NamedOpetope.Typing(
             NamedOpetope.Term(NamedOpetope.Variable("f", 0)),
             NamedOpetope.Type([
                 NamedOpetope.Term(NamedOpetope.Variable("a", 0)),
                 NamedOpetope.Term()
             ]))
예제 #2
0
def repres(seq: NamedOpetope.Sequent) -> NamedOpetope.OCMT:
    """
    The :math:`\\textbf{OptSet${}^!$}` :math:`\\texttt{repr}` rule.
    """
    if not seq.typing.term.isVariable():
        raise DerivationError(
            "repr rule",
            "Opt! sequent expected to type a variable, typing {term}",
            term=repr(seq.typing.term))
    res = NamedOpetope.OCMT(deepcopy(seq.theory), deepcopy(seq.context))
    # new context
    for typing in seq.context:
        v = typing.term.variable
        if v is None:
            raise RuntimeError("[repres rule] The premiss context types an "
                               "invalid / null term. In valid proof trees, "
                               "this should not happen")
        for i in range(1, v.dimension + 1):
            res.context += NamedOpetope.Typing(
                NamedOpetope.Term(res.target(v, i)),
                NamedOpetope.Type(typing.type.terms[i:]))
    # new theory
    for tup in seq.context.graftTuples():
        b, a = tup
        res.theory += (res.target(a), b)
    for a in res.context.variables():
        if a.dimension >= 2 and not res.source(a).degenerate:
            s = res.source(a).variable
            if s is None:
                raise RuntimeError(
                    "[repres rule] The premiss context types "
                    "the variable {a} of dimension {dim}, "
                    "whose first source is invalid / null. In "
                    "valid proof trees, this should not happen".format(
                        a=str(a), dim=a.dimension))
            res.theory += (res.target(a, 2), res.target(s))
    for a in seq.context.variables():
        for k in range(0, a.dimension - 1):
            if res.source(res.target(a, k)).degenerate:
                c = res.source(res.target(a, k)).variable
                if c is None:
                    raise RuntimeError("[repres rule] The premiss context "
                                       "types the variable {var} of dimension "
                                       "{dim}, whose first source is invalid "
                                       "/ null. In valid proof trees, this "
                                       "should not happen".format(
                                           var=str(res.target(a, k)),
                                           dim=res.target(a, k).dimension))
                res.theory += (res.target(a, k + 2), c)
    # identification of targets
    tmp = deepcopy(res.theory)
    for cls in tmp.classes:
        elems = list(cls)
        dim = elems[0].dimension
        for i in range(1, len(cls)):
            for k in range(1, dim + 1):
                res.theory += (res.target(elems[0],
                                          k), res.target(elems[i], k))
    return res
예제 #3
0
 def test___init__(self):
     with self.assertRaises(DerivationError):
         NamedOpetope.Type([
             NamedOpetope.Term(NamedOpetope.Variable("α", 3)),
             NamedOpetope.Term(self.f),
             NamedOpetope.Term(self.a),
             NamedOpetope.Term()
         ])
     with self.assertRaises(DerivationError):
         NamedOpetope.Type([
             NamedOpetope.Term(self.alpha),
             NamedOpetope.Term(self.f),
             NamedOpetope.Term(NamedOpetope.Variable("a", 1)),
             NamedOpetope.Term()
         ])
     with self.assertRaises(DerivationError):
         NamedOpetope.Type([])
예제 #4
0
def point(name: str) -> NamedOpetope.OCMT:
    """
    The :math:`\\textbf{OptSet${}^!_m$}` :math:`\\texttt{point}` rule.
    Introduces a :math:`0`-variable with name ``x``.
    """
    t = NamedOpetope.Typing(NamedOpetope.Term(NamedOpetope.Variable(name, 0)),
                            NamedOpetope.Type([NamedOpetope.Term()]))
    return NamedOpetope.OCMT(NamedOpetope.EquationalTheory(),
                             NamedOpetope.Context() + t)
예제 #5
0
 def setUp(self):
     self.term1 = NamedOpetope.Term(NamedOpetope.Variable("a", 0))
     self.term2 = NamedOpetope.Term(NamedOpetope.Variable("f", 1))
     self.term3 = NamedOpetope.Term(NamedOpetope.Variable("α", 2))
     self.term4 = NamedOpetope.Term(NamedOpetope.Variable("A", 3))
     self.typing1 = NamedOpetope.Type([NamedOpetope.Term()])
     self.typing2 = NamedOpetope.Type([self.term1, NamedOpetope.Term()])
     self.typing3 = NamedOpetope.Type(
         [self.term2, self.term1,
          NamedOpetope.Term()])
     self.typing4 = NamedOpetope.Type(
         [self.term3, self.term2, self.term1,
          NamedOpetope.Term()])
     self.ctx1 = NamedOpetope.Context()
     self.ctx2 = self.ctx1 + NamedOpetope.Typing(self.term1, self.typing1)
     self.ctx3 = self.ctx2 + NamedOpetope.Typing(self.term2, self.typing2)
     self.ctx4 = self.ctx3 + NamedOpetope.Typing(self.term3, self.typing3)
     self.ctx5 = self.ctx4 + NamedOpetope.Typing(self.term4, self.typing4)
예제 #6
0
 def setUp(self):
     self.a = NamedOpetope.Variable("a", 0)
     self.f = NamedOpetope.Variable("f", 1)
     self.alpha = NamedOpetope.Variable("α", 2)
     self.t0 = NamedOpetope.Type([NamedOpetope.Term()])
     self.t1 = NamedOpetope.Type(
         [NamedOpetope.Term(self.a),
          NamedOpetope.Term()])
     self.t2 = NamedOpetope.Type([
         NamedOpetope.Term(self.f),
         NamedOpetope.Term(self.a),
         NamedOpetope.Term()
     ])
     self.t3 = NamedOpetope.Type([
         NamedOpetope.Term(self.alpha),
         NamedOpetope.Term(self.f),
         NamedOpetope.Term(self.a),
         NamedOpetope.Term()
     ])
예제 #7
0
def degen(ocmt: NamedOpetope.OCMT, name: str) -> NamedOpetope.Sequent:
    """
    The :math:`\\textbf{OptSet${}^!_m$}` :math:`\\texttt{degen}` rule.
    Introduces the degenerate pasting diagram on a given variable.
    """
    var = ocmt.context[name]
    type = ocmt.context.typeOf(var)
    t = NamedOpetope.Typing(
        NamedOpetope.Term(var, True),
        NamedOpetope.Type([NamedOpetope.Term(var)] + type.terms))
    return NamedOpetope.Sequent(deepcopy(ocmt.theory), deepcopy(ocmt.context),
                                t)
예제 #8
0
def shift(seq: NamedOpetope.Sequent, name: str) -> NamedOpetope.OCMT:
    """
    The :math:`\\textbf{OptSet${}^!_m$}` :math:`\\texttt{shift}` rule.
    Takes a sequent ``seq`` typing a term ``t`` and introduces
    a new variable ``x`` having ``t`` as :math:`1`-source.
    """
    n = seq.typing.term.dimension
    var = NamedOpetope.Variable(name, n + 1)
    if var in seq.context:
        raise DerivationError(
            "shift rule",
            "NamedOpetope.Variable {var} already typed in context",
            var=name)
    typing = NamedOpetope.Typing(
        NamedOpetope.Term(var),
        NamedOpetope.Type([seq.typing.term] + seq.typing.type.terms))
    res = NamedOpetope.OCMT(deepcopy(seq.theory),
                            deepcopy(seq.context) + typing)
    # targets of new variable
    for i in range(1, n + 2):
        res.context += NamedOpetope.Typing(
            NamedOpetope.Term(res.target(var, i)),
            NamedOpetope.Type(typing.type.terms[i:]))
    # additional theory
    termVar = seq.typing.term.variable
    if termVar is None:
        raise RuntimeError(
            "[shift rule] Premiss sequent types an invalid term. In valid "
            "proof trees, this should not happen")
    if seq.typing.term.degenerate:
        for i in range(n):
            res.theory += (res.target(var, i + 2), res.target(termVar, i))
    elif n >= 1:
        seq.theory += (res.target(var, 2), res.target(termVar))
        for gt in seq.typing.term.graftTuples():
            seq.theory += (res.target(gt[1]), gt[0])
    return res
예제 #9
0
 def setUp(self):
     self.a1 = NamedOpetope.Variable("a1", 0)
     self.b1 = NamedOpetope.Variable("b1", 0)
     self.c1 = NamedOpetope.Variable("c1", 0)
     self.a2 = NamedOpetope.Variable("a2", 0)
     self.b2 = NamedOpetope.Variable("b2", 0)
     self.c2 = NamedOpetope.Variable("c2", 0)
     self.f = NamedOpetope.Variable("f", 1)
     self.g = NamedOpetope.Variable("g", 1)
     self.h = NamedOpetope.Variable("h", 1)
     self.i = NamedOpetope.Variable("h", 1)
     ctx = NamedOpetope.Context() + \
         NamedOpetope.Typing(
             NamedOpetope.Term(self.a1),
             NamedOpetope.Type([NamedOpetope.Term()])) + \
         NamedOpetope.Typing(
             NamedOpetope.Term(self.b1),
             NamedOpetope.Type([NamedOpetope.Term()])) + \
         NamedOpetope.Typing(
             NamedOpetope.Term(self.c1),
             NamedOpetope.Type([NamedOpetope.Term()])) + \
         NamedOpetope.Typing(
             NamedOpetope.Term(self.f),
             NamedOpetope.Type(
                 [NamedOpetope.Term(self.a2),
                  NamedOpetope.Term()])) + \
         NamedOpetope.Typing(
             NamedOpetope.Term(self.g),
             NamedOpetope.Type(
                 [NamedOpetope.Term(self.b2), NamedOpetope.Term()])) + \
         NamedOpetope.Typing(
             NamedOpetope.Term(self.h),
             NamedOpetope.Type(
                 [NamedOpetope.Term(self.c2), NamedOpetope.Term()]))
     eqth = NamedOpetope.EquationalTheory() + \
         (self.b1, self.b2) + \
         (self.c1, self.c2) + \
         (self.h, self.i)
     self.sequent = NamedOpetope.Sequent(eqth, ctx, None)
     self.fg = self.sequent.graft(NamedOpetope.Term(self.g), self.b2,
                                  NamedOpetope.Term(self.f))
     self.gh = self.sequent.graft(NamedOpetope.Term(self.h), self.c2,
                                  NamedOpetope.Term(self.g))
     self.fgh1 = self.sequent.graft(self.gh, self.b2,
                                    NamedOpetope.Term(self.f))
     self.fgh2 = self.sequent.graft(NamedOpetope.Term(self.h), self.c2,
                                    self.fg)