A More Efficient BDD-Based QBF Solver Oswaldo Olivo, E. Allen - - PowerPoint PPT Presentation

a more efficient bdd based qbf solver
SMART_READER_LITE
LIVE PREVIEW

A More Efficient BDD-Based QBF Solver Oswaldo Olivo, E. Allen - - PowerPoint PPT Presentation

A More Efficient BDD-Based QBF Solver Oswaldo Olivo, E. Allen Emerson The University of Texas at Austin, U.S.A. September 15, 2011 1 / 40 Outline Introduction. Preliminaries. eBDD-QBF Solver. Experiments. Conclusions and Future Work. 2 /


slide-1
SLIDE 1

A More Efficient BDD-Based QBF Solver

Oswaldo Olivo, E. Allen Emerson

The University of Texas at Austin, U.S.A.

September 15, 2011

1 / 40

slide-2
SLIDE 2

Outline

Introduction. Preliminaries. eBDD-QBF Solver. Experiments. Conclusions and Future Work.

2 / 40

slide-3
SLIDE 3

Introduction

Satisfiability of quantified boolean propositional formulas (QBF). QBF Applications: Conformant planning, model checking, equivalence checking and theorem proving. Solvers classified as search (DPLL) and symbolic (BDDs, ZDDs, AIGs). Conventional wisdom : Search outperforms Symbolic.

3 / 40

slide-4
SLIDE 4

Introduction

New BDD-based QBF solver. BDD Constraint Propagation. Enhanced early quantification. Variable elimination order.

4 / 40

slide-5
SLIDE 5

Preliminaries: Quantified Boolean Formulas (QBFs)

Let formula Q1X1Q2X2...QnXnφ , where Qi ∈ {∀, ∃}, Xi set

  • f propositional variables

and φ is a propositional formula over Xis. Q1X1Q2X2...QnXn is quantifier prefix and φ matrix. QBF : Is there a satisfying assignment for above formula? Assume CNF: (1) Q1X1Q2X2...QnXn(C1 ∧ C2 ∧ ... ∧ Cm). Each Cj is disjunction of literals called clause.

5 / 40

slide-6
SLIDE 6

Preliminaries: Binary Decision Diagrams (BDDs)

Binary Decision Diagram (BDD) is a DAG that represents all satisfying assignments. Inner node represents a variable x of formula and has two children denoted by high and low. Imposing variable ordering in paths, eliminating redundant nodes and merging of isomorphic subgraphs : ROBDDs. Apply(A, B, op) algorithm is binary operation op applied for BDDs. The RestrictBy(A, B) alg. prunes assignments of A inconsistent with B.

6 / 40

slide-7
SLIDE 7

Preliminaries: Binary Decision Diagrams (BDDs)

(¬x1 ∨ x2) ∧ (¬x3 ∨ x2) ∧ (x1 ∨ ¬x2 ∨ x3)

7 / 40

slide-8
SLIDE 8

eBDD-QBF solver

New BDD-based QBF solver. Symbolic: Transforms input CNF into set of implicitly conjoined BDDs and applies decision procedure. Includes search-inspired optimizations for BDDs : unit clause and pure literal propagation (BDD Constraint Propagation). Employs a variant of early quantification from model checking. Dynamic variable elimination heuristics.

8 / 40

slide-9
SLIDE 9

Enhanced Early Quantification Example.

Inner Existential Variable case : ∃x1∀x2∃x3((x1 ∨ x2) ∧ (¬x2 ∨ x3) ∧ (¬x1 ∨ ¬x3)) ≡ ∃x1∀x2((x1 ∨ x2) ∧ (∃x3(¬x2 ∨ x3) ∧ (¬x1 ∨ ¬x3))) ≡ ∃x1∀x2((x1 ∨ x2) ∧ (¬x1 ∨ ¬x2)) Inner Universal Variable case: ∃x1∀x2∀x3((x1 ∨ x2) ∧ (¬x2 ∨ x3) ∧ (¬x1 ∨ ¬x3)) ≡ ∃x1∀x2((x1 ∨ x2) ∧ (∀x3(¬x2 ∨ x3)) ∧ (∀x3(¬x1 ∨ ¬x3))) ≡ ∃x1∀x2((x1 ∨ x2) ∧ ¬x2 ∧ ¬x1)

9 / 40

