Ada’s Program



Fragment of the Analytical Engine’s arithmetic/logic unit built by Babbage (photo: Science Museum London) and punched cards for operating it (photo: Karoly Lorentey)

Following on from my post about his Difference Engine, Charles Babbage’s Analytical Engine deserves some discussion. Only small pieces of the Analytical Engine were built. Indeed, Babbage’s ideas were so far ahead of his time that it could not be built with the technology available to him. Babbage was clearly either a true genius – or else he was a time-traveller from the future trying to recreate a modern computer.

It is not quite clear whether Babbage’s Analytical Engine was Turing complete. The kind of abstract computer developed independently by Alan Turing and Emil Post uses an arbitrarily long tape. Even more abstract models of computation use arbitrarily long integers to achieve the same effect. For example, the list (2, 3, 0, 1) can be encoded as the number 582 (1001000110 in binary). Modern computers use a sequence of numbered memory locations, accessed by indexing. The Analytical Engine could not do this. To quote the excellent analysis by Allan G. Bromley, “With hindsight we may note that in the Analytical Engine (at least until 1840) Babbage did not possess the variable-address concept; that is, there was no mechanism by which the machine could, as a result of a calculation, specify a particular variable in the store to be used as the operand for an instruction.


Ada King-Noel, the Countess of Lovelace (1836 portrait by Margaret Sarah Carpenter, cropped)

Babbage was not terribly good at explaining his ideas in writing, unfortunately. The best description is a 13-page summary of of a lecture by Babbage written in French by Luigi Federico Menabrea (later Prime Minister of Italy). This was translated into English in 1843 by Augusta Ada King-Noel (née Byron), the Countess of Lovelace.

Ada added 36 pages of detailed notes of her own. These include several insightful comments regarding the philosophy of computing, such as: “Again, it might act upon other things besides number, were objects found whose mutual fundamental relations could be expressed by those of the abstract science of operations, and which should be also susceptible of adaptations to the action of the operating notation and mechanism of the engine. Supposing, for instance, that the fundamental relations of pitched sounds in the science of harmony and of musical composition were susceptible of such expression and adaptations, the engine might compose elaborate and scientific pieces of music of any degree of complexity or extent. The Analytical Engine is an embodying of the science of operations, constructed with peculiar reference to abstract number as the subject of those operations.” (from Note A).

Also: “The Analytical Engine has no pretensions whatever to originate anything. It can do whatever we know how to order it to perform.” (from Note G).


The diagram from Note G, which shows what is essentially a computer program

Ada is sometimes described as the “first computer programmer,” based on the material in her Note G. This is clearly incorrect, since Charles Babbage had written several dozen programs for the Analytical Engine before 1840. Perhaps “first computer scientist” would be a better title. The program described in Ada’s Note G computes Bernoulli numbers. It does so using the fact that each Bernoulli number can be computed from its predecessors via the relationship:

0 = A0 + A1B1 + A3B3 + A5B5 + … + B2n−1

Here each Ai can be calculated as follows:

a <- function (n, i) {
	if (i == 0) -0.5 * (2*n - 1) / (2*n + 1)
	else if (i == 1) n
	else a(n, i-2) * (2*n + 2 - i) * (2*n + 1 - i) / (i * (i + 1))
}

Bromley notes that “the ‘user instruction set’ of the Analytical Engine seems nowhere to be clearly stated,” which makes it a little difficult to extract an actual program from Ada’s material. After fixing three small bugs, here is something that actually works (in the language R, and all done using numbered registers):

