Chapter 4

Time and the Database

What’s a temporal relation? What’s a temporal relvar? And what’s a temporal database? This chapter distinguishes between relational and nonrelational approaches to the temporal database issue. It discusses the fundamental notion of a timestamped proposition and the fundamental significance of the propositions on, since, and during. It also briefly explains the distinction between “valid time” and “transaction time.” Importantly, it introduces the fundamental notion of an interval as a finite sequence of points, and it discusses the related notion of granularity. Finally, it revisits The Closed World Assumption and stresses the need to be extremely careful in stating predicates when timestamps are involved.

Keywords

The Information Principle; temporal database; timestamped proposition; interval; granularity; valid time; transaction time

Eternity’s a terrible thought.

I mean, where’s it all going to end?

—Tom Stoppard:

Rosencrantz and Guildenstern Are Dead (1967)

We’re now ready to begin our investigation into what a temporal database might look like and how such a database might best be managed. We start by considering in broad terms just what it is—if anything—that distinguishes a temporal database from any other kind of database.

Temporal Databases

A temporal database can be thought of, loosely, as a database that contains historical data instead of or in addition to current data. Such databases have been under active investigation since at least the beginning of the 1980s—perhaps earlier. Some of those investigations have taken the extreme position that data in such a database, once inserted, should never be deleted or changed in any way, in which case the database can be thought of, again loosely, as containing historical data only. (Some data warehouses adopt this approach, at least to a first approximation.) Conventional databases, by contrast, are typically at the other extreme; a conventional database typically contains current data only, and data in such a database is changed or deleted as soon as the propositions represented by that data cease to be true. (Refer to Chapter 1, subsection titled “Relations and Their Meaning,” if you need to refresh your memory regarding the important idea that the data in a database can be thought of as a collection of true propositions.) In what follows, we’ll occasionally refer to such a database explicitly as nontemporal, in order to emphasize the fact that it contains current data only.1

The suppliers-and-shipments database of Chapters 1-3 is a nontemporal database in the foregoing sense. Consider Fig. 1.1 once again, which shows some sample values for that database. That figure shows among other things that the status of supplier S1 is currently 20. By contrast, a temporal version of that database might show not only that the status of that supplier is currently 20, but also that it has been 20 ever since July 1st last year, and perhaps that it was 15 from April 5th to June 30th last year, and so on. Thus, the propositions in a nontemporal database are generally thought of as referring to the current state of affairs (i.e., the state of affairs“now,” when the database is actually inspected). In fact, even if they’re thought of as referring to some time other than “now,” it makes no real difference to the way the data is managed and used. As we’ll see over the next few chapters, however, the way the data is managed and used in a temporal database differs in a variety of ways from the way it’s managed and used in a nontemporal one (a fact that accounts for the existence of this book, of course).

The distinguishing feature of a temporal database is, naturally, time itself. Temporal database research has therefore involved a certain amount of investigation into the nature of time as such. Here are some of the questions that have been explored:

■ Does time have a beginning or an end?

■ Is time is a continuum, or is it divided into discrete quanta?

■ How can we best characterize the important concept “now” (sometimes known as “the moving point now”)?

But these questions, interesting though they might be in themselves, aren’t intrinsically database questions as such, and we therefore won’t delve very deeply into them in this book. Instead, we’ll simply make what we hope are reasonable assumptions as we proceed. This approach allows us to concentrate on matters that are more directly relevant to our overall aim. However, we note that parts of that temporal research do possess certain interesting generalizations; that is, ideas developed originally or primarily to support temporal data in particular have been found to have application in other important areas as well. We’ll touch on this point again from time to time in subsequent chapters.

Out of all that research, the ideas we focus on in this book represent what we regard—naturally enough, since the ideas in question are due primarily to one of the present authors (Lorentzos)2—as the most satisfactory and most promising part. What do we mean by “most promising”? Well, it’s unfortunately the case that for a long time the research community was divided over how best to address the temporal database problem. (Indeed, in some respects it still is.) In a nutshell:

■ Some people proposed a very specialized approach to the problem, one that treats temporal data as special and involves some departure from relational principles (see below).

■ Others, the present writers included, favored an approach that most definitely does not depart from relational principles but treats temporal data as far as possible just like data of any other kind.