slide-10
SLIDE 10

QBF Formulations

(1) Q1X1Q2X2...QnXn(C1 ∧ C2 ∧ ... ∧ Cm). (2) Q1X1Q2X2...Qn−1Xn−1Qn(Xn − {xi}) (Qnxi(C1 ∧ C2 ∧ ... ∧ Ck) ∧ Ck+1 ∧ ... ∧ Cm)

10 / 40

slide-11
SLIDE 11

Enhanced Early Quantification Algorithm.

Recall (1) and (2) from previous slide .Let var xi be innermost in (1). w.l.o.g., xi occurs. in C1, ..., Ck and not in Ck+1, ..., Cm. xi existential → rewrite (1) into (2). xi universal. → use ∀x(P(x) ∧ Q(x)) ≡ ∀x(P(x)) ∧ ∀x(Q(x)), and (1) becomes. : (3) Q1X1Q2X2...Qn−1Xn−1∀(Xn − {xi}) ((∀xi(C1) ∧ ∀xi(C2) ∧ ... ∧ ∀xi(Ck)) ∧ Ck+1 ∧ ... ∧ Cm) Motivation : quantification typically reduces diagram size, as variable is eliminated from support set. Individually quantify , conjoin all simplified BDDs, store result and apply early quantification iteratively.

11 / 40

slide-12
SLIDE 12

BDD Constraint Propagation (Unit Clause) Example.

Simple Case: BDDs represent clauses. Existential variable: x2 is unit clause. ∃x1∃x2(

BDD 1

  • (x1 ∨ ¬x2) ∧

BDD 2

  • x2 )

≡ ∃x1(

BDD 1

  • (x1) )

Universal variable: x2 is unit clause. ∃x1∀x2(

BDD 1

  • (x1 ∨ ¬x2) ∧

BDD 2

  • x2 )

≡ UNSAT

12 / 40

slide-13
SLIDE 13

BDD Constraint Propagation (Unit Clause).

Unit Clause Propagation : Clause with only one literal has to be set to true in order to continue solving. Simple case:Initially every BDD represents a clause of the CNF f . Algorithm eBDD-QBF Unit Propagation:

1

Detect all BDDs of support set size 1 (called unit BDDs).

2

If any unit BDD is universal, return UNSAT.

3

Conjoin all unit BDDs into one BDD b.

4

return RestrictBy(f , b).

Limitation: Only works when BDDs represent clauses, hence useless after applying early quantification.

13 / 40

slide-14
SLIDE 14

BDD Constraint Propagation (Unit Clause) Example.

