@@ -1610,4 +1610,91 @@ public void testSl() throws SolverException, InterruptedException {
16101610 assertThat (f2 ).isEqualTo (f );
16111611 assertThatFormula (f ).isEquivalentTo (f2 );
16121612 }
1613+
1614+ @ Test
1615+ public void testQuantifierAndBoundVariablesWithIntegers () {
1616+ requireQuantifiers ();
1617+ requireArrays ();
1618+ requireIntegers ();
1619+ requireVisitor ();
1620+
1621+ IntegerFormula four = imgr .makeNumber (4 );
1622+ IntegerFormula var1 = imgr .makeVariable ("var1" );
1623+ IntegerFormula var2 = imgr .makeVariable ("var2" );
1624+ IntegerFormula var3 = imgr .makeVariable ("var3" );
1625+
1626+ ArrayFormula <IntegerFormula , IntegerFormula > array1 =
1627+ amgr .makeArray ("array1" , FormulaType .IntegerType , FormulaType .IntegerType );
1628+ ArrayFormula <IntegerFormula , IntegerFormula > array2 =
1629+ amgr .makeArray ("array2" , FormulaType .IntegerType , FormulaType .IntegerType );
1630+
1631+ IntegerFormula bvIndex = imgr .add (var2 , imgr .multiply (four , var1 ));
1632+ BooleanFormula body = amgr .equivalence (array2 , amgr .store (array1 , bvIndex , var3 ));
1633+
1634+ List <? extends Formula > freeVars = ImmutableList .of (var2 , var3 , array2 );
1635+ List <? extends Formula > boundVars = ImmutableList .of (var1 , array1 );
1636+ List <? extends Formula > allVars = ImmutableList .of (var1 , var2 , var3 , array1 , array2 );
1637+ Map <String , Formula > variablesInBody = mgr .extractVariables (body );
1638+ assertThat (variablesInBody .values ()).containsExactlyElementsIn (allVars );
1639+
1640+ for (Quantifier quantifier : Quantifier .values ()) {
1641+ BooleanFormula quantifiedFormula = qmgr .mkQuantifier (quantifier , boundVars , body );
1642+
1643+ Map <String , Formula > variablesInQuantifiedFormula = mgr .extractVariables (quantifiedFormula );
1644+ Map <String , Formula > variablesAndUFsInQuantifiedFormula =
1645+ mgr .extractVariablesAndUFs (quantifiedFormula );
1646+
1647+ assertThat (variablesAndUFsInQuantifiedFormula ).isEqualTo (variablesInQuantifiedFormula );
1648+ assertThat (variablesInQuantifiedFormula .values ()).containsExactlyElementsIn (freeVars );
1649+ assertThat (variablesInQuantifiedFormula .values ()).containsNoneIn (boundVars );
1650+
1651+ // TODO: add collection of bound variables through new visitor implementation and test
1652+ // failure of the old
1653+ }
1654+ }
1655+
1656+ @ Test
1657+ public void testQuantifierAndBoundVariablesWithBitvectors () {
1658+ requireQuantifiers ();
1659+ requireArrays ();
1660+ requireBitvectors ();
1661+ requireVisitor ();
1662+
1663+ int bvLen = 32 ;
1664+ BitvectorType bvType = FormulaType .BitvectorType .getBitvectorTypeWithSize (bvLen );
1665+
1666+ BitvectorFormula four = bvmgr .makeBitvector (bvLen , 4 );
1667+ BitvectorFormula var1 = bvmgr .makeVariable (bvType , "var1" );
1668+ BitvectorFormula var2 = bvmgr .makeVariable (bvType , "var2" );
1669+ BitvectorFormula var3 = bvmgr .makeVariable (bvType , "var3" );
1670+
1671+ ArrayFormula <BitvectorFormula , BitvectorFormula > array1 =
1672+ amgr .makeArray ("array1" , bvType , bvType );
1673+ ArrayFormula <BitvectorFormula , BitvectorFormula > array2 =
1674+ amgr .makeArray ("array2" , bvType , bvType );
1675+
1676+ BitvectorFormula bvIndex = bvmgr .add (var2 , bvmgr .multiply (four , var1 ));
1677+ BooleanFormula body = amgr .equivalence (array2 , amgr .store (array1 , bvIndex , var3 ));
1678+
1679+ List <? extends Formula > freeVars = ImmutableList .of (var2 , var3 , array2 );
1680+ List <? extends Formula > boundVars = ImmutableList .of (var1 , array1 );
1681+ List <? extends Formula > allVars = ImmutableList .of (var1 , var2 , var3 , array1 , array2 );
1682+ Map <String , Formula > variablesInBody = mgr .extractVariables (body );
1683+ assertThat (variablesInBody .values ()).containsExactlyElementsIn (allVars );
1684+
1685+ for (Quantifier quantifier : Quantifier .values ()) {
1686+ BooleanFormula quantifiedFormula = qmgr .mkQuantifier (quantifier , boundVars , body );
1687+
1688+ Map <String , Formula > variablesInQuantifiedFormula = mgr .extractVariables (quantifiedFormula );
1689+ Map <String , Formula > variablesAndUFsInQuantifiedFormula =
1690+ mgr .extractVariablesAndUFs (quantifiedFormula );
1691+
1692+ assertThat (variablesAndUFsInQuantifiedFormula ).isEqualTo (variablesInQuantifiedFormula );
1693+ assertThat (variablesInQuantifiedFormula .values ()).containsExactlyElementsIn (freeVars );
1694+ assertThat (variablesInQuantifiedFormula .values ()).containsNoneIn (boundVars );
1695+
1696+ // TODO: add collection of bound variables through new visitor implementation and test
1697+ // failure of the old
1698+ }
1699+ }
16131700}
0 commit comments