The departure in question—i.e., from relational principles—consists primarily in representing timestamps by means of “hidden attributes” instead of by conventional relational attributes in the usual way. (The attributes are hidden in the sense that they’re not directly visible to the user in the usual way and can’t be referenced by simple attribute names in the usual way.) We believe such a scheme is unwise. Indeed, it’s clear that “hidden attributes” aren’t true relational attributes, “relations” that contain such “attributes” aren’t true relations, and the overall approach constitutes a clear violation of Codd’s Information Principle. Some of the consequences of such violation are explained in detail in reference [29].

Aside: In case you might be unfamiliar with it, we digress for a moment to say a few words about The Information Principle. The principle was originally formulated by Codd—inventor of the relational model—in the following terms, more or less: The entire information content of the database at any given time is represented in one and only one way: namely, as explicit values in attribute positions in tuples in relations. Or perhaps more precisely: The database contains relvars, and nothing but relvars. In other words, relation variables are the only kind of variable permitted in a relational database; all other kinds, scalar variables or tuple variables or any other kind, are explicitly prohibited.

The essential simplicity of the relational model derives in large part from this principle. Indeed, Codd referred to it (the principle) on more than one occasion as the fundamental principle underlying the relational model. Certainly it’s true that any violation of it should be seen as a serious matter. An extended discussion of some of the consequences of such violation can be found in references [42] and [45], but what they boil down to is this: If the database contains N different kinds of variables, then N different sets of operators are needed for dealing with them. And if the database is relational, then N = 1, which is the minimum. End of aside.

Now, if (as we saw in Chapter 1) data in general can be regarded as an encoded representation of propositions, then temporal data in particular can be regarded as an encoded representation of timestamped propositions—by which we mean propositions that involve one or more values of some timestamp type. It follows that in a temporal database (under the extreme interpretation of that term, according to which all of the data is temporal), every proposition is timestamped in the foregoing sense. We might therefore define a temporal relation to be one in which each tuple contains at least one timestamp (i.e., the relation heading contains at least one attribute of some timestamp type); we might further define a temporal relvar to be one whose heading is that of some temporal relation; and we might finally define a temporal database to be one in which all of the relvars are temporal ones. Note: We’re being deliberately vague here as to what the timestamps we’re talking about might look like in actual practice. We’ll take up this issue in Chapters 5 and (especially) 6.

Having just offered a reasonably precise definition of a temporal database (in its extreme form), we now dismiss that definition as not very useful! We dismiss it because even if the relvars in the database are indeed all temporal ones, many relations that can be derived from that database won’t be temporal in the foregoing sense. For example, the answer to the query “Get the names of all employees we’ve ever hired” might be obtained from some temporal database, but the result would clearly not be a temporal relation as defined above. And it would be a strange DBMS indeed—certainly not a relational one—that would let us obtain query results that couldn’t themselves be kept in the database.

From this point forward, therefore, we take a temporal database to be one that does include some temporal data but isn’t necessarily limited to temporal data only. The chapters in this part of the book discuss such databases in detail. The plan for those chapters is as follows:

■ The remainder of the present chapter and Chapter 5 together set the scene for subsequent chapters. In particular, Chapter 5 shows why temporal data does seem to require special treatment, at least in certain respects.

■ Chapter 6 introduces intervals as a convenient basis for timestamping certain kinds of data (i.e., as a basis for defining what we’ve been referring to in the last few paragraphs as “timestamp types”).

■ Chapters 7 and 8 then discuss a variety of operators for dealing with such intervals and sets containing such intervals.

■ Finally, Chapters 9 and 10 introduce some important new operators for dealing with relations with interval valued attributes, and Chapter 11 considers some of the consequences of those operators for the conventional relational algebra.

By the way, it’s important to understand that—with just one exception, the interval type generator introduced in Chapter 6, along with its associated generic operators and generic constraints—all of the new constructs to be discussed in this part of the book (and the next part, too) are essentially just shorthand. That is, they can all be expressed—albeit only very longwindedly, in most cases—in terms of features already available in a relationally complete language such as Tutorial D. Thus, the approach to temporal databases that we advocate involves no changes to the classical relational model—though it does involve certain generalizations, as we’ll see in Chapter 11 and later chapters, and as already indicated it does also involve the introduction of a new type generator. With regard to this latter point, however, we note that the question as to which types and type generators are supported is essentially orthogonal to the question of support for the relational model itself. That is, the relational model merely requires that some types be made available, somehow, in order that relations might be defined over them; nowhere does it prescribe exactly what types have to be supported.3

