|Part of a series of articles about|
In mathematics, a continuous function is a function for which sufficiently small changes in the input result in arbitrarily small changes in the output. Otherwise, a function is said to be a discontinuous function. A continuous function with a continuous inverse function is called a homeomorphism.
Continuity of functions is one of the core concepts of topology, which is treated in full generality below. The introductory portion of this article focuses on the special case where the inputs and outputs of functions are real numbers. A stronger form of continuity is uniform continuity. In addition, this article discusses the definition for the more general case of functions between two metric spaces. In order theory, especially in domain theory, one considers a notion of continuity known as Scott continuity. Other forms of continuity do exist but they are not discussed in this article.
As an example, consider the function h(t), which describes the height of a growing flower at time t. This function is continuous. By contrast, if M(t) denotes the amount of money in a bank account at time t, then the function jumps at each point in time when money is deposited or withdrawn, so the function M(t) is discontinuous.
- 1 History
- 2 Real-valued continuous functions
- 2.1 Definition
- 2.1.1 Definition in terms of limits of functions
- 2.1.2 Definition in terms of neighborhoods
- 2.1.3 Definition in terms of limits of sequences
- 2.1.4 Weierstrass and Jordan definitions (epsilon–delta) of continuous functions
- 2.1.5 Definition in terms of control of the remainder
- 2.1.6 Definition using oscillation
- 2.1.7 Definition using the hyperreals
- 2.2 Construction of continuous functions
- 2.3 Examples of discontinuous functions
- 2.4 Properties
- 2.5 Directional and semi-continuity
- 2.1 Definition
- 3 Continuous functions between metric spaces
- 4 Continuous functions between topological spaces
- 5 Related notions
- 6 See also
- 7 Notes
- 8 References
A form of the epsilon–delta definition of continuity was first given by Bernard Bolzano in 1817. Augustin-Louis Cauchy defined continuity of as follows: an infinitely small increment of the independent variable x always produces an infinitely small change of the dependent variable y (see e.g., Cours d'Analyse, p. 34). Cauchy defined infinitely small quantities in terms of variable quantities, and his definition of continuity closely parallels the infinitesimal definition used today (see microcontinuity). The formal definition and the distinction between pointwise continuity and uniform continuity were first given by Bolzano in the 1830s but the work wasn't published until the 1930s. Like Bolzano, Karl Weierstrass denied continuity of a function at a point c unless it was defined at and on both sides of c, but Édouard Goursat allowed the function to be defined only at and on one side of c, and Camille Jordan allowed it even if the function was defined only at c. All three of those nonequivalent definitions of pointwise continuity are still in use. Eduard Heine provided the first published definition of uniform continuity in 1872, but based these ideas on lectures given by Peter Gustav Lejeune Dirichlet in 1854.
Real-valued continuous functions
A function from the set of real numbers to the real numbers can be represented by a graph in the Cartesian plane; such a function is continuous if, roughly speaking, the graph is a single unbroken curve whose domain is the entire real line. A more mathematically rigorous definition is given below.
A rigorous definition of continuity of real valued function of a real variable is usually given in a first course in calculus in terms of the idea of a limit. First, a function f with variable x is said to be continuous at the point c on the real line, if the limit of f(x), as x approaches that point c, is equal to the value f(c); and second, the function (as a whole) is said to be continuous, if it is continuous at every point. A function is said to be discontinuous (or to have a discontinuity) at some point when it is not continuous there. These points themselves are also addressed as discontinuities.
There are several different definitions of continuity of a function. Sometimes a function is said to be continuous if it is continuous at every point in its domain. In this case, the function f(x) = tan(x), with the domain of all real x ≠ (2n+1)π/2, n any integer, is continuous. Sometimes an exception is made for boundaries of the domain. For example, the graph of the function f(x) = √, with the domain of all non-negative reals, has a left-hand endpoint. In this case only the limit from the right is required to equal the value of the function. Under this definition f is continuous at the boundary x = 0 and so for all non-negative arguments. The most common and restrictive definition is that a function is continuous if it is continuous at all real numbers. In this case, the previous two examples are not continuous, but every polynomial function is continuous, as are the sine, cosine, and exponential functions. Care should be exercised in using the word continuous, so that it is clear from the context which meaning of the word is intended.
Using mathematical notation, there are several ways to define continuous functions in each of the three senses mentioned above.
- be a function defined on a subset of the set of real numbers.
This subset is the domain of f. Some possible choices include
- ( is the whole set of real numbers), or, for a and b real numbers,
- ( is a closed interval), or
- ( is an open interval).
In case of the domain being defined as an open interval, and are no boundaries in the above sense and the values of and do not matter for continuity on .
Definition in terms of limits of functions
The function f is continuous at some point c of its domain if the limit of f(x), as x approaches c through the domain of f, exists and is equal to f(c). In mathematical notation, this is written as
In detail this means three conditions: first, f has to be defined at c. Second, the limit on the left hand side of that equation has to exist. Third, the value of this limit must equal f(c).
(We have here assumed that the domain of f does not have any isolated points. For example, an interval or union of intervals has no isolated points.)
Definition in terms of neighborhoods
A neighborhood of a point c is a set that contains all points of the domain within some fixed distance of c. Intuitively, a function is continuous at a point c if the range of the restriction of f to a neighborhood of c shrinks to a single point f(c) as the width of the neighborhood around c shrinks to zero. More precisely, a function f is continuous at a point c of its domain if, for any neighborhood there is a neighborhood such that whenever .
This definition only requires that the domain and the codomain are topological spaces and is thus the most general definition. It follows from this definition that a function f is automatically continuous at every isolated point of its domain. As a specific example, every real valued function on the set of integers is continuous.
Definition in terms of limits of sequences
Weierstrass and Jordan definitions (epsilon–delta) of continuous functions
Explicitly including the definition of the limit of a function, we obtain a self-contained definition: Given a function f : D → R as above and an element x0 of the domain D, f is said to be continuous at the point x0 when the following holds: For any number ε > 0, however small, there exists some number δ > 0 such that for all x in the domain of f with x0 − δ < x < x0 + δ, the value of f(x) satisfies
Alternatively written, continuity of f : D → R at x0 ∈ D means that for every ε > 0 there exists a δ > 0 such that for all x ∈ D :
More intuitively, we can say that if we want to get all the f(x) values to stay in some small neighborhood around f(x0), we simply need to choose a small enough neighborhood for the x values around x0. If we can do that no matter how small the f(x) neighborhood is, then f is continuous at x0.
Weierstrass had required that the interval x0 − δ < x < x0 + δ be entirely within the domain D, but Jordan removed that restriction.
Definition in terms of control of the remainder
In proofs and numerical analysis we often need to know how fast limits are converging, or in other words, control of the remainder. We can formalise this to a definition of continuity. A function is called a control function if
- C is non decreasing
A function f : D → R is C-continuous at x0 if
- for all
A function is continuous in x0 if it is C-continuous for some control function C.
This approach leads naturally to refining the notion of continuity by restricting the set of admissible control functions. For a given set of control functions a function is -continuous if it is -continuous for some . For example the Lipschitz and Hölder continuous functions of exponent α below are defined by the set of control functions
Definition using oscillation
Continuity can also be defined in terms of oscillation: a function f is continuous at a point x0 if and only if its oscillation at that point is zero; in symbols, A benefit of this definition is that it quantifies discontinuity: the oscillation gives how much the function is discontinuous at a point.
This definition is useful in descriptive set theory to study the set of discontinuities and continuous points – the continuous points are the intersection of the sets where the oscillation is less than ε (hence a Gδ set) – and gives a very quick proof of one direction of the Lebesgue integrability condition.
The oscillation is equivalent to the ε-δ definition by a simple re-arrangement, and by using a limit (lim sup, lim inf) to define oscillation: if (at a given point) for a given ε0 there is no δ that satisfies the ε-δ definition, then the oscillation is at least ε0, and conversely if for every ε there is a desired δ, the oscillation is 0. The oscillation definition can be naturally generalized to maps from a topological space to a metric space.
Definition using the hyperreals
Cauchy defined continuity of a function in the following intuitive terms: an infinitesimal change in the independent variable corresponds to an infinitesimal change of the dependent variable (see Cours d'analyse, page 34). Non-standard analysis is a way of making this mathematically rigorous. The real line is augmented by the addition of infinite and infinitesimal numbers to form the hyperreal numbers. In nonstandard analysis, continuity can be defined as follows.
- A real-valued function f is continuous at x if its natural extension to the hyperreals has the property that for all infinitesimal dx, f(x+dx) − f(x) is infinitesimal
(see microcontinuity). In other words, an infinitesimal increment of the independent variable always produces to an infinitesimal change of the dependent variable, giving a modern expression to Augustin-Louis Cauchy's definition of continuity.
Construction of continuous functions
Checking the continuity of a given function can be simplified by checking one of the above defining properties for the building blocks of the given function. It is straightforward to show that the sum of two functions, continuous on some domain, is also continuous on this domain. Given
then the sum of continuous functions
- , defined by for all
is continuous in .
The same holds for the product of continuous functions.
- , defined by for all ,
is continuous in .
- f(x) = x3 + x2 - 5x + 3
In the same way it can be shown that the reciprocal of a continuous function
- , defined by for all such that ,
is continuous in .
This implies that, excluding the roots of , the quotient of continuous functions
- , defined by for all , such that ,
is also continuous on .
For example, the function (pictured)
is defined for all real numbers x ≠ −2 and is continuous at every such point. Thus it is a continuous function. The question of continuity at x = −2 does not arise, since x = −2 is not in the domain of y. There is no continuous function F: R → R that agrees with y(x) for all x ≠ −2.
Since the sine-function is continuous on all reals, the sinc function G(x) = sin x/x, when defined for all real x ≠ 0, is continuous at these points. Thus G is a continuous function there, too. However, unlike the previous example, G can be extended to a continuous function on all real numbers, by defining the value G(0) to be the limit of G(x), when x approaches 0, i.e.,
the sinc-function becomes a continuous function on all real numbers. The term removable singularity is used in such cases, when (re)defining values of a function to coincide with the appropriate limits make a function continuous at specific points.
A more involved construction of continuous functions is the function composition. Given two continuous functions
their composition being denoted as
- , and defined by is continuous.
This construction allows to state, for example, that
- is continuous for all
Examples of discontinuous functions
An example of a discontinuous function is the Heaviside step function , defined by
Pick for instance . Then there is no -neighborhood around , i.e. no open interval with that will force all the values to be within the -neighborhood of , i.e. within . Intuitively we can think of this type of discontinuity as a sudden jump in function values.
Similarly, the signum or sign function
is discontinuous at but continuous everywhere else. Yet another example: the function
is continuous everywhere apart from .
is nowhere continuous.
Intermediate value theorem
- If the real-valued function f is continuous on the closed interval [a, b] and k is some number between f(a) and f(b), then there is some number c in [a, b] such that f(c) = k.
For example, if a child grows from 1 m to 1.5 m between the ages of two and six years, then, at some time between two and six years of age, the child's height must have been 1.25 m.
Extreme value theorem
The extreme value theorem states that if a function f is defined on a closed interval [a,b] (or any closed and bounded set) and is continuous there, then the function attains its maximum, i.e. there exists c ∈ [a,b] with f(c) ≥ f(x) for all x ∈ [a,b]. The same is true of the minimum of f. These statements are not, in general, true if the function is defined on an open interval (a,b) (or any set that is not both closed and bounded), as, for example, the continuous function f(x) = 1/x, defined on the open interval (0,1), does not attain a maximum, being unbounded above.
Relation to differentiability and integrability
Every differentiable function
is everywhere continuous. However, it is not differentiable at x = 0 (but is so everywhere else). Weierstrass's function is also everywhere continuous but nowhere differentiable.
The derivative f′(x) of a differentiable function f(x) need not be continuous. If f′(x) is continuous, f(x) is said to be continuously differentiable. The set of such functions is denoted C1((a, b)). More generally, the set of functions
(from an open interval (or open subset of R) Ω to the reals) such that f is n times differentiable and such that the n-th derivative of f is continuous is denoted Cn(Ω). See differentiability class. In the field of computer graphics, these three levels are sometimes called G0 (continuity of position), G1 (continuity of tangency), and G2 (continuity of curvature).
Every continuous function
Pointwise and uniform limits
Given a sequence
of functions such that the limit
exists for all x in D, the resulting function f(x) is referred to as the pointwise limit of the sequence of functions (fn)n∈N. The pointwise limit function need not be continuous, even if all functions fn are continuous, as the animation at the right shows. However, f is continuous when the sequence converges uniformly, by the uniform convergence theorem. This theorem can be used to show that the exponential functions, logarithms, square root function, trigonometric functions are continuous.
Directional and semi-continuity
Discontinuous functions may be discontinuous in a restricted way, giving rise to the concept of directional continuity (or right and left continuous functions) and semi-continuity. Roughly speaking, a function is right-continuous if no jump occurs when the limit point is approached from the right. Formally, f is said to be right-continuous at the point c if the following holds: For any number ε > 0 however small, there exists some number δ > 0 such that for all x in the domain with c < x < c + δ, the value of f(x) will satisfy
This is the same condition as for continuous functions, except that it is required to hold for x strictly larger than c only. Requiring it instead for all x with c − δ < x < c yields the notion of left-continuous functions. A function is continuous if and only if it is both right-continuous and left-continuous.
A function f is lower semi-continuous if, roughly, any jumps that might occur only go down, but not up. That is, for any ε > 0, there exists some number δ > 0 such that for all x in the domain with |x − c| < δ, the value of f(x) satisfies
The reverse condition is upper semi-continuity.
Continuous functions between metric spaces
The concept of continuous real-valued functions can be generalized to functions between metric spaces. A metric space is a set X equipped with a function (called metric) dX, that can be thought of as a measurement of the distance of any two elements in X. Formally, the metric is a function
that satisfies a number of requirements, notably the triangle inequality. Given two metric spaces (X, dX) and (Y, dY) and a function
then f is continuous at the point c in X (with respect to the given metrics) if for any positive real number ε, there exists a positive real number δ such that all x in X satisfying dX(x, c) < δ will also satisfy dY(f(x), f(c)) < ε. As in the case of real functions above, this is equivalent to the condition that for every sequence (xn) in X with limit lim xn = c, we have lim f(xn) = f(c). The latter condition can be weakened as follows: f is continuous at the point c if and only if for every convergent sequence (xn) in X with limit c, the sequence (f(xn)) is a Cauchy sequence, and c is in the domain of f.
The set of points at which a function between metric spaces is continuous is a Gδ set – this follows from the ε-δ definition of continuity.
for all x in V.
Uniform, Hölder and Lipschitz continuity
The concept of continuity for functions between metric spaces can be strengthened in various ways by limiting the way δ depends on ε and c in the definition above. Intuitively, a function f as above is uniformly continuous if the δ does not depend on the point c. More precisely, it is required that for every real number ε > 0 there exists δ > 0 such that for every c, b ∈ X with dX(b, c) < δ, we have that dY(f(b), f(c)) < ε. Thus, any uniformly continuous function is continuous. The converse does not hold in general, but holds when the domain space X is compact. Uniformly continuous maps can be defined in the more general situation of uniform spaces.
A function is Hölder continuous with exponent α (a real number) if there is a constant K such that for all b and c in X, the inequality
holds. Any Hölder continuous function is uniformly continuous. The particular case α = 1 is referred to as Lipschitz continuity. That is, a function is Lipschitz continuous if there is a constant K such that the inequality
Continuous functions between topological spaces
Another, more abstract, notion of continuity is continuity of functions between topological spaces in which there generally is no formal notion of distance, as there is in the case of metric spaces. A topological space is a set X together with a topology on X, which is a set of subsets of X satisfying a few requirements with respect to their unions and intersections that generalize the properties of the open balls in metric spaces while still allowing to talk about the neighbourhoods of a given point. The elements of a topology are called open subsets of X (with respect to the topology).
between two topological spaces X and Y is continuous if for every open set V ⊆ Y, the inverse image
is an open subset of X. That is, f is a function between the sets X and Y (not on the elements of the topology TX), but the continuity of f depends on the topologies used on X and Y.
An extreme example: if a set X is given the discrete topology (in which every subset is open), all functions
to any topological space T are continuous. On the other hand, if X is equipped with the indiscrete topology (in which the only open subsets are the empty set and X) and the space T set is at least T0, then the only continuous functions are the constant functions. Conversely, any function whose range is indiscrete is continuous.
Continuity at a point
The translation in the language of neighborhoods of the (ε, δ)-definition of continuity leads to the following definition of the continuity at a point:
A function is continuous at a point if and only if for any neighborhood V of in Y, there is a neighborhood U of x such that f(U) ⊆ V.
This definition is equivalent to the same statement with neighborhoods restricted to open neighborhoods and can be restated in several ways by using preimages rather than images.
Also, as every set that contains a neighborhood is also a neighborhood, and is the largest subset U of X such that f(U) ⊆ V, this definition may be simplified into:
A function is continuous at a point if and only if is a neighborhood of x for every neighborhood V of in Y.
As an open set is a set that is a neighborhood of all its points, a function is continuous at every point of X if and only if it is a continuous function.
If X and Y are metric spaces, it is equivalent to consider the neighborhood system of open balls centered at x and f(x) instead of all neighborhoods. This gives back the above δ-ε definition of continuity in the context of metric spaces. In general topological spaces, there is no notion of nearness or distance. If however the target space is a Hausdorff space, it is still true that f is continuous at a if and only if the limit of f as x approaches a is f(a). At an isolated point, every function is continuous.
Several equivalent definitions for a topological structure exist and thus there are several equivalent ways to define a continuous function.
Sequences and nets 
In several contexts, the topology of a space is conveniently specified in terms of limit points. In many instances, this is accomplished by specifying when a point is the limit of a sequence, but for some spaces that are too large in some sense, one specifies also when a point is the limit of more general sets of points indexed by a directed set, known as nets. A function is (Heine-)continuous only if it takes limits of sequences to limits of sequences. In the former case, preservation of limits is also sufficient; in the latter, a function may preserve all limits of sequences yet still fail to be continuous, and preservation of nets is a necessary and sufficient condition.
In detail, a function f: X → Y is sequentially continuous if whenever a sequence (xn) in X converges to a limit x, the sequence (f(xn)) converges to f(x). Thus sequentially continuous functions "preserve sequential limits". Every continuous function is sequentially continuous. If X is a first-countable space and countable choice holds, then the converse also holds: any function preserving sequential limits is continuous. In particular, if X is a metric space, sequential continuity and continuity are equivalent. For non first-countable spaces, sequential continuity might be strictly weaker than continuity. (The spaces for which the two properties are equivalent are called sequential spaces.) This motivates the consideration of nets instead of sequences in general topological spaces. Continuous functions preserve limits of nets, and in fact this property characterizes continuous functions.
Closure operator definition
Instead of specifying the open subsets of a topological space, the topology can also be determined by a closure operator (denoted cl) which assigns to any subset A ⊆ X its closure, or an interior operator (denoted int), which assigns to any subset A of X its interior. In these terms, a function
between topological spaces is continuous in the sense above if and only if for all subsets A of X
That is to say, given any element x of X that is in the closure of any subset A, f(x) belongs to the closure of f(A). This is equivalent to the requirement that for all subsets A' of X'
is continuous if and only if
for any subset A' of Y.
If f: X → Y and g: Y → Z are continuous, then so is the composition g ∘ f: X → Z. If f: X → Y is continuous and
- X is compact, then f(X) is compact.
- X is connected, then f(X) is connected.
- X is path-connected, then f(X) is path-connected.
- X is Lindelöf, then f(X) is Lindelöf.
- X is separable, then f(X) is separable.
The possible topologies on a fixed set X are partially ordered: a topology τ1 is said to be coarser than another topology τ2 (notation: τ1 ⊆ τ2) if every open subset with respect to τ1 is also open with respect to τ2. Then, the identity map
- idX: (X, τ2) → (X, τ1)
is continuous if and only if τ1 ⊆ τ2 (see also comparison of topologies). More generally, a continuous function
Symmetric to the concept of a continuous map is an open map, for which images of open sets are open. In fact, if an open map f has an inverse function, that inverse is continuous, and if a continuous map g has an inverse, that inverse is open. Given a bijective function f between two topological spaces, the inverse function f−1 need not be continuous. A bijective continuous function with continuous inverse function is called a homeomorphism.
Defining topologies via continuous functions
Given a function
where X is a topological space and S is a set (without a specified topology), the final topology on S is defined by letting the open sets of S be those subsets A of S for which f−1(A) is open in X. If S has an existing topology, f is continuous with respect to this topology if and only if the existing topology is coarser than the final topology on S. Thus the final topology can be characterized as the finest topology on S that makes f continuous. If f is surjective, this topology is canonically identified with the quotient topology under the equivalence relation defined by f.
Dually, for a function f from a set S to a topological space, the initial topology on S has as open subsets A of S those subsets for which f(A) is open in X. If S has an existing topology, f is continuous with respect to this topology if and only if the existing topology is finer than the initial topology on S. Thus the initial topology can be characterized as the coarsest topology on S that makes f continuous. If f is injective, this topology is canonically identified with the subspace topology of S, viewed as a subset of X.
A topology on a set S is uniquely determined by the class of all continuous functions into all topological spaces X. Dually, a similar idea can be applied to maps
Various other mathematical domains use the concept of continuity in different, but related meanings. For example, in order theory, an order-preserving function f: X → Y between particular types of partially ordered sets X and Y is continuous if for each directed subset A of X, we have sup(f(A)) = f(sup(A)). Here sup is the supremum with respect to the orderings in X and Y, respectively. This notion of continuity is the same as topological continuity when the partially ordered sets are given the Scott topology.
for any small (i.e., indexed by a set I, as opposed to a class) diagram of objects in .
|Wikimedia Commons has media related to Continuity (functions).|
- Bolzano, Bernard (1817), Rein analytischer Beweis des Lehrsatzes dass zwischen je zwey Werthen, die ein entgegengesetztes Resultat gewaehren, wenigstens eine reele Wurzel der Gleichung liege, Prague: Haase
- Dugac, Pierre (1973), "Eléments d'Analyse de Karl Weierstrass", Archive for History of Exact Sciences, 10: 41–176, doi:10.1007/bf00343406
- Goursat, E. (1904), A course in mathematical analysis, Boston: Ginn, p. 2
- Jordan, M.C. (1893), Cours d'analyse de l'École polytechnique, 1 (2nd ed.), Paris: Gauthier-Villars, p. 46
- Harper, J.F. (2016), "Defining continuity of real functions of real variables", BSHM Bulletin: Journal of the British Society for the History of Mathematics: 1–16, doi:10.1080/17498430.2015.1116053
- Rusnock, P.; Kerr-Lawson, A. (2005), "Bolzano and uniform continuity", Historia Mathematica, 32 (3): 303–311, doi:10.1016/j.hm.2004.11.003
- Speck, Jared (2014). "Continuity and Discontinuity" (PDF). MIT Math. p. 3. Retrieved 2016-09-02.
Example 5. The function 1/x is continuous on (0, ∞) and on (−∞, 0), i.e., for x > 0 and for x < 0, in other words, at every point in its domain. However, it is not a continuous function since its domain is not an interval. It has a single point of discontinuity, namely x = 0, and it has an infinite discontinuity there.
- Lang, Serge (1997), Undergraduate analysis, Undergraduate Texts in Mathematics (2nd ed.), Berlin, New York: Springer-Verlag, ISBN 978-0-387-94841-6, section II.4
- Introduction to Real Analysis, updated April 2010, William F. Trench, Theorem 3.5.2, p. 172
- Introduction to Real Analysis, updated April 2010, William F. Trench, 3.5 "A More Advanced Look at the Existence of the Proper Riemann Integral", pp. 171–177
- "Elementary Calculus". wisc.edu.
- Gaal, Steven A. (2009), Point set topology, New York: Dover Publications, ISBN 978-0-486-47222-5, section IV.10
- Searcóid, Mícheál Ó (2006), Metric spaces, Springer undergraduate mathematics series, Berlin, New York: Springer-Verlag, ISBN 978-1-84628-369-7, section 9.4
- Goubault-Larrecq, Jean (2013). Non-Hausdorff Topology and Domain Theory: Selected Topics in Point-Set Topology. Cambridge University Press. ISBN 1107034132.
- Gierz, G.; Hofmann, K. H.; Keimel, K.; Lawson, J. D.; Mislove, M. W.; Scott, D. S. (2003). Continuous Lattices and Domains. Encyclopedia of Mathematics and its Applications. 93. Cambridge University Press. ISBN 0521803381.
- Flagg, R. C. (1997). "Quantales and continuity spaces". Algebra Universalis. CiteSeerX .
- Kopperman, R. (1988). "All topologies come from generalized metrics". American Mathematical Monthly. 95 (2): 89–97. doi:10.2307/2323060.
- Flagg, B.; Kopperman, R. (1997). "Continuity spaces: Reconciling domains and metric spaces". Theoretical Computer Science. 177 (1): 111–138. doi:10.1016/S0304-3975(97)00236-3.