úÎ/Ù+Î.      !"#$%&'()*+,-Safe./0123.0123./0123Safe456784567845678None:IJL #assumes total ordering on variables9Dinputs and output for binary op (unary will be simulated by binary)†Apply function in each node, bottom-up. return the value in the root node. Will cache intermediate results. You might think that >count_models = fold (b -> if b then 1 else 0) (v l r -> l + r)A but that's not true because a path might omit variables. Use  full_fold) to fold over interpolated nodes as well.iRun action in each node, bottum-up. return the value in the root node. Will cache intermediate results.¬Apply function in each node, bottom-up. Also apply to interpolated nodes: when a link from a node to a child skips some variables: for each skipped variable, we run the branchv function on an interpolated node that contains this missing variable, and identical children. With this function, number_of_models can be implemented as 'full_fold vars (bool 0 1) ( const (+) )&. And it actually is, see the source. ÿNumber of satisfying assignments with given set of variables. The set of variables must be given since the current OBDD may not contain all variables that were used to construct it, since some nodes may have been removed because they had identical children. does the OBDD have any models? "does the OBDD not have any models?&randomly select one model, if possibleHlist of all models (WARNING not using variables that had been deleted) Calls the dot executable (must be in $PATH{) to draw a diagram in an X11 window. Will block until this window is closed. Window can be closed gracefully by typing q when it has focus.btoDot outputs a string in format suitable for input to the "dot" program from the graphviz suite.":;<=9>?@A B CD   :;<=9>?@A B CDNoneVariable with given parityNoneMT&`FIXME this is a silly implementation. Negation should be done by switching values in Leaves (?))Aremove variables existentially TODO: needs better implementation*@remove variable existentially TODO: needs better implementation+replace variable by valueEFG !"#$%H&'(IJ)*+K !"#$%&'()*+&$% #!"'(+*)EFG !"#$%H&'(IJ)*+K32None   None   !"#$%&'()*+None-Ýsolve the constrained linear optimisation problem: returns an assignment that is a model of the BDD and maximises the sum of weights of variables. The set of keys of the weight map *must* be the full set of variables.L-MN--L-MNO      !"#$%&'()*+,-./01234566789:;;79:<=>?@ABC7DEFGHIJKLMNOP!obdd-0.6.1-BztOFFSpGCrL2xgDhCAiGY OBDD.Data OBDD.MakeOBDD.Operation OBDD.LinoptOBDD.IntIntMapOBDD.VarIntIntMap OBDD.PropertyOBDDNodeLeafBranchtopfoldfoldM full_fold full_foldMsizenumber_of_modelsaccess satisfiablenull some_model all_modelsmakecachedregisterchecked_registerdisplaytoDot$fEqNode $fOrdNodeconstantfalsetrueunitvariable&&||booliteequivxorimpliesandornotunarybinary exists_manyexists instantiate$fShowSymmetricitylinopt IntIntMapempty singletonlookupinsert VarIntIntMapcachecoreicorenextIndexunIndex icore_false icore_true select_onefresh Symmetricity Asymmetric Symmetric fold_by_sizesymmetric_binarybinary_compItemnoaddadd