Timestamped Propositions

We’re now in a position to begin our investigation into some of the issues surrounding temporal databases. We start by appealing to the way people typically express timestamped propositions in natural language. Here are three simple examples (labeled p1-p3 for purposes of subsequent reference):

p1: Supplier S1 was appointed—i.e., placed under contract—on July 1st, 2012.

p2: Supplier S1 has been under contract since July 1st, 2012.

p3: Supplier S1 was under contract during the interval from July 1st, 2012, to the present day.

Each of these three propositions represents a possible interpretation for a tuple—call it t—that looks like this (as you can see, that tuple has two attributes, SNO and FROM, with values the supplier number S1 and the timestamp July 1st, 2012, respectively):

image

Any of the three interpretations might be appropriate if tuple t appeared in some relation in some database that represented the state of affairs in some enterprise. The boldface prepositions on, since, and during characterize the three interpretations.

Now, although we’ve said there are three possible interpretations, it could be argued that they all say the same thing, albeit in slightly different ways. Indeed, we do take propositions p2 and p3 to be equivalent, but not p1. For consider:

■ p1 clearly implies that supplier S1 was not under contract on the date (June 30th, 2012) immediately preceding the specified appointment date;4 p2 neither states that fact nor implies it.

■ Suppose today (“the present day”) is July 1st, 2013. Then p2 clearly states that supplier S1 was under contract on every day from July 1st, 2012 to July 1st, 2013, inclusive; p1 neither states that fact, nor implies it.

Thus, neither of p1 and p2 implies the other, and they’re certainly not equivalent.

That said, tuples in conventional databases often do contain things like “date of appointment,” and propositions like p2 (or p3) often are the intended interpretation. If such is the case here, however—i.e., if p1 is meant to be equivalent to p2 and p3 after all—then the given formulation isn’t quite adequate to the task. We can improve it by rephrasing it thus:

p1: Supplier S1 was most recently appointed on July 1st, 2012, and the contract hasn’t subsequently been terminated.

What’s more, if this version of p1 really is what tuple t is supposed to mean, then p2 in its present form isn’t really adequate either—it needs to be rephrased thus:

p2: Supplier S1 wasn’t under contract on June 30th, 2012, but has been so ever since July 1st, 2012.

Of course, p3 needs an analogous clarification:

p3: Supplier S1 wasn’t under contract on June 30th, 2012, but has been so throughout the interval from July 1st, 2012, to the present day.

Observe now that p1 expresses a time at which a certain event took place, while p2 and p3 express an interval of time during which a certain state persisted. We’ve deliberately chosen an example in which a certain state might be inferred from information regarding a certain event: Since the event—i.e., the most recent appointment of supplier S1—occurred on July 1st, 2012 (and the contract hasn’t subsequently been terminated), that supplier has been in the state of being under contract from that date to the present day. Conventional database technology can handle time instants (times at which events occur) reasonably well; however, it can’t handle time intervals (intervals during which states persist) very well at all, as we’ll see in the next chapter.

Now, events from which states can’t be inferred aren’t very interesting from the point of view of temporal data in general. For example, the statement “Lightning struck at 2:30 pm last Tuesday” is certainly a timestamped proposition, but—from the point of view of temporal data in general, at any rate—it’s not a very interesting one. To be more specific, the timestamp in this example has almost none of the special properties, and displays almost none of the special kinds of behavior, that (as we’ll see over the next few chapters) apply to temporal data in general. For such reasons, we’ll have little to say from this point forward regarding propositions like the one in the lightning example.

To return to propositions p1-p3: Observe now that, although p2 and p3 are logically equivalent, they’re significantly different in form; in other words, the predicates of which they’re instantiations (see Chapter 1) are significantly different. To be specific, p3 explicitly refers to a specific time interval, with a specific begin point and specific end point, while p2 refers only to a specific time instant. As a consequence, the form of p2 can’t be used for historical records, while that of p3 can5—provided, of course, that we replace the phrase “the present day” in that proposition by some explicit date, say July 1st, 2013. The corresponding predicates (call them P2 and P3, respectively) look something like this:

P2: Supplier Sx has been under contract since date d.

P3: Supplier Sx was under contract during the interval from date b to date e.