ada <- function (n.max) {
	b <- rep(0, n.max)  # result registers
	v <- c(1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)  # other registers
	
	while (v[3] <= n.max) {  # how is this loop done in the Analytical Engine?
		v[4] <- v[5] <- v[6] <- v[2] * v[3]
		v[4] <- v[4] - v[1]  # v[1] is always 1
		v[5] <- v[5] + v[1]
		v[11] <- v[4] / v[5]  # accidentally reversed in Ada’s diagram
		v[11] <- v[11] / v[2]  # v[2] is always 2
		v[13] <- v[13] - v[11]
		v[10] <- v[3] - v[1]
		
		if (v[10] > 0) {  # how is this conditional execution done in the Analytical Engine?
			v[7] <- v[2] + v[7]
			v[11] <- v[6] / v[7]
			v[12] <- b[1] * v[11]
			v[13] <- v[12] + v[13]
			v[10] <- v[10] - v[1]
		}

		while(v[10] > 0) {  # how is this loop done in the Analytical Engine?
			v[6] <- v[6] - v[1]
			v[7] <- v[1] + v[7]
			v[8] <- v[6] / v[7]
			v[11] <- v[8] * v[11]
			v[6] <- v[6] - v[1]
			v[7] <- v[1] + v[7]
			v[9] <- v[6] / v[7]
			v[11] <- v[9] * v[11]
			
			i <- v[3] - v[10]   # how is this indexing done in the Analytical Engine?
			v[12] <- b[i] * v[11]
			v[13] <- v[12] + v[13]
			v[10] <- v[10] - v[1]
		}

		n <- v[3]  # how is this indexing done in the Analytical Engine?
		b[n] <- b[n] - v[13]  # another apparent error in Ada's table at line 14 (negation is needed)

		v[3] <- v[1] + v[3]
		v[7] <- 0   # reset the register with a “variable card”
		v[13] <- 0  # a third apparent error in Ada's table (v[13] needs to be reset, not v[6])
	}
	b
}

There are a number of questions about this. First, I am assuming that all registers are read non-destructively (Ada’s notes indicate that read-and-clear is also possible). Second, the results stored in b require indexing, which the Analytical Engine could not do. Third, Ada writes that “Operation 7 must either bring out a result equal to zero (if n = 1); or a result greater than zero, as in the present case; and the engine follows the one or the other of the two courses just explained, contingently on the one or the other result of Operation 7.” This implies that some kind of conditional branching was possible. But how?

A simple response is simply to “unroll” the loops, breaking the program down into instructions of just three kinds:

  • Set 1 567: place the number 567 in register #1
  • Do 2 + 3: add the contents of register #2 to the content of register #3 (and similarly for −, ×, and ÷)
  • Store 4: store a previously computed result in register #4

The following, rather lengthy, version of the program correctly computes the first three Bernoulli numbers:

Set 1 1, Set 2 2, Set 3 1

# First Bernoulli number
Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5, Store 11
Do 11 / 2, Store 11
Do 13 - 11, Store 13
Do 3 - 1, Store 10

Do 1 + 3, Store 3
Do 21 - 13, Store 21,  # 21 done
Set 7 0, Set 13 0

# Second Bernoulli number
Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5, Store 11
Do 11 / 2, Store 11
Do 13 - 11, Store 13
Do 3 - 1, Store 10

Do 2 + 7, Store 7
Do 6 / 7, Store 11
Do 21 * 11, Store 12,  # use 21
Do 12 + 13, Store 13
Do 10 - 1, Store 10

Do 1 + 3, Store 3
Do 22 - 13, Store 22,  # 22 done
Set 7 0, Set 13 0

# Third Bernoulli number
Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5, Store 11
Do 11 / 2, Store 11
Do 13 - 11, Store 13
Do 3 - 1, Store 10

Do 2 + 7, Store 7
Do 6 / 7, Store 11
Do 21 * 11, Store 12,  # use 21
Do 12 + 13, Store 13
Do 10 - 1, Store 10

# Inner loop
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 8
Do 8 * 11, Store 11
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 9
Do 9 * 11, Store 11
Do 22 * 11, Store 12,  # use 22
Do 12 + 13, Store 13
Do 10 - 1, Store 10

Do 1 + 3, Store 3
Do 23 - 13, Store 23,  # 23 done
Set 7 0, Set 13 0

Can we do better than that? Bromley notes that “the mechanism by which the sequencing of operations is obtained is obscure.” Furthermore, driven by what was probably a correct intuition about code/data separation, Babbage separated operation and variable cards, and this would have played havoc with control flow (Bromley again: “I am not convinced that Babbage had clearly resolved even the representational difficulties that his separation of operation and variable cards implies”).

