def __init__(self, variable, equivalence, formula, newVariable=None): self.variable = variable self.equivalence = equivalence self.formula = formula if newVariable is None: self.newVariable = Variable() else: self.newVariable = newVariable
class Unique(Formula): def __init__(self, variable, equivalence, formula, newVariable=None): self.variable = variable self.equivalence = equivalence self.formula = formula if newVariable is None: self.newVariable = Variable() else: self.newVariable = newVariable def _translate(self): formulaTranslate = self.formula.translate() all_others_are_equal = basicFormula.Not( basicFormula.Exists( self.newVariable, basicFormula.And( basicFormula.And( InDomain(self.newVariable, self.equivalence), formulaTranslate.substituteVariable(self.variable, self.newVariable), ), basicFormula.Not(Equal(self.newVariable, self.variable, self.equivalence)), ), ) ) return basicFormula.And(formulaTranslate, all_others_are_equal) def substituteVariable(self, a, b): assert b != self.newVariable assert a != self.newVariable return Unique( variable=self.variable.substituteVariable(a, b), equivalence=self.equivalence.substituteVariable(a, b), formula=self.formula.substituteVariable(a, b), newVariable=self.newVariable, ) def updateVariables(self): return Unique( variable=self.variable, equivalence=self.equivalence, formula=self.formula.updateVariables(), newVariable=self.newVariable.updateVariables(), ) def render(self, context): return gl.newTextualGLStack(colors.variableColor, "%s ! in %s . " % (self.variable, self.equivalence)).stack( 0, self.formula.render(context) )