Note: For simplicity, we ignore for the moment the various clarifications discussed earlier, although those clarifications would certainly be needed in practice. See the further remarks on this subject at the very end of this chapter.

We conclude from the foregoing that the concept of during is very important for historical records. Indeed, that concept pervades the next several chapters, as we’ll soon see.6

We close this section by noting that, despite our repeated use of terms such as “historical data” and “historical records,” temporal databases might quite reasonably contain information about the future as well as, or instead of, the past. For example, we might wish to document the fact that supplier S1 will be under contract during the interval from date b to date e, where e is a date in the future, and b might be as well. Thus, we’ll take the terms temporal and historical to include the future in this way throughout this book, unless the context demands otherwise. We’ll also offer a few comments on the question of recording information about the future specifically, at suitable points in the text.

Valid Time vs. Transaction Time

In a conventional (nontemporal) database, anything can be updated, barring explicit edicts to the contrary. But if historical data can be updated, we find ourselves faced with the possibility that, apparently, history can be changed! What of this possibility?

Well, it’s important to understand that, obviously, the database doesn’t contain “the real world” as such; instead, it contains our knowledge of, or beliefs about, the real world.7 And while it’s perfectly reasonable to assert that the past is immutable and history as such can never change, it’s equally reasonable to assert that our beliefs about it can change—indeed, they often do. In a database context, therefore, when we speak of “updating history,” what we really mean is updating our beliefs about history, not updating history as such—though the distinction is often blurred, and even confused, in informal contexts, as you might imagine.

In the temporal database literature, the terms valid time and transaction time are used in an attempt to get at the foregoing distinction [103]. We don’t particularly care for these terms ourselves (their meanings can hardly be said to “leap off the page,” as it were), and we won’t be using them much in the chapters to come; however, the distinction as such is important, and it does merit some discussion. So consider the following simple example. Let p be the proposition “Supplier S1 was under contract.” Suppose it’s our current understanding that this state of affairs obtained from July 1st, 2012, to June 30th, 2013, and we therefore insert the following tuple into some relvar in the database:

image

Note very carefully that this tuple does not correspond to proposition p. Rather, it corresponds to what might be called a timestamped extension of p that can be stated thus:

Supplier S1 was under contractthat’s pfrom July 1st, 2012, to June 30th, 2013.

And the literature would refer to the timestamp here—i.e., the interval from July 1st, 2012, to June 30th, 2013—as the valid time for the original proposition p. Thus, the valid time for p in this example is the interval of time during which (according to our current beliefs) p was in fact true. Note: We’re assuming here for simplicity that the specified interval (from July 1st, 2012, to June 30th, 2013) is the only interval during which the specified supplier was under contract. In general, however, the valid time for a given proposition will consist of a set of intervals, not just a single interval as such. For example, if it’s our understanding that supplier S1 was also under contract previously from January 1st, 2010, to March 30th, 2011, then the relevant valid time would clearly involve two intervals, not just one. But we’ll continue to assume for the remainder of this section, for simplicity, that valid times are indeed just single intervals.

Suppose we now learn that supplier S1’s contract in fact began on June 1st, not July 1st, 2012, and we therefore replace the original tuple by one that looks like this:

image

Now, this change has no effect on proposition p as such, of course—it merely changes the associated timestamp (i.e., it reflects our revised understanding, to the effect that supplier S1 was in fact under contract from June 1st, 2012, to June 30th, 2013). Thus, the valid time for proposition p is now the interval from June 1st, 2012, to June 30th, 2013, and we’ve just “updated our beliefs about history.” What we’ve certainly not done, however, is update history as such; the update we’ve just performed does not and cannot change the historical fact that the database previously showed supplier S1 as under contract from July (not June) 1st, 2012.

Finally, suppose we discover a mistake was made and supplier S1 was in fact never under contract at all, and we therefore delete the foregoing tuple entirely. Proposition p is now known to be false; as a consequence, there’s now no valid time associated with it at all.8

