public Sequent Apply(Sequent sequent) { QuantifierFormula implicationFormula = (QuantifierFormula)sequent.RightHandSide.Formulas.Where ( x => x is QuantifierFormula formula && formula.Quantifier == QuantifierConnective.ForAll ).FirstOrDefault(); if (implicationFormula == null) { return(null); } var formula = implicationFormula.Formula.Clone(); Terminal a; if (implicationFormula.FreeVariables.Count == 0 && implicationFormula.WorldIndex.IsGround) { a = termNamer.GetNewConstant(); } else { var skolemVariables = new List <Terminal>(formula.WorldIndex.Symbols.Select(x => x.ToTerminal())); skolemVariables.AddRange(implicationFormula.FreeVariables); a = termNamer.GetNewFunction(skolemVariables); } formula.ApplySubstitution(new Substitution(implicationFormula.Variable, a)); sequent.RightHandSide.Formulas.Remove(implicationFormula); sequent.RightHandSide.Formulas.Add(formula); sequent.Justification = "R9 (" + sequent.Name + ")"; return(sequent); }
public void Test4() { ObjectVariableTerm x = new ObjectVariable('x'); IndividualConstantTerm <RationalNumber> half = (IndividualConstant <RationalNumber>)(new RationalNumber(1, 2)); IndividualConstantTerm <RationalNumber> one = (IndividualConstant <RationalNumber>)(new RationalNumber(1, 1)); var pr1 = new PredicateFormula(Predicates.More, x, half); var pr2 = new PredicateFormula(Predicates.Less, x, one); var f1 = new PropositionalConnectiveFormula(Conjunction.GetInstance(), pr1, pr2); var f2 = new QuantifierFormula(ExistentialQuantifier.GetInstance(), x, f1); IndividualConstantTerm <int> two = new IndividualConstant <int>(2); var xSqr = new FunctionTerm(Functions.Pow, x, two); var pr3 = new PredicateFormula(Predicates.MoreZero, xSqr); var pr4 = new PredicateFormula(Predicates.EqualZero, x); var f3 = new PropositionalConnectiveFormula(Disjunction.GetInstance(), pr3, pr4); var f = new PropositionalConnectiveFormula(Conjunction.GetInstance(), f2, f3); var actual = SimpleTarskiAlgorithm.QuantifiersElimination(f); Formula expected = f3; Formula expected1 = new PropositionalConnectiveFormula(Disjunction.GetInstance(), pr4, pr3); Assert.IsTrue(expected.Equals(actual) || expected1.Equals(actual)); }
public void ZeroEqualZero() { ObjectVariableTerm x = new ObjectVariable('x'); IndividualConstantTerm <int> zero = (IndividualConstant <int>) 0; var pr = new PredicateFormula(Predicates.Equal, zero, zero); var f = new QuantifierFormula(UniversalQuantifier.GetInstance(), x, pr); var actual = SimpleTarskiAlgorithm.QuantifiersElimination(f); var expected = new PredicateFormula(True.GetInstance()); Assert.AreEqual(expected, actual); }
public void Test1() { ObjectVariableTerm x = new ObjectVariable('x'); IndividualConstantTerm <RationalNumber> half = (IndividualConstant <RationalNumber>)(new RationalNumber(1, 2)); var formula1 = new PredicateFormula(Predicates.More, x, half); var formula2 = new QuantifierFormula(ExistentialQuantifier.GetInstance(), x, formula1); var res = SimpleTarskiAlgorithm.QuantifiersElimination(formula2); var expected = new PredicateFormula(True.GetInstance()); Assert.AreEqual(expected, res); }
private static void CalcQuantifier(Quantifier quantifier, Stack <object> stack) { if (stack.Count < 2) { throw new ArgumentException("incorrect quantifier formula"); } try { var formula = (Formula)stack.Pop(); var objectVar = (ObjectVariableTerm)stack.Pop(); var newFormula = new QuantifierFormula(quantifier, objectVar, formula); stack.Push(newFormula); } catch (Exception) { throw new ArgumentException("incorrect quantifier formula"); } }
public Sequent Apply(Sequent sequent) { QuantifierFormula implicationFormula = (QuantifierFormula)sequent.LeftHandSide.Formulas.Where ( x => x is QuantifierFormula formula && formula.Quantifier == QuantifierConnective.ForAll ).FirstOrDefault(); if (implicationFormula == null) { return(null); } var formula = implicationFormula.Formula.Clone(); formula.ApplySubstitution(new Substitution(implicationFormula.Variable, LogicSolver.TermNamer.GetNewVariable())); sequent.LeftHandSide.Formulas.Remove(implicationFormula); sequent.LeftHandSide.Formulas.Add(formula); sequent.Justification = "R10 (" + sequent.Name + ")"; return(sequent); }
public void Test2() { ObjectVariableTerm x = new ObjectVariable('x'); IndividualConstantTerm <RationalNumber> half = (IndividualConstant <RationalNumber>)(new RationalNumber(1, 2)); IndividualConstantTerm <RationalNumber> one = (IndividualConstant <RationalNumber>) new RationalNumber(1, 1); var pr1 = new PredicateFormula(Predicates.More, x, half); var pr2 = new PredicateFormula(Predicates.Less, x, one); var f1 = new PropositionalConnectiveFormula(Conjunction.GetInstance(), pr1, pr2); var f2 = new QuantifierFormula(ExistentialQuantifier.GetInstance(), x, f1); var actual = SimpleTarskiAlgorithm.QuantifiersElimination(f2); var expected = new PredicateFormula(True.GetInstance()); Assert.AreEqual(expected, actual); }