def formulaVars(self, f: Formula) -> Set[str]: """ List variables in formula f. This depends on correct implementation of subf() and Variable.name. """ if isinstance(f, Variable): return set([f.name()]) return set.union(set(), *(self.formulaVars(sf) for sf in f.subf()))
def formulaIsSatisfied(self, f: Formula, v: Valuation): if isinstance(f, Variable): return v[f.name()] elif isinstance(f, Negation): return not self.formulaIsSatisfied(f.subf()[0], v) elif isinstance(f, Conjunction): return all(self.formulaIsSatisfied(sf, v) for sf in f.subf()) elif isinstance(f, Disjunction): return any(self.formulaIsSatisfied(sf, v) for sf in f.subf()) elif isinstance(f, Implication): return (not self.formulaIsSatisfied( f.subf()[0], v)) or self.formulaIsSatisfied(f.subf()[1], v) elif isinstance(f, Equivalence): return self.formulaIsSatisfied(f.subf()[0], v) == self.formulaIsSatisfied( f.subf()[1], v) else: raise TypeError("Formula expected, got %s" % repr(f))
def formulaDeg(self, f: Formula) -> int: if isinstance(f, Variable): return 0 return sum(self.formulaDeg(sf) for sf in f.subf()) + 1