I’m resolving those issues by straying into what Babbage might have done had he seen the need. In particular:

  • I assume a conditional jump mechanism, with Ifzero 1 goto A jumping (somehow) to Label A if register #1 is zero (if operation and variable cards are reunited, this can be easily done by moving forward or back the required number of cards)
  • I assume an additional category of card, with its own card queue, with each such card specifying an output register, and with the operations:
    • Q (in Do, Store, Set, or Ifzero): access the register specified by the next card in the card queue
    • ResetQ: wind back the card queue to the start
    • StopifemptyQ: stop if all the cards in the card queue have been read

Yes, that’s all very speculative – but something like that is needed to make Ada’s loops work. In addition, the card queue (plus the associated output registers) performs the role of the tape in Turing/Post machines, or the memory in modern computers. Something like it is therefore needed.

And here is Ada’s program in that modified form. It works, loops and all! I tested it for the first 12 Bernoulli numbers, which are 0.1666667, −0.03333333, 0.02380952
−0.03333333, 0.07575758, −0.2531136, 1.166667, −7.092157, 54.97118, −529.1242, 6192.123, and −86580.25 (numerical errors do accumulate as the sequence is continued).

Set 1 1, Set 2 2, Set 3 1

Label A

Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5, Store 11
Do 11 / 2, Store 11
Do 13 - 11, Store 13
Do 3 - 1, Store 10

Ifzero 10 goto B
Do 2 + 7, Store 7
Do 6 / 7, Store 11
Do Q * 11, Store 12  # Using 21
Do 12 + 13, Store 13
Do 10 - 1, Store 10

Label B

# Inner loop
Ifzero 10 goto C
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 8
Do 8 * 11, Store 11
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 9
Do 9 * 11, Store 11
Do Q * 11, Store 12  # Using 22, etc.
Do 12 + 13, Store 13
Do 10 - 1, Store 10
Ifzero 14 goto B  # Unconditional jump

Label C

Do 1 + 3, Store 3
Do 14 - 13, Store Q  # Using register 14 as constant zero
StopifemptyQ

Set 7 0, Set 13 0, ResetQ
Ifzero 14 goto A  # Unconditional jump

And for those interested, here is an emulator (in R) which will read and execute that program. For a slightly different approach, see the online emulator here.

read.program <- function (f) {
	p <- readLines(f)
	p <- gsub(" *#.*$", "", p)  # remove comments
	p <- gsub(" *, *", ",", p)  # remove spaces after commas
	p <- p[p != ""]  # remove blank lines
	p <- paste0(p, collapse=",")  # join up lines
	p <- gsub(",+", ",", p)  # remove duplicate commas
	strsplit(p, ",")[[1]]  # split by commas
}

do.op <- function (x, op, y) {
	if (op == "+") x + y
	else if (op == "-") x - y
	else if (op == "*") x * y
	else if (op == "/") x / y
	else stop(paste0("Bad op: ", op))
}

