úÎ5//“Q      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP Safe_QRSTUVQWSafe¹XYZ[\XYNone<KLNN #assumes total ordering on variables†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 possible!%all variables that occur in the nodes"list of all paths#$list of all models (a.k.a. minterms) !"#$%&!"# $%&]^_`ab Nonep"#"#NoneH*Variable with given parity)*+)*+None<OV X-ŒFIXME: this function is nonsensical. There is only one interesting unary Boolean function (negation), and it should be handled differently./remove variables existentially0remove variable existentially3replace variable by value  ,-./0123#  ,-.30/21cdeNone(H6 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.7same as display, but does not show the False! node and the edges pointing to False.8la textual representation of the BDD that is suitable as input to the "dot" program from the graphviz suite.8suppress pointers to False6789:;<6789:;< None(¸/   !"#)*+,-./01236789:;<None-8=ásolve the constrained linear optimisation problem: returns an assignment that is a model of the BDD and maximises the sum of weights of variables. Keys missing from the weight map, but present in the BDD, get weight zero.==None<N.üIO. Coudert , J. C. Madre: ?http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.3330>A@?BCDEFGHIJKLMBCD>?@AEFGHIJKLM>?@Af                 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab]cc^`b defghijkl!obdd-0.8.2-LarJBqohf5KGYLsfcFrPihOBDD.Operation OBDD.Data OBDD.Make OBDD.Display OBDD.Linopt OBDD.CubeOBDD.IntIntMapOBDD.VarIntIntMap OBDD.PropertyOBDD#ersatz-0.4.2-JlSZRMtlWjHHdVzD6yVTfm Ersatz.Bitchoosexoranyallnornandorandnot==>||&&falsetrueboolBooleanNodeLeafBranchtopassocsfoldfoldM full_fold full_foldMsizenumber_of_modelsnot_access satisfiablenull some_model variablespathsmodelsmakeregisterchecked_register$fEqNode $fOrdNodeconstantunitvariableequivunarybinary exists_manyexists forall_manyforall instantiate $fBooleanOBDD$fShowSymmetricitydisplaydisplay'toDotfreshmkLabelunquotetextlinoptCheckSignOccursOriginalCubeprimesnicesignoccursoriginalprocessprimednfcnfgreedclause $fEqCheck $fOrdCheck $fShowCheck IntIntMapempty singletonlookup!insert VarIntIntMapcoreicoreifalseitruenext Symmetricity Asymmetric Symmetric