Complex Case: BDDs may represent non-clausal formulas. Existential variable: x1 is inner unit clause. ∃x1∀x2∃x3(

BDD 1

  • (x1 ∧ ¬x3) ∨ (x1 ∧ x2) ∧(

BDD 2

x3 ∨ x1) ≡ ∃x1∀x2∃x3(

BDD 1

  • (

x1

  • InnerUnitClause

∧(¬x3 ∨ x2)) ∧

BDD 2

  • (x3 ∨ x1))

≡ ∀x2∃x3(

BDD 1

  • (¬x3 ∨ x2))

Universal variable: x1 is inner unit clause. ∀x1∀x2∃x3(

BDD 1

  • (x1 ∧ ¬x3) ∨ (x1 ∧ x2) ∧(

BDD 2

x3 ∨ x1) ≡ UNSAT

14 / 40

slide-15
SLIDE 15

BDD Constraint Propagation (Unit Clause) (Cont.)

Complex case : Early quantification has been applied, so BDDs do not necessarily represent clauses. However, formula may contain inner unit clauses in their underlying CNF. Example (x1 ∧ x2) ∨ (x1 ∧ x3) ≡ x1 ∧ (x2 ∨ x3). Algorithm eBDD-QBF Unit Propagation :

1

For each BDD b in the formula representation f :

2

For each variable x in the support set of b

3

If RestrictBy(b, BDD(¬x)) ≡ ZERO BDD then x is inner unit clause.

4

If RestrictBy(b, BDD(x)) ≡ ZERO BDD then ¬x is inner unit clause.

5

If any inner unit clause is universal, return UNSAT.

6

Create BDD b by conjoining BDDs for every inner unit clause.

7

return RestrictBy(f , b)

Must detect selectively, otherwise just Prime Implicates.

15 / 40

slide-16
SLIDE 16

BDD Constraint Propagation (Pure Literals) Example.

Simple Case: BDDs represent clauses. Existential variable: x1 is positively pure. ∃x1∃x2(

BDD 1

  • (x1 ∨ ¬x2) ∧

BDD 2

  • x2 )

≡ ∃x2(

BDD 1

  • (x2) )

Universal variable: x2 is positively pure. ∃x1∀x2∃x3(

BDD 1

  • (¬x1 ∨ x2 ∨ x3) ∧

BDD 2

  • (¬x3 ∨ x2 ∨ x1))

≡ ∃x1∃x3(

BDD 1

  • (¬x1 ∨ x3) ∧

BDD 2

  • (¬x3 ∨ x1))

16 / 40

slide-17
SLIDE 17

BDD Constraint Propagation (Pure Literals).

Pure Literal Propagation : Literal appears only positively (negatively) in formula. If universal literal, remove it from

  • formula. Otherwise, remove clauses containing it.

Simple case: Initially every BDD represents a clause of the CNF f . Algorithm eBDD-QBF Pure Literal Propagation :

1

For each BDD b of formula f

2

For each variable x in the support set of b

3

if RestrictBy(b, BDD(x)) ≡ ONE BDD, x is positive in b.

4

if RestrictBy(b, BDD(¬x)) ≡ ONE BDD, x is negative in b.

5

For each pure literal x in f

6

if x is universal, create BDD b′ := BDD(¬x), otherwise b′ := BDD(x).

7

Conjoin all BDDs b into a BDD c.

8

return RestrictBy(f , c)

Same Limitation as for Unit Prop.

17 / 40

slide-18
SLIDE 18

BDD Constraint Propagation (Pure Literals) Example.

Complex Case: BDDs may represent non-clausal formulas. Existential variable: x1 is positively pure. ∃x1∀x2∃x3((

BDD 1

  • (x1 ∧ ¬x3) ∨ (x1 ∧ x2)) ∧(

BDD 2

  • x3 ∨ ¬x2))

Note: ∀x1(BDD 1) ≡ (¬x3 ∨ x2) ≡ BDD 1[x1 := false] ≡ ∀x2∃x3(

BDD 2

  • x3 ∨ ¬x2)

Universal variable: x1 is positively pure. ∀x1∀x2∃x3((

BDD 1

  • (x1 ∧ ¬x3) ∨ (x1 ∧ x2)) ∧(

BDD 2

  • x3 ∨ ¬x2))

Polarity check the same as for existential case. ≡ UNSAT

18 / 40

slide-19
SLIDE 19

BDD Constraint Propagation (Pure Literals) (Cont.)

Complex case : Early quantification has been applied, so BDDs are not necessarily clauses. Polarity is not so easy for this case. Algorithm eBDD-QBF Unit Propagation : Modify previous algorithm by changing polarity detection procedure: x is positively pure in BDD b iff ∀x(b) ≡ RestrictBy(b, BDD(¬x)). Intuition: Quantification removes variable and setting positive to false removes variable too (analogous for negative case). Too expensive. Not used in mainstream experiments.

19 / 40

slide-20
SLIDE 20

Variable Ordering Heuristics.

Dynamic heuristics have been used in model checking. BDD-Based SAT and QBF solvers employ static heuristics. Reason: Bucket elimination with BDDs (a bucket being a set holding BDDs w/ the same top variable) relies on eliminating

  • nly top variables at each iteration, so the ordering must be

fixed. We have implemented the following heuristics:

1

Most occurring top variable.

2

Most occurring variable.

3

Least occurring top variable.

4

Least occurring variable.

5

Smallest BDD top variable.

6

Smallest BDD variable.

7

Bounded Most occurring variable with min.

20 / 40

slide-21
SLIDE 21

Main algorithm

Algorithm eBDD-QBF (qp q, CNF f ):

1 Create BDD for each clause in f . 2 Apply unit propagation iteratively to all BDDs. 3 Apply pure literal propagation iteratively to all BDDs. 4 while there are still variables to be eliminated do 5

if trivially Q − SAT or Q − UNSAT return result.

6

x := least occurring variable from innermost quantifier.

7

b := Apply Enhanced Early Quantification with x.

8

Extract inner unit BDDs from b and apply unit propagation if possible.

9 return result. 21 / 40

slide-22
SLIDE 22

Experiments.

Solver implemented in C++ and BDD package CUDD. Experiments were run on Intel Dual Core 2.13GHz Unix desktop with 4 GB of RAM. Compared eBDD-QBF with other solvers that best on the verification and A.I. domains such as QuBE7.1, Semprop and DepQBF. They also dominated previous BDD-based solvers.

  • Prelim. experiments to select dynamic heuristics (least
  • ccurring var was best).

30 minute timeout per instance. Equivalence Checking (Ayari), Theorem Proving (Pan) and Conformant Planning (Rintanen) benchmarks.

22 / 40

slide-23
SLIDE 23

Experiments.

Solv.

  • Inst. Solv.
  • Tot. Time
  • Num. Vars.
  • Num. Cls’

eBDD-QBF 30(*) 246.75s 10-3290 18-19663 QuBE7.1 27 506.211s 10-2035 18-178750 Semprop 32 75.092s 10-3290 18-178750 DepQBF 23 1984.76s 10-2501 18-178750 Experimental results for Conformant Planning instances *: Solves about 3 or 4 more instances with inner pure literal propagation.

23 / 40

slide-24
SLIDE 24

Experiments.

Solv.

  • Inst. Solv.
  • Tot. Time
  • Num. Vars.
  • Num. Cls’

eBDD-QBF 27 3257.83s 332-5833 127-6084 QuBE7.1 19 304.214s 332-252710 127-334058 Semprop 20 361.614 s 332-57143 127-74975 DepQBF 20 61.107s 332-4558 5-73065 Experimental results for Equivalence Checking instances

24 / 40

slide-25
SLIDE 25

Experiments.

Solv.

  • Inst. Solv.
  • Tot. Time
  • Num. Vars.
  • Num. Cls’

eBDD-QBF 269 6283.38s 4-3004 5-131072 QuBE7.1 140 8148.41s 4-11130 5-355294 Semprop 242 10129.9s 4-5320 5-131072 DepQBF 140 12087.7s 4-4558 5-73065 Experimental results for Modal Logic instances

25 / 40

slide-26
SLIDE 26

Conclusions

Pure BDD-based QBF solver competitive w/ other efficient decision procedures. Generalized unit and pure literal rules for BDDs was crucial. Dynamic variable selection useful with enhanced early quantification.

26 / 40

slide-27
SLIDE 27

Future Work

Work still required in identifying structure of suitable formulas for BDDs, beyond empirical analysis. Combination with a top-down algorithm would allow more flexible variable selection. More robust BDD constraint propagation (a la Cadoli) is required to produce a competitive solver w.r.t. hybrid solvers such as AIGSOLVE and AQME.

27 / 40

slide-28
SLIDE 28

Questions?

28 / 40

slide-29
SLIDE 29

References

Aloul, F.A., Markov, I.L., Sakallah, K.A.: Faster SAT and Smaller BDDs via Common Function Structure. In: Technical Report #CSE-TR-445-01. University

  • f Michigan (2001)

Audemard, G., Sas, L.: SAT Based BDD Solver for Quantified Boolean

  • Formulas. In: 16th IEEE International Conference on Tools with Artificial

Intelligence (ICTAI), pp. 82–89. IEEE Computer Society (2004) Ayari, A. , Basin, D.: Bounded Model Construction for Monadic Second-Order

  • Logics. In: 12th International Conference on Computer-Aided Verification (CAV),
  • pp. 99–113. Springer-Verlag (2000)

Benedetti, M.: Evaluating QBFs via Symbolic Skolemization. In: Proc. of 11th International Conference on Logic for Programming Artificial Intelligence and Reasoning (LPAR), LNCS 3452 Springer-Verlag (2005) Biere, A., Cimatti, A., Clarke, E., Strichman, O., Zhu, Y.:Bounded model

  • checking. J. Adv. Comp. Sci. 58, (2003)

Bryant, R.E.: Graph-Based Algorithms for Boolean Function Manipulation. IEEE

  • Trans. on Comp. 35, 677–691 (1986)

Burch, J. R., Clarke, E.M., Mcmillan,K. L., Dill, D. L.,Hwang, L. J.:Symbolic Model Checking: 10 20 States and Beyond. In: Fifth Annual IEEE Symposium

  • n Logic in Computer Science, pp. 428–439. IEEE Comput. Soc. Press (1990)

Chatalic, P., Simon, L.: Zres:The old Davis-Putnam procedure meets ZBDDs. In: 17th International Conference on Automated Deduction (CADE), pp.

29 / 40

slide-30
SLIDE 30

Appendix

30 / 40

slide-31
SLIDE 31

BDD Constraint Propagation (Formal Presentation)

Definition 1 (Unit Clause): Let f = C1 ∧ C2 ∧ .... ∧ Ci−1 ∧ Ci ∧ Ci+1 ∧ ... ∧ Ck be a CNF formula and Ci = xj, where xj is a literal . Ci a unit clause of f . . Definition 2 (Generalized Unit Clause): Let f be a boolean formula . If ∃ CNF f ′ = C1 ∧ C2 ∧ .... ∧ Ci−1 ∧ Ci ∧ Ci+1 ∧ ... ∧ Ck such that f ′ ≡ f and Ci = xj, where xj is a literal, then Ci is a generalized unit clause of f . . Theorem 1: Let Ci be a clause and Cj = xl be a unit clause (xl is an existential literal). Then RestrictBy(BDD(Ci), BDD(Cj)) = BDD(Ci[xl := true]). . Corollary 1: Let f = C1 ∧ C2 ∧ ... ∧ Ck be a CNF and Cj = xl be a unit clause (where xl is a unit literal). Then RestrictBy(BDD(f ), BDD(Cj)) = BDD(f [xl := true]). .

31 / 40

slide-32
SLIDE 32

BDD Constraint Propagation.

Corollary 2: Let f be a non-triviall propositional formula and Cj = xl be a generalized unit clause of f (where xl is an existential literal). Then RestrictBy(BDD(f ), BDD(Cj)) = BDD(f [xl := true]).. Theorem 2: Let f be a non-trivial propositional formula, xj a literal and f ′ an equivalent CNF representation of f obtained by applying distributivity of ∧ and ∨ and removing trivial

  • clauses. Then xj is a generalized unit clause in f iff xj is a

unit clause in f ′. . Theorem 3: Let f be a non-trivial propositional formula and xj a literal. Then xj is a generalized unit clause in f iff f [xj := false] = false. . Corollary 3: Let f be a non-trivial propositional formula and xl a literal. Then Cj = xl is a generalized unit clause in f iff RestrictBy(BDD(f ), BDD(¬Cj)) = ZERO BDD. .

32 / 40

slide-33
SLIDE 33

BDD Constraint Propagation.

Lemma 1: Let f be a non-trivial propositional formula, and xi, xj two literals. Then RestrictBy(BDD(f ), BDD(xi) ∧ BDD(xj)) = RestrictBy(RestrictBy(BDD(f ), BDD(xi)), BDD(xj)). Theorem 4: Let f be a non-trivial propositional formula and Ci1, ..., Cim be unit clauses of existential literals. Then g(f , {Ci1, ..., Cim}) = RestrictBy(f , Ci1 ∧ .... ∧ Cim), where g(f , l) = g(RestrictBy(f , Ci1), {Ci2, ..., Cim}) if l = {Ci1, .., Cim} and f if l = ∅. Unit propagation is trivial for clause BDDs: extract BDDs with support set size one and apply unit propagation Limitation: Fails to recognize inner unit clauses for non-clause intermediate formulas. Need unit clause extraction algorithm to detect generalized unit clauses.

33 / 40

slide-34
SLIDE 34

BDD Constraint Propagation.

Definition 3 (Pure Literal): Let f = C1 ∧ C2 ∧ ... ∧ Ck be a CNF form. and xj a literal, where xj only appears positively (negatively) in f . We call xj a positive (negative) pure literal

  • f f .

Definition 4 (Generalized Pure Literal): Let f be a boolean formula. If ∃ CNF f ′ = C1 ∧ C2 ∧ .... ∧ Ck such that f ′ ≡ f and xj occurs only positively (negatively) in f ′, where xj is a literal, then xj is a generalized positive (negative) pure literal of f . Theorem 5: Let f be a non-trivial propositional formula, xj a literal and f ′ an equivalent CNF representation of f obtained by applying distributivity of ∧ and ∨ and removing trivial

  • clauses. Then xj is a generalized positive (negative) pure

literal in f iff xj is a positive (negative) pure literal in f ′. Theorem 6: Let f be a non-trivial formula and xj a literal. xj is a generalized positive (negative) pure literal in f iff f [xj := false] = ∀xj(f ) (f [xj := true] = ∀xj(f )).

34 / 40

slide-35
SLIDE 35

BDD Constraint Propagation.

Corollary 4: Let f be a non-trivial formula and xj a literal. xj is positively (negatively) pure in BDD(f ) iff RestrictBy(BDD(f ), BDD(¬(xj))) = ∀xj(BDD(f )) (RestrictBy(BDD(f ), BDD(xj)) = ∀xj(BDD(f )). .

35 / 40

slide-36
SLIDE 36

BDD Constraint Propagation.

algorithm UnitBDDExtraction(BDD b, Quantifier Prefix qp): Set of BDD S := {} for each variable v in the support set of b do if RestrictBy(b,Not(bdd(v))) = Zero BDD then if(isUniversal(v,qp)) then return {Zero BDD} else S := S ∪ {bdd(b)} else if RestrictBy(b,bdd(v)) = Zero BDD then if(isUniversal(v,qp)) then return {Zero BDD} else S := S ∪ {Not(bdd(b))} return S Algorithm for unit BDD extraction

36 / 40

slide-37
SLIDE 37

BDD Constraint Propagation.

algorithm PolarityVectorClauseBDDs(bdds, numVars): Vector of Int v for i = 1 to numVars do v[i] := −2 for each BDD b in bdds do for each variable v in the support set of b do if RestrictBy(b,bdd(v)) = One BDD then updatePolarity(polarity,v,1) else if RestrictBy(b,not(bdd(v)))=One BDD then updatePolarity(polarity,v,0) return polarity Algorithm for calculating the polarity vector from a set of clause BDDs

37 / 40

slide-38
SLIDE 38

BDD Constraint Propagation.

algorithm PureLiteralClauseBDDs(bdds, numVars, qp): boolean pure var := true while pure var do polarity := PolarityVectorClauseBDDs(bdds, numVars) BDD polarityBDD := One BDD pure var := false for each variable v in polarity do if polarity[v] = −2 ∧ polarity[v] = −1 then pure var := true if isUniversal(v,qp) then polarityBDD := polarityBDD∧ (polarity[v] = 1?not(bdd(v)) : bdd(v)) else polarityBDD := (polarity[v] = 1?bdd(v) : not(bdd(v))) for each BDD b in bdds do RestrictBy(b,polarityBDD) return bdds Algorithm for applying the pure literal rule for clause BDDs

38 / 40

slide-39
SLIDE 39

BDD Constraint Propagation.

algorithm PolarityVectorNonClauseBDDsPureLiteral (bdds,numVars): Vector of Int v for i = 1 to numVars do v[i] := −2 for each BDD b in bdds do for each variable v in the support set of b do if RestrictBy(b,bdd(v)) = One BDD then updatePolarity(polarity,v,1) else if RestrictBy(b,not(bdd(v))) = One BDD then updatePolarity(polarity,v,0) else if ∀v.b. ≡ RestrictBy(b,not(bdd(v))) then updatePolarity(polarity,v,1) else if ∀v.b. ≡ RestrictBy(b,bdd(v)) then updatePolarity(polarity,v,0) else updatePolarity(polarity,v,¬polarity[v]) return polarity

39 / 40

slide-40
SLIDE 40

Main Algorithm.

algorithm BDD-QBF(CNF F, qp, numVars, heuristic): Set of BDD bdds := createBDDForEachClause(F) bdds := ClauseBDDUnitPropagation(bdds,qp) bdds := PureLiteralClauseBDDsPureLiteral(bdds,numVars,qp) while qp = {} do if bdds = {} then return QSAT if Zero BDD ∈ bdds then return Q-UNSAT Quantifier q := innermostQuantifier(qp) qp := qp − {q} while variableSet(q) = {} do if bdds = {} then return QSAT if Zero BDD ∈ bdds then return Q-UNSAT int var := chooseVariable(bdds,variableSet(q),heuristic) variableSet(q) := variableSet(q) −{var} Set of BDD occ bdds :=chooseBDDsWithVariable(bdds,va bdds := bdds − occ bdds if isUniversal(var,qp) then

40 / 40