emulate <- function(program, maxreg) {
	set.inst <- "^Set (Q|[0-9]*) (Q|[0-9]*)$"
	store.inst <- "^Store (Q|[0-9]*)$"
	do.inst <- "^Do (Q|[0-9]*) ([^ ]) (Q|[0-9]*)$"
	label.inst <- "^Label ([0-9A-Za-z]*)$"
	ifzero.inst <- "^Ifzero ([0-9]*) goto ([0-9A-Za-z]*)$"

	v <- rep(0, maxreg)
	op.result <- 0
	stopping <- FALSE
	pc <- 1
	queue <- 21:maxreg
	qptr <- 1
	
	while (pc <= length(program) && ! stopping) {
		p <- program[pc]
		if (grepl(set.inst, p)) {
			i <- gsub(set.inst, "\\1", p)
			j <- as.numeric(gsub(set.inst, "\\2", p))
			if (i == "Q") {
				i <- queue[qptr];
				qptr <- qptr + 1
			} else i <- as.numeric(i)
			v[i] <- j

		} else if (grepl(do.inst, p)) {
			i <- gsub(do.inst, "\\1", p)
			op <- gsub(do.inst, "\\2", p)
			j <- gsub(do.inst, "\\3", p)
			if (i == "Q") {
				i <- queue[qptr];
				qptr <- qptr + 1
			} else i <- as.numeric(i)
			if (j == "Q") {
				j <- queue[qptr];
				qptr <- qptr + 1
			} else j <- as.numeric(j)
			op.result <- do.op(v[i], op, v[j])

		} else if (grepl(store.inst, p)) {
			i <- gsub(store.inst, "\\1", p)
			if (i == "Q") {
				i <- queue[qptr];
				qptr <- qptr + 1
			} else i <- as.numeric(i)
			v[i] <- op.result

		} else if (grepl(ifzero.inst, p)) {
			i <- gsub(ifzero.inst, "\\1", p)
			if (i == "Q") {
				i <- queue[qptr];
				qptr <- qptr + 1
			} else i <- as.numeric(i)
			dest <- gsub(ifzero.inst, "\\2", p)
			j <- which(program == paste0("Label ", dest))
			if (v[i] == 0) pc <- j

		} else if (p == "StopifemptyQ") {
			if (qptr > length(queue)) stopping <- TRUE

		} else if (grepl(label.inst, p)) {
			# do nothing
			
		} else if (p == "ResetQ") {
			qptr <- 1
			
		} else stop(paste0("Bad instruction: ", p))
		pc <- pc + 1
	}
	v
}

emulate(program = read.program("ada.program.txt"), maxreg = 32)

Update: If we take Ada’s program as specifying implicit zeroing of unused registers, we get this slightly fancier version (which also works):

Set 1 1, Set 2 2, Set 3 1

Label A

Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5 clearing 4 and 5
Store 11
Do 11 / 2, Store 11
Do 13 - 11 clearing 11
Store 13
Do 3 - 1, Store 10

Ifzero 10 goto B

Do 2 + 7, Store 7
Do 6 / 7, Store 11
Do Q * 11, Store 12  # Using 21
Do 12 + 13 clearing 12
Store 13
Do 10 - 1, Store 10

Label B

Ifzero 10 goto C  # Inner loop test

Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 8
Do 8 * 11 clearing 8
Store 11
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 9
Do 9 * 11 clearing 9
Store 11
Do Q * 11, Store 12  # Using 22, etc.
Do 12 + 13 clearing 12
Store 13
Do 10 - 1, Store 10
Goto B  # End of inner loop

Label C

Do 1 + 3, Store 3
Do 14 - 13 clearing 13
Store Q  # Using register 14 as constant zero
StopifemptyQ

Set 6 0, Set 7 0, Set 11 0, ResetQ
Goto A

Advertisements

ASC 11: Leadership


Nuon Solar Team celebrates their 2017 WSC win (photo: Anthony Dekker)

Ernest Hemingway famously said that “war is fought by human beings.” It’s the same with solar cars – they are built and raced by human beings. Or, as Solar Team Twente likes to say, they are “powered by human energy.

There are many aspects to this human side of solar car racing. I’ve written before about how little things like team clothing contribute to team cohesion. A diversity of skills is important if a team is to succeed. During the race, nutrition is one of the things necessary to keep people working at top efficiency. But today, I want to talk about team leadership.

Engineering leadership is critically important, although surprisingly little is written about it. Tracy Kidder produced a fantastic, almost ethnographic, description of real-world engineering in his 1981 book The Soul of a New Machine, but even that book has the actual leadership happening mostly in the background.

A century earlier, Leo Tolstoy opened his novel Anna Karenina with the words “Happy families are all alike; every unhappy family is unhappy in its own way” (“Все счастливые семьи похожи друг на друга, каждая несчастливая семья несчастлива по-своему”). That is true also for solar car teams. Many things have to be done right if a team is to succeed, but doing one thing badly is enough to stop a team in its tracks.

A team leader must, first of all, motivate team members to do their best – it is no accident that all the solar car team leaders I’ve met have been really nice people. A team leader must make sure that the overall problem of building, racing, and finding sponsorship for a solar car is broken down into manageable pieces, and that the right person is in charge of each piece – this is the essence of engineering.

