datatype bbResult = CORRECT | PENDING | INCORRECT; datatype 'a bbSearch = BBEmpty | BBValue of 'a * (unit -> 'a bbSearch) * (unit -> 'a bbSearch); fun bbSolve bbPred BBEmpty = [] | bbSolve bbPred (BBValue(s, increment, extend)) = case bbPred s of CORRECT => s::(bbSolve bbPred (increment ())) | PENDING => bbSolve bbPred (extend ()) | INCORRECT => bbSolve bbPred (increment ()); fun bbProducer _ _ NONE = BBEmpty | bbProducer bbinc bbext (SOME s) = BBValue(s, fn () => bbProducer bbinc bbext (bbinc s), fn () => bbProducer bbinc bbext (bbext s));