// No hace falta override porque PLVisitor es una interfaz public bool?VisitBinarySentence(ComplexSentence bs, bool?arg) { bool? firstValue = (bool?)bs.GetSimplerSentence(0).Accept(this, null); bool? secondValue = (bool?)bs.GetSimplerSentence(1).Accept(this, null); bool bothValuesKnown = firstValue != null && secondValue != null; Connective connective = bs.GetConnective(); // He reprogramado todo esto if (connective.Equals(Connective.AND)) { if (firstValue.Equals(false) || secondValue.Equals(false)) { return(false); } else if (bothValuesKnown) { return(true); // Si no se cumple, saldrá como null } } else if (connective.Equals(Connective.OR)) { if (firstValue.Equals(true) || secondValue.Equals(true)) { return(true); } else if (bothValuesKnown) { return(false); // Si no se cumple, saldrá como null } } else if (connective.Equals(Connective.IMPLICATION)) { if (firstValue.Equals(false) || secondValue.Equals(true)) { return(true); } else if (bothValuesKnown) { return(false); // Si no se cumple, saldrá como null } } else if (connective.Equals(Connective.BICONDITIONAL)) { if (bothValuesKnown) { return(firstValue.Equals(secondValue)); // Si no se cumple, saldrá como null } } return(null); }
// No hace falta override porque PLVisitor es una interfaz, pero pongo virtual por si queremos seguir sobreescribiendo public virtual Sentence VisitBinarySentence(ComplexSentence s, A arg) { // Una nueva sentencia compleja con la misma conectiva pero posiblemente con sus sentencias más simples reemplazadas por el visitante. return(new ComplexSentence(s.GetConnective(), s.GetSimplerSentence(0).Accept(this, arg), s.GetSimplerSentence(1).Accept(this, arg))); }