Now suppose the original tuple was inserted at time t1 and replaced at time t2, and that replacement tuple was then deleted at time t3. Then the literature would say the interval from t1 to t2 was the transaction time—not for proposition p as such, but rather for the timestamped extension of p with valid time July 1st, 2012, to June 30th, 2013; that is, the interval from t1 to t2 is the time during which the database asserted that this particular timestamped extension of p was true. Likewise, the literature would say the interval from t2 to t3 was the transaction time for the timestamped extension of p with valid time June 1st, 2012, to June 30th, 2013; that is, the interval from t2 to t3 is the time during which the database asserted that that particular timestamped extension of p was true.9 Note: Again we’re simplifying matters somewhat; in general, transaction times, like valid times, are sets of intervals, not individual intervals as such. For example, if the database additionally showed the first of the foregoing timestamped extensions of p as being true during the interval from t4 to t5, then the relevant transaction time would clearly involve two intervals instead of one.

We’ll have a great deal more to say about these matters in Chapter 17. Prior to that point, it’s sufficient to stress the fact that—as our examples have suggested—valid times can be updated, but transaction times can’t. (Valid times reflect our beliefs about history, and those beliefs can change; transaction times, by contrast, reflect history as such, and history can’t change. Indeed, as we’ll see in Chapter 17, transaction times are managed by the system anyway, not by some human user.) Largely for such reasons, all of our discussions from this point forward will concern themselves with valid times only (what’s more, they’ll do so only implicitly, for the most part), until we get to Chapter 17.

Some Fundamental Questions

The references in the foregoing discussions to intervals of time tacitly introduce a simple but fundamental idea: namely, the idea that an interval with begin time b and end time e can be thought of as the set of all times t such that bte (where “<” means “earlier than,” of course). Though “obvious,” this simple notion has numerous far reaching consequences, as we’ll see in the chapters to come. It also leads directly to a series of fairly fundamental questions!—indeed, some of those questions might already have occurred to you. For example:

1. Doesn’t the expression “all times t such that bte” raise the specter of infinite sets and all of the conceptual and computational difficulties such sets suffer from?
Answer: Well, yes, it does appear to, but we dismiss the specter and circumvent the difficulties by adopting the assumption—except briefly in Appendix B—that the “timeline” consists of a finite contiguous sequence of discrete indivisible time quanta (where a time quantum is the smallest time unit the system is capable of representing). The interval with begin time b and end time e is a section of that timeline and thus also consists of a finite contiguous sequence of such quanta, a fortiori.
Note: Much of the literature refers to a time quantum as a chronon. However, it then typically goes on to define a chronon as an interval—see, e.g., reference [62]—implying that chronons have a begin point and an end point, and perhaps further points in between, and so aren’t indivisible after all. (What exactly are those various “points” in such an interval? What else can they be but chronons?) We find some confusion here and therefore choose to avoid the term.

2. Propositions p1-p3 as discussed in the section “Timestamped Propositions” above seem to assume that time quanta are days, but surely the system supports time units all the way down to tiny fractions of a second. If S1 was a supplier on July 1st, 2012, but not on June 30th, 2012, what’s to be done about the presumed interval of time from the beginning of the day July 1st, 2012, up to the very instant of appointment, during which S1 was still not officially under contract?
Answer: We need to distinguish carefully between time quanta as such, which are the smallest time units the system is capable of representing, and the time units that are relevant for some particular purpose, which might be days, or months, or milliseconds, or any other unit of measure that makes sense. We call these latter units time points (or just points for short) in order to stress the fact that, at least for the purpose at hand, they too are considered to be indivisible. Now, we might say informally that a time point is a section of the timeline—i.e., a sequence of time quanta—that stretches from one “boundary” quantum to the next (e.g., from midnight on one day to midnight on the next). We might therefore say, again informally, that time points have a duration (one day, in the foregoing example). Formally, however, time points are indeed points: They’re indivisible, and the concept of duration doesn’t apply to them.
Note: Much of the literature uses the term granule to refer to something like a time point as just defined (see, e.g., reference [6]). As with the term chronon, however, it then typically goes on (unfortunately) to say that a granule is an interval … We therefore choose to avoid the term granule also.10 We do, however, sometimes make informal use of the related term granularity, which refers to the “size” of the applicable time point, or equivalently to the “size” of the gap between adjacent points. Thus, we might say in our example that the granularity is one day, meaning we’re ignoring (in this context) the fact that a day is made up of hours, which are made up of minutes, and so on. Such notions can be expressed only by recourse to finer levels of granularity.
By the way, the term granularity does tend to suggest that in any given context all points and gaps are the same size. This assumption isn’t necessarily valid when we extend our temporal ideas to nontemporal data, as discussed in Chapter 6; in fact, it isn’t always valid for temporal data, either (for example, different months are of different duration). See Chapter 18 for further discussion.

