Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/org/sosy_lab/java_smt/api/NumeralFormulaManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.util.List;
import org.sosy_lab.common.rationals.Rational;
import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula;

/**
* This interface represents the Numeral Theory.
Expand Down Expand Up @@ -106,4 +107,6 @@ public interface NumeralFormulaManager<
* <p>For rational formulas, SMTlib2 denotes this operation as {@code to_int}.
*/
IntegerFormula floor(ParamFormulaType formula);

RationalFormula toRational(ParamFormulaType number);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.sosy_lab.java_smt.api.FormulaType;
import org.sosy_lab.java_smt.api.NumeralFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula;
import org.sosy_lab.java_smt.api.NumeralFormulaManager;

/**
Expand Down Expand Up @@ -445,4 +446,16 @@ protected TFormulaInfo floor(TFormulaInfo number) {
protected TFormulaInfo toType(TFormulaInfo param) {
return param;
}

@Override
public RationalFormula toRational(ParamFormulaType number) {
if (number instanceof RationalFormula) {
return (RationalFormula) number;
} else {
return getFormulaCreator()
.encapsulate(FormulaType.RationalType, toRational(extractInfo(number)));
}
}

protected abstract TFormulaInfo toRational(TFormulaInfo number);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.sosy_lab.java_smt.api.FormulaType;
import org.sosy_lab.java_smt.api.NumeralFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula;
import org.sosy_lab.java_smt.api.NumeralFormulaManager;

@SuppressWarnings("ClassTypeParameterName")
Expand Down Expand Up @@ -225,4 +226,13 @@ public IntegerFormula floor(ParamFormulaType formula) {
debugging.addFormulaTerm(result);
return result;
}

@Override
public RationalFormula toRational(ParamFormulaType formula) {
debugging.assertThreadLocal();
debugging.assertFormulaInContext(formula);
RationalFormula result = delegate.toRational(formula);
debugging.addFormulaTerm(result);
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.sosy_lab.java_smt.api.FormulaType;
import org.sosy_lab.java_smt.api.NumeralFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula;
import org.sosy_lab.java_smt.api.NumeralFormulaManager;

@SuppressWarnings("ClassTypeParameterName")
Expand Down Expand Up @@ -160,4 +161,10 @@ public IntegerFormula floor(ParamFormulaType pNumber) {
stats.numericOperations.getAndIncrement();
return delegate.floor(pNumber);
}

@Override
public RationalFormula toRational(ParamFormulaType formula) {
stats.numericOperations.getAndIncrement();
return delegate.toRational(formula);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.sosy_lab.java_smt.api.FormulaType;
import org.sosy_lab.java_smt.api.NumeralFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula;
import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula;
import org.sosy_lab.java_smt.api.NumeralFormulaManager;
import org.sosy_lab.java_smt.api.SolverContext;

Expand Down Expand Up @@ -181,4 +182,11 @@ public IntegerFormula floor(ParamFormulaType pNumber) {
return delegate.floor(pNumber);
}
}

@Override
public RationalFormula toRational(ParamFormulaType formula) {
synchronized (sync) {
return delegate.toRational(formula);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -186,4 +186,9 @@ protected Expr distinctImpl(List<Expr> pParam) {
return exprManager.mkExpr(Kind.DISTINCT, param);
}
}

@Override
public Expr toRational(Expr formula) {
return exprManager.mkExpr(Kind.TO_REAL, formula);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -195,4 +195,9 @@ protected Term distinctImpl(List<Term> pParam) {
Kind.DISTINCT, pParam.stream().map(this::toType).toArray(Term[]::new));
}
}

@Override
public Term toRational(Term formula) {
return termManager.mkTerm(Kind.TO_REAL, formula);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -135,4 +135,9 @@ protected Long lessOrEquals(Long pNumber1, Long pNumber2) {
protected Long floor(Long pNumber) {
return msat_make_floor(mathsatEnv, pNumber);
}

@Override
protected Long toRational(Long pNumber) {
return pNumber;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,9 @@ protected PTRef lessOrEquals(PTRef pParam1, PTRef pParam2) {
protected PTRef distinctImpl(List<PTRef> pParam) {
return osmtLogic.mkDistinct(new VectorPTRef(pParam));
}

@Override
public PTRef toRational(PTRef formula) {
throw new UnsupportedOperationException("OpenSMT does not support mixed integer-real logic");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,9 @@ protected IFormula equal(IExpression pNumber1, IExpression pNumber2) {
protected IExpression distinctImpl(List<IExpression> pNumbers) {
return IExpression.distinct(asScala(Iterables.filter(pNumbers, ITerm.class)));
}

@Override
public IExpression toRational(IExpression formula) {
return PrincessEnvironment.rationalTheory.int2ring((ITerm) formula);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,14 @@ protected boolean isNumeral(IExpression value) {
return false;
}

protected IExpression fromInteger(ITerm i) {
return PrincessEnvironment.rationalTheory.int2ring(i);
}

@Override
protected IExpression makeNumberImpl(long i) {
return fromInteger(ifmgr.makeNumberImpl(i));
return toRational(ifmgr.makeNumberImpl(i));
}

@Override
protected IExpression makeNumberImpl(BigInteger i) {
return fromInteger(ifmgr.makeNumberImpl(i));
return toRational(ifmgr.makeNumberImpl(i));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,4 +174,9 @@ public Term lessThan(Term pNumber1, Term pNumber2) {
public Term lessOrEquals(Term pNumber1, Term pNumber2) {
return env.term("<=", pNumber1, pNumber2);
}

@Override
public Term toRational(Term formula) {
return env.term("to_real", formula);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -136,4 +136,9 @@ public Integer lessOrEquals(Integer pParam1, Integer pParam2) {
protected Integer floor(Integer pNumber) {
return yices_floor(pNumber);
}

@Override
public Integer toRational(Integer formula) {
return formula;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,9 @@ protected Long lessThan(Long pNumber1, Long pNumber2) {
protected Long lessOrEquals(Long pNumber1, Long pNumber2) {
return Native.mkLe(z3context, pNumber1, pNumber2);
}

@Override
protected Long toRational(Long number) {
return Native.mkInt2real(z3context, number);
}
}