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() ]))
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
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([])
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)
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)
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() ])
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)
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
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)