A solar-car team leader must also have – and promote – a clear vision of the car that the team is going to build. It is possible to have a world-class suspension, a world-class body, world-class solar cells, and world-class everything else, and still fail, because the components were designed under different assumptions, and don’t actually fit together to make a world-class car.

A team leader must keep an eye on the critical path as well. Building a solar car for a race is one of the most challenging kinds of engineering project – one where the delivery date is fixed in stone. What project managers call the critical path is the sequence of activities which, if they take any longer than planned, are guaranteed to delay project completion. Generally, the schedule for building and testing a solar car doesn’t leave much room for that kind of schedule slippage.

One perennial question with solar car team leaders is how long it takes them to realise that there is a problem requiring the team to either (a) change the way it operates or (b) pull out of the competition. Each year, I am reminded by somebody or other of Napoleon’s 1812 invasion of Russia, summarised so well in the famous data visualisation above (by Charles Minard).


Napoleon’s death march (painted by Illarion Pryanishnikov)

Napoleon began his invasion with 422,000 men, and reached Moscow with only 100,000 survivors. This was not enough to do anything, so he turned around and went home again, losing most of his remaining troops to cold and skirmishes in the process. I have often wondered at what point Napoleon realised that his plan was not working the way that it was supposed to. In a similar way, there is always a solar car team that begins a last-minute “death-march,” working until 3:00 AM each night, desperately trying to finish their car. The early hours of the morning are not a good time to be making safety-critical engineering decisions, and teams which leave it so late to panic generally don’t do very well.

But enough of Napoleon. Let us listen to some men and women who know how it’s done (translations from Dutch are my own best attempts):

Olivier Berghuis, Solar Team Twente (2017): “As team leader you are the one ultimately responsible for the success of the project. That means that you have to keep a close eye on the progress of the project’s technical, communication, and financial aspects. The mood of the team and the personal development of each team member are also critically important important responsibilities of the team leader.” (“Als teamleider ben je eindverantwoordelijk voor het slagen van het project. Dat betekent dat je de voortgang van het project op technisch, communicatief en financieel gebied in de gaten moet houden. Daarnaast is de sfeer binnen het team en de persoonlijke ontwikkeling van elk teamlid een zeer belangrijke verantwoordelijkheid van de teamleider.”)

Shihaab Punia, University of Michigan (2016): “… build the best possible team and team culture …”


Photo: Jerome Wassenaar

Irene van den Hof, Solar Team Twente (2015): “I think that I am a good listener for my teammates. I try to put a lot of emphasis on that. Everyone is young and inexperienced, and that can sometimes cause problems, but together we are indeed a team, and everyone has to reach the finish line – I make sure of that.” (“Ik denk dat ik heel goed kan luisteren naar mijn teamgenoten. Daar probeer ik ook veel aandacht aan te besteden. Iedereen is jong en onervaren en dat kan voor problemen zorgen, maar samen zijn we wel een team en iedereen moet de eindstreep halen, daar zorg ik ook voor.”)

And it’s worth repeating the excellent insights from Rachel Abril, who was on the Stanford solar car team for four years (“Go fast, but not recklessly fast. Test it. Test it again. Test it more. Use failure as a foundation for success.”):


Something different

This picture illustrates the ill-fated expedition to Australia described in H.P. Lovecraft’s horror story The Shadow Out of Time. The images in the montage are edited versions of public-domain pictures, and include this copy of the Necronomicon. The complete image is © Anthony Dekker.

… On July 10, 1934, there was forwarded to me by the Psychological Society the letter which opened the culminating and most horrible phase of the whole mad ordeal. It was postmarked Pilbarra, Western Australia, and bore the signature of one whom I found, upon inquiry, to be a mining engineer of considerable prominence. Enclosed were some very curious snapshots. I will reproduce the text in its entirety, and no reader can fail to understand how tremendous an effect it and the photographs had upon me. …

The “Pilbarra” in this story (and on the map) is presumably Pilbara Road District, an old name for what is now the town of Port Hedland, Western Australia (although the address given by Lovecraft matches a no longer extant street in the nearby ghost town of Cossack). Lovecraft’s story also refers to a precise geographical location: 22° 3′ 14” S, 125° 0′ 39” E. See more on the Australian aspects of the story at Trollunteer. Propnomicon also did some really good props a few years back.


