Skip to content

Commit 2bf59c8

Browse files
authored
Merge pull request #491 from sosy-lab/feat/cleanup-bound-vars
Cleanup usage of bound variables
2 parents c633804 + 2b21b02 commit 2bf59c8

25 files changed

+152
-179
lines changed

src/org/sosy_lab/java_smt/api/visitors/BooleanFormulaTransformationVisitor.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@ public BooleanFormula visitConstant(boolean value) {
3737
return bfmgr.makeBoolean(value);
3838
}
3939

40-
@Override
41-
public BooleanFormula visitBoundVar(BooleanFormula var, int deBruijnIdx) {
42-
return var;
43-
}
44-
4540
@Override
4641
public BooleanFormula visitAtom(BooleanFormula pAtom, FunctionDeclaration<BooleanFormula> decl) {
4742
return pAtom;

src/org/sosy_lab/java_smt/api/visitors/BooleanFormulaVisitor.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,23 @@ public interface BooleanFormulaVisitor<R> {
3131
*/
3232
R visitConstant(boolean value);
3333

34-
/** Visit a boolean variable bound by a quantifier. */
35-
R visitBoundVar(BooleanFormula var, int deBruijnIdx);
34+
/**
35+
* Visit a boolean variable bound by a quantifier.
36+
*
37+
* <p>Since JavaSMT no longer explicitly visits bound variables, and never has done so for most
38+
* solvers, this method will be removed in the future. Bound variables are available when visiting
39+
* a quantified formula, and can be accessed in {@link #visitQuantifier}. When entering the body
40+
* of a quantified formula, bound variables are seen as free variables, as documented in {@link
41+
* FormulaVisitor#visitQuantifier}.
42+
*/
43+
@Deprecated(since = "2025.07, because bound variables are never created or used in the visitor")
44+
@SuppressWarnings("unused")
45+
default R visitBoundVar(BooleanFormula var, int deBruijnIdx) {
46+
throw new UnsupportedOperationException(
47+
"Bound variables are no longer explicitly visited in JavaSMT. "
48+
+ "Use a combination of 'visitQuantifier' (for the whole quantified formula) and "
49+
+ "'visitAtom' (for variables in the body) instead.");
50+
}
3651

3752
/**
3853
* Visit a NOT-expression.

src/org/sosy_lab/java_smt/api/visitors/DefaultBooleanFormulaVisitor.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,6 @@ public R visitConstant(boolean value) {
2828
return visitDefault();
2929
}
3030

31-
@Override
32-
public R visitBoundVar(BooleanFormula var, int deBruijnIdx) {
33-
return visitDefault();
34-
}
35-
3631
@Override
3732
public R visitAtom(BooleanFormula pAtom, FunctionDeclaration<BooleanFormula> decl) {
3833
return visitDefault();

src/org/sosy_lab/java_smt/api/visitors/DefaultFormulaVisitor.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,6 @@ public R visitFreeVariable(Formula f, String name) {
2929
return visitDefault(f);
3030
}
3131

32-
@Override
33-
public R visitBoundVariable(Formula f, int deBruijnIdx) {
34-
return visitDefault(f);
35-
}
36-
3732
@Override
3833
public R visitConstant(Formula f, Object value) {
3934
return visitDefault(f);

src/org/sosy_lab/java_smt/api/visitors/FormulaTransformationVisitor.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,6 @@ public Formula visitFreeVariable(Formula f, String name) {
3333
return f;
3434
}
3535

36-
@Override
37-
public Formula visitBoundVariable(Formula f, int deBruijnIdx) {
38-
return f;
39-
}
40-
4136
@Override
4237
public Formula visitConstant(Formula f, Object value) {
4338
return f;

src/org/sosy_lab/java_smt/api/visitors/FormulaVisitor.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,22 @@ public interface FormulaVisitor<R> {
3838
* Visit a variable bound by a quantifier. The variable can have any sort (both boolean and
3939
* non-boolean).
4040
*
41+
* <p>This method is deprecated because bound variables are no longer explicitly visited. When
42+
* entering a quantified formula, bound variables are seen as free variables, as documented in
43+
* {@link #visitQuantifier}. When entering the body of a quantified formula, bound variables are
44+
* replaced by free variables, and are visited with {@link #visitFreeVariable}.
45+
*
4146
* @param f Formula representing the variable.
4247
* @param deBruijnIdx de-Bruijn index of the bound variable, which can be used to find the
4348
* matching quantifier.
4449
*/
45-
R visitBoundVariable(Formula f, int deBruijnIdx);
50+
@Deprecated(since = "2025.07, because bound variables are never created or used in the visitor")
51+
default R visitBoundVariable(Formula f, int deBruijnIdx) {
52+
throw new UnsupportedOperationException(
53+
"Bound variables are no longer explicitly visited in JavaSMT. "
54+
+ "Use a combination of 'visitQuantifier' (for the whole quantified formula) and "
55+
+ "'visitFreeVariable' (in the body) instead.");
56+
}
4657

4758
/**
4859
* Visit a constant, such as "true"/"false", a numeric constant like "1" or "1.0", a String

src/org/sosy_lab/java_smt/basicimpl/AbstractBooleanFormulaManager.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -319,14 +319,6 @@ public R visitFreeVariable(Formula f, String name) {
319319
formulaCreator.getBooleanVarDeclaration(casted)));
320320
}
321321

322-
@Override
323-
public R visitBoundVariable(Formula f, int deBruijnIdx) {
324-
325-
// Only boolean formulas can appear here.
326-
assert f instanceof BooleanFormula;
327-
return delegate.visitBoundVar((BooleanFormula) f, deBruijnIdx);
328-
}
329-
330322
@Override
331323
public R visitConstant(Formula f, Object value) {
332324
checkState(value instanceof Boolean);

src/org/sosy_lab/java_smt/basicimpl/AbstractQuantifiedFormulaManager.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
package org.sosy_lab.java_smt.basicimpl;
1010

11+
import static com.google.common.base.Preconditions.checkArgument;
12+
1113
import com.google.common.collect.Lists;
1214
import java.util.List;
1315
import org.sosy_lab.java_smt.api.BooleanFormula;
@@ -41,6 +43,8 @@ protected abstract TFormulaInfo eliminateQuantifiers(TFormulaInfo pExtractInfo)
4143
@Override
4244
public BooleanFormula mkQuantifier(
4345
Quantifier q, List<? extends Formula> pVariables, BooleanFormula pBody) {
46+
checkArgument(
47+
!pVariables.isEmpty(), "Missing variables for quantifier '%s' and body '%s'.", q, pBody);
4448
return wrap(
4549
mkQuantifier(q, Lists.transform(pVariables, this::extractInfo), extractInfo(pBody)));
4650
}

src/org/sosy_lab/java_smt/basicimpl/FormulaTransformationVisitorImpl.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,6 @@ public Void visitFreeVariable(Formula f, String name) {
4141
return null;
4242
}
4343

44-
@Override
45-
public Void visitBoundVariable(Formula f, int deBruijnIdx) {
46-
Preconditions.checkNotNull(f);
47-
48-
// Bound variable transformation is not allowed.
49-
pCache.put(f, f);
50-
return null;
51-
}
52-
5344
@Override
5445
public Void visitConstant(Formula f, Object value) {
5546
Preconditions.checkNotNull(f);

src/org/sosy_lab/java_smt/basicimpl/RecursiveFormulaVisitorImpl.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,6 @@ public TraversalProcess visitFreeVariable(Formula pF, String pName) {
6464
return delegate.visitFreeVariable(pF, pName);
6565
}
6666

67-
@Override
68-
public TraversalProcess visitBoundVariable(Formula pF, int pDeBruijnIdx) {
69-
return delegate.visitBoundVariable(pF, pDeBruijnIdx);
70-
}
71-
7267
@Override
7368
public TraversalProcess visitConstant(Formula pF, Object pValue) {
7469
return delegate.visitConstant(pF, pValue);

0 commit comments

Comments
 (0)