3. Given, then, that the timeline can be regarded for some specific purpose as a finite and contiguous sequence of time points, we can refer unambiguously to the time point immediately succeeding or preceding any given point—right?
Answer: Yes, up to a point—the point in question being, of course, the end of time! And down to a point, too—the beginning of time. As far as we’re concerned, the beginning of time is a time point that has no predecessor (it might perhaps correspond to cosmologists’ best estimate of the very moment of the Big Bang), and the end of time is a time point that has no successor. To repeat, the timeline is a finite sequence of discrete points.
Note: In Appendix A, we’ll briefly consider the possibility of a “timeline” that’s cyclic and thus has no beginning and no end. Elsewhere, however, we’ll assume that time does indeed have a beginning and an end.

4. If some relvar currently contains a tuple representing the fact that supplier S1 was under contract from July 1st, 2012 to June 30th, 2013, doesn’t The Closed World Assumption—see Chapters 1 and 3—demand that the relvar in question also contain, for example, a tuple representing the fact that supplier S1 was under contract from July 2nd, 2012, until June 29th, 2013, and a whole host of other tuples representing further trivial consequences of the fact represented by the original tuple?
Answer: Good point! Clearly, we need a more constraining predicate as our general interpretation of such tuples:

Supplier Sx was under contract throughout the interval from date b to date e, but not throughout any interval that properly includes that interval.11


In other words, we take during to mean “throughout and not immediately before or immediately after (the interval in question).” In similar fashion, we take since to mean “ever since and not immediately before (the point in question).” Thus, please note that henceforth we’ll use these terms in these specific senses only (barring explicit statements to the contrary, of course).

We close this section, and this chapter, with some final remarks regarding the running example. To be specific, from this point forward we’ll assume, realistically enough, that:

a. No supplier can end one contract on one day and begin another on the very next day.

b. No supplier can be under two distinct contracts at the same time.

c. Supplier contracts can be open ended—that is, a supplier can be currently under contract and the end date for that contract can be currently unknown.

Exercises

4.1 What’s a timestamped proposition? Give some examples.

4.2 Distinguish between valid time and transaction time.

4.3 What’s a time quantum? What’s a time point?

4.4 What do you understand by the term granularity?

4.5 What do you understand by the terms beginning of time and end of time?

Answers

The exercises in this chapter are all just review questions, and suitable answers can be found in the body of the chapter.


1Nontemporal databases are sometimes called snapshot databases in the literature. We don’t much care for this term, however, because “snapshot” has often been used in the past (and still is used) to refer to the database as it appears or appeared at some specific point in time. In other words, the term very reasonably can be, and is, applied to any database, temporal or otherwise.

2Be warned, however, that over questions of nomenclature and similar matters we depart (quite extensively, in fact) from previous publications by Lorentzos on the same subject.

3Except for type BOOLEAN and the type generator RELATION, both of which must be supported for obvious reasons.

4At least, such would be the normal interpretation. But natural language is so often imprecise! The appointment on July 1st might have been a renewal, and supplier S1 might have been under contract on June 30th after all. For the sake of the present discussion, however, we assume the normal interpretation.

5These remarks are based on the empirical observation that most interesting historical records do involve intervals, not instants.

6It’s tempting to describe those chapters, therefore, as an investigation into the possibility of building a During Machine.

7More precisely, it contains a representation of those beliefs. For simplicity, we talk throughout this book as if the database contained not just representations of information but information per se, though such talk is more than a little loose.

8More precisely, the valid time is now an empty set (of intervals).

9Of course, the first of these two transaction times isn’t exactly the interval from t1 to t2 but, rather, the interval from t1 to “just before” t2 (and similarly for the second). For simplicity, however, we’ll ignore such niceties, until further notice.

10The confusion over whether chronons and granules are intervals seems to us to stem from a confusion over intuition vs. formalism. An intuitive belief about the way the world works is one thing; a formal model is something else entirely. In particular, we might believe the timeline is continuous and infinite, but we nevertheless model it for computing purposes as discrete and finite. (There’s an obvious parallel here with real numbers, incidentally: The real number line is likewise continuous and infinite, but we model it for computing purposes as discrete and finite.)

11The notion of one interval properly including another is defined formally in Chapter 7. For now, we just assume it makes good intuitive sense.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.219.132.107