Earthrise / Christmas


Earthrise, taken aboard Apollo 8 by Bill Anders on 24 December 1968 (NASA photo).

With Christmas coming up, it seems appropriate to post this iconic photograph, taken by Lunar Module Pilot Bill Anders on 24 December 1968, while orbiting the moon in Apollo 8. The team also did a live television broadcast, in which Anders read from Genesis:

For all the people on Earth the crew of Apollo 8 has a message we would like to send you: In the beginning God created the heaven and the earth. And the earth was without form, and void; and darkness was upon the face of the deep. And the Spirit of God moved upon the face of the waters. And God said, Let there be light: and there was light. And God saw the light, that it was good: and God divided the light from the darkness.

Command Module Pilot Jim Lovell continued: “And God called the light Day, and the darkness he called Night. And the evening and the morning were the first day. And God said, Let there be a firmament in the midst of the waters, and let it divide the waters from the waters. And God made the firmament, and divided the waters which were under the firmament from the waters which were above the firmament: and it was so. And God called the firmament Heaven. And the evening and the morning were the second day.

Commander Frank Borman closed: “And God said, Let the waters under the heavens be gathered together unto one place, and let the dry land appear: and it was so. And God called the dry land Earth; and the gathering together of the waters called he Seas: and God saw that it was good. And from the crew of Apollo 8, we close with good night, good luck, a Merry Christmas, and God bless all of you – all of you on the good Earth.

And the same from me.


Her pale fire she snatches from the sun

Shakespeare writes “the moon’s an arrant thief, and her pale fire she snatches from the sun” (Timon of Athens, Act 4, Scene 3). He is, of course correct. The moon merely reflects sunlight, and produces no light of its own. One way of telling this is that moonlight actually displays the same telltale absorption spectrum as sunlight:

Our eyes tend to perceive moonlight as “blueish” or “silvery,” but that is because of the way our eyes work at low light levels. Long-exposure photographs under moonlight, like this one, look much like daytime shots:

Anaxagoras (499–428 BC) seems to have been the first to discover that the moon shines only by reflected light:

Anaxagoras also explained that solar eclipses occur when the moon moves between the earth and the sun. Total solar eclipses are dark precisely because the moon produces no light of its own:


Australians know that the world is round

Following up on my earth-measuring post, people have known for more than 2,000 years that the earth is round. In 350 BC, Aristotle wrote “The evidence of the senses further corroborates this [that the earth is spherical]. How else would eclipses of the moon show segments shaped as we see them? As it is, the shapes which the moon itself each month shows are of every kind straight, gibbous, and concave-but in eclipses the outline is always curved: and, since it is the interposition of the earth that makes the eclipse, the form of this line will be caused by the form of the earth’s surface, which is therefore spherical. Again, our observations of the stars make it evident, not only that the earth is circular, but also that it is a circle of no great size. For quite a small change of position to south or north causes a manifest alteration of the horizon. There is much change, I mean, in the stars which are overhead, and the stars seen are different, as one moves northward or southward. Indeed there are some stars seen in Egypt and in the neighbourhood of Cyprus which are not seen in the northerly regions; and stars, which in the north are never beyond the range of observation, in those regions rise and set. All of which goes to show not only that the earth is circular in shape, but also that it is a sphere of no great size: for otherwise the effect of so slight a change of place would not be quickly apparent.” (On the Heavens, II, 14).

Around the year 700, Bede wrote “We call the earth a globe, not as if the shape of a sphere were expressed in the diversity of plains and mountains, but because, if all things (terrestrial) are included in the outline, the earth’s circumference will represent the figure of a perfect globe. Hence it is that the stars of the northern hemisphere appear to us, but never those of the southern; while on the other hand, the people who live on the southern part of the earth cannot see our stars, because the globe obstructs their view.” (De Natura Rerum). Australians verify his statement about stars every night.

I have commented previously on how the medieval poet Dante described time zones on a round earth:

In more recent times, we have pictures from space:

Aristotle and Bede mention the stars. Not only do the visible stars vary with latitude, but in the Northern Hemisphere they rotate around Polaris, while in the Southern Hemisphere they rotate around the South Celestial Pole, as in this photograph taken in Chile:

Sailors at sea have long known that the earth is round. From a vantage point 20 metres above sea level, one can see a complete ship 17 km away. Beyond that, the distant ship goes “hull down,” and only the upper parts of it are visible (from 34 km away, the lower 20 metres of a distant ship will be hidden). Closer to sea level, the distance is much less. This photo, taken in Spain by “Santifc,” shows the phenomenon (and similar observations can be made at some Australian beaches):

And, of course, the aircraft flight times to and from Australia can only be explained by the fact that the earth is round:


On having multiple hypotheses which all fit the data

For every fact there is an infinity of hypotheses.” – from Robert Pirsig, Zen and the Art of Motorcycle Maintenance


‘I will read the inventory… First item: A very considerable hoard of precious stones, nearly all diamonds, and all of them loose, without any setting whatever… Second item: Heaps and heaps of loose snuff, not kept in a horn, or even a pouch, but lying in heaps… Third item: Here and there about the house curious little heaps of minute pieces of metal, some like steel springs and some in the form of microscopic wheels… Fourth item: The wax candles, which have to be stuck in bottle necks because there is nothing else to stick them in… By no stretch of fancy can the human mind connect together snuff and diamonds and wax and loose clockwork.’

‘I think I see the connection,’ said the priest. ‘This Glengyle was mad against the French Revolution. He was an enthusiast for the ancien regime, and was trying to re-enact literally the family life of the last Bourbons. He had snuff because it was the eighteenth century luxury; wax candles, because they were the eighteenth century lighting; the mechanical bits of iron represent the locksmith hobby of Louis XVI; the diamonds are for the Diamond Necklace of Marie Antoinette.’

Both the other men were staring at him with round eyes. ‘What a perfectly extraordinary notion!” cried Flambeau. “Do you really think that is the truth?’

‘I am perfectly sure it isn’t,’ answered Father Brown, ‘only you said that nobody could connect snuff and diamonds and clockwork and candles. I give you that connection off-hand. The real truth, I am very sure, lies deeper.’

He paused a moment and listened to the wailing of the wind in the turrets. Then he said, ‘The late Earl of Glengyle was a thief. He lived a second and darker life as a desperate housebreaker. He did not have any candlesticks because he only used these candles cut short in the little lantern he carried. The snuff he employed as the fiercest French criminals have used pepper: to fling it suddenly in dense masses in the face of a captor or pursuer. But the final proof is in the curious coincidence of the diamonds and the small steel wheels. Surely that makes everything plain to you? Diamonds and small steel wheels are the only two instruments with which you can cut out a pane of glass.’

The bough of a broken pine tree lashed heavily in the blast against the windowpane behind them, as if in parody of a burglar, but they did not turn round. Their eyes were fastened on Father Brown. ‘Diamonds and small wheels,’ repeated Craven ruminating. ‘Is that all that makes you think it the true explanation?’

‘I don’t think it the true explanation,’ replied the priest placidly; ‘but you said that nobody could connect the four things. The true tale, of course, is something much more humdrum. Glengyle had found, or thought he had found, precious stones on his estate. Somebody had bamboozled him with those loose brilliants, saying they were found in the castle caverns. The little wheels are some diamond-cutting affair. He had to do the thing very roughly and in a small way, with the help of a few shepherds or rude fellows on these hills. Snuff is the one great luxury of such Scotch shepherds; it’s the one thing with which you can bribe them. They didn’t have candlesticks because they didn’t want them; they held the candles in their hands when they explored the caves.’

‘Is that all?’ asked Flambeau after a long pause. ‘Have we got to the dull truth at last?’ ‘Oh, no,’ said Father Brown.

As the wind died in the most distant pine woods with a long hoot as of mockery Father Brown, with an utterly impassive face, went on: ‘I only suggested that because you said one could not plausibly connect snuff with clockwork or candles with bright stones. Ten false philosophies will fit the universe; ten false theories will fit Glengyle Castle. But we want the real explanation of the castle and the universe.” – from G. K. Chesterton, “The Honour of Israel Gow