Îõ³h$  ÍÒ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ  Safe-InferredzRSTUVW  Safe-Inferred§XYZ[\None?ÎÏÑ› obdd#assumes total ordering on variablesobdd†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)Á but that's not true because a path might omit variables. Use  full_fold) to fold over interpolated nodes as well.obddéRun action in each node, bottum-up. return the value in the root node. Will cache intermediate results.obdd¬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 branchö 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.obdd†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.obdddoes the OBDD have any models?obdd"does the OBDD not have any models? obdd&randomly select one model, if possible!obdd%all variables that occur in the nodes"obddlist of all paths#obdd$list of all models (a.k.a. minterms) !"#$%&!"# $%& Noneæ"#"#None4*obddVariable with given parity)*+)*+None?Ù h-obddŒFIXME: this function is nonsensical. There is only one interesting unary Boolean function (negation), and it should be handled differently./obddremove variables existentially0obddremove variable existentially3obddreplace variable by value  ,-./0123  ,-.30/21None ­6obdd 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.7obddsame as display, but does not show the False! node and the edges pointing to False.8obddìa textual representation of the BDD that is suitable as input to the "dot" program from the graphviz suite.8obddsuppress pointers to False6789:;<6789:;<None Ø/   !"#)*+,-./01236789:;<  !"#None >obddá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?Ñ ©JobddO. Coudert , J. C. Madre: ?http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.3330?BA@CDEFGHIJKLMNCDE?BA@FGHIJKLMNÝ                !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc d d _ a cå!obdd-0.8.4-8IhpGN0Cx4o4KDtOh8ciUjOBDD.Operation OBDD.Data OBDD.Make OBDD.DisplayOBDD OBDD.Linopt OBDD.CubeOBDD.IntIntMapOBDD.VarIntIntMap OBDD.Property$ersatz-0.4.10-45o7uZBuJr035gAdzFVy9S Ersatz.Bitchoosexoranyallnornandorandnot==>||&&falsetrueboolBooleanNodeLeafBranchtopassocsfoldfoldM full_fold full_foldMsizenumber_of_modelsnot_access satisfiablenull some_model variablespathsmodelsmakeregisterchecked_register$fEqNode $fOrdNodeconstantunitvariableequivunarybinary exists_manyexists forall_manyforall instantiate $fBooleanOBDD$fShowSymmetricitydisplaydisplay'toDotfreshmkLabelunquotetext$fEqOBDDlinoptCheckSignOccursOriginalCubeprimesnicesignoccursoriginalprocessprimednfcnfgreedclause $fEqCheck $fOrdCheck $fShowCheck IntIntMapempty singletonlookup!insert VarIntIntMap