1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
------------------------------------------------------------------------------ --- Library with operations to encapsulate search, i.e., non-deterministic --- computations. Note that these operations are not fully declarative, --- i.e., the results depend on the order of evaluation and program rules. --- This is due to the fact that the search operators work on a copy --- of the current expression to be encapsulated. --- The potential problems of this method are discussed in this paper: --- --- > B. Brassel, M. Hanus, F. Huch: --- > Encapsulating Non-Determinism in Functional Logic Computations --- > Journal of Functional and Logic Programming, No. 6, EAPLS, 2004 --- --- There are newer and better approaches the encapsulate search, --- in particular, set functions (see module `Control.Search.SetFunctions` --- which should be used. --- --- @author Michael Hanus --- @version October 2023 ------------------------------------------------------------------------------ {-# LANGUAGE CPP #-} module Control.Search.Unsafe ( allValues, someValue, oneValue, isFail , rewriteAll, rewriteSome ) where ------------------------------------------------------------------------------ --- Returns all values of an expression. --- Conceptually, the value is computed on a copy of the expression, --- i.e., the evaluation of the expression does not share any results. --- In PAKCS, the evaluation suspends as long as the expression --- contains unbound variables or the computed --- value contains unbound variables. --- --- Note that this operation is not purely declarative since the ordering --- of the computed values depends on the ordering of the program rules. allValues :: a -> [a] allValues external --- Returns just one value for an expression. --- If the expression has no value, `Nothing` is returned. --- Conceptually, the value is computed on a copy of the expression, --- i.e., the evaluation of the expression does not share any results. --- In PAKCS, the evaluation suspends as long as the expression --- contains unbound variables or the computed --- value contains unbound variables. --- --- Note that this operation is not purely declarative since --- the computed value depends on the ordering of the program rules. --- Thus, this operation should be used only if the expression --- has a single value. oneValue :: a -> Maybe a oneValue external --- Returns some value for an expression. --- If the expression has no value, the computation fails. --- Conceptually, the value is computed on a copy of the expression, --- i.e., the evaluation of the expression does not share any results. --- In PAKCS, the evaluation suspends as long as the expression --- contains unbound variables or the computed --- value contains unbound variables. --- --- Note that this operation is not purely declarative since --- the computed value depends on the ordering of the program rules. --- Thus, this operation should be used only if the expression --- has a single value. someValue :: a -> a someValue x = case oneValue x of Just v -> v Nothing -> failed --- Does the computation of the argument to a value fail? --- Conceptually, the argument is evaluated on a copy, i.e., --- even if the computation does not fail, it has not been evaluated. isFail :: a -> Bool isFail x = case oneValue x of Nothing -> True Just _ -> False ------------------------------------------------------------------------------ --- Gets all values computable by term rewriting. --- In contrast to `allValues`, this operation does not wait --- until all "outside" variables are bound to values, --- but it returns all values computable by term rewriting --- and ignores all computations that requires bindings for outside variables. rewriteAll :: a -> [a] rewriteAll external --- Similarly to 'rewriteAll' but returns only some value computable --- by term rewriting. Returns `Nothing` if there is no such value. rewriteSome :: a -> Maybe a rewriteSome external ------------------------------------------------------------------------------ |