Architecture, read from a builder's source
This essay is not engineering, naval-architecture, acoustic-design or heritage advice. It describes published definitions and simple models as rules over the facts a reader records, and it reads a program that states them. A tower in it is a straight column of even weight, a hull is a box, and a room is Sabine's equation: whether a real structure is safe, a real ship stable or a real hall good for music is decided by those who survey, test and certify it. A style in it is a family resemblance that a rule makes strict, and a record of height is a verdict over the records that were written. Nothing here is a judgement of any real building, ship or hall.
Construction of Cologne Cathedral began in 1248, but was halted in the years around 1560. Attempts to complete construction began around 1814, but the project was not properly funded until the 1840s, and its completion was celebrated as a national event on 15 October 1880, 632 years after construction had begun. With a height of 157.38 metres, its page says, it was the tallest building in the world for four years until the completion of the Washington Monument. The list of the tallest structures built before the twentieth century says something else: Cologne Cathedral was the "tallest structure on Earth from 1880 to 1884, and tallest building on Earth from 1880 to 1890". The Washington Monument is an obelisk, and whether it ends the record of a building depends on whether a monument is counted as one. A record of height is a verdict, and it depends on what is counted and on what was recorded.
A different building asks a different question. The Sedlec Ossuary lies beneath the Cemetery Church of All Saints in Sedlec, a suburb of Kutná Hora in the Czech Republic. In 1278, Henry, the abbot of the Cistercian monastery in Sedlec, was sent to the Holy Land by King Ottokar II of Bohemia, and returned with a small amount of earth he had removed from Golgotha and sprinkled it over the abbey cemetery, which became a desirable burial site. The ossuary is estimated to contain the skeletons of between 40,000 and 70,000 people, whose bones have, in many cases, been artistically arranged to form decorations and furnishings for the chapel: a chandelier of bones, which contains at least one of every bone in the human body, hangs from the center of the nave. The upper chapel was rebuilt in the Czech Baroque style to a design by Jan Santini Aichel, and in 1870 František Rint, a woodcarver, was employed by the Schwarzenberg family to put the bone heaps into order, and signed the work in bone. What that chapel is lies in none of the features this essay's rules can name, and Section 1 shows what the program says of a building it cannot describe.
The architecture library for DKE, the Deterministic Knowledge Engine, writes down some of what an architect, a shipwright, an acoustician and a builder of water channels are taught, in DKE Python, and this essay teaches the subject by reading it. It is two halves that share nothing but the subject. The first records facts and concludes: a building's style from its features, which structure and which building was the tallest when it was completed, whether a tower tips on the model of a straight column, whether a box hull's metacentric height is not positive, whether a room rings longer or shorter than wanted, and whether a channel falls too little for the standard it is held to. The second calculates: a lean and the offset of a top, Sabine's reverberation time, a box hull's metacentric height, a gradient and the same as one in N, and a pendulum's period and length. Every program below runs as shown once the library's source file has been compiled into a store, and every output is copied from a run. The programs name their own subjects and print only those, so that a store which already holds other buildings gives the same lines.
1. A style is three features
Gothic architecture "is characterised by pointed arches, rib vaults, flying buttresses and large, traceried stained glass windows". Romanesque architecture "is known by its massive quality, thick walls, round arches, sturdy pillars, barrel vaults, large towers and decorative arcading", and its period saw "the development of vaults from barrel and groin vaults to ribbed vaults". A definition of that kind is a family resemblance: a building can have most of the features and not the style, or the style and not every feature. A rule has to make it strict. The library takes the three features of Gothic that are parts of the structure, the fourth being its windows, and concludes the style only where all three are recorded:
if b.pointed_arch == True and b.rib_vault == True and b.flying_buttress == True:
b.gothic = TrueRomanesque is two rules, round arches and thick walls with a barrel vault, and the same with a groin vault. The third conclusion is not a style. A pendentive is "a constructional device permitting the placing of a circular dome over a square room", a device and not a period, and the library names the form without naming a style. Hagia Sophia was completed in AD 537, becoming the world's largest interior space and among the first to employ a fully pendentive dome. An earthquake in 558 brought down its eastern semi-dome, and the reconstruction that gave the church its present 6th-century form was completed in 562.
import architecture
architecture.building("cologne", ["pointed_arch", "rib_vault", "flying_buttress"])
architecture.building("hagia", ["dome", "pendentives"])
architecture.building("abbey", ["round_arch", "thick_walls", "barrel_vault"])
architecture.building("chapel", ["pointed_arch", "rib_vault"])
for b in ["cologne", "hagia", "abbey", "chapel", "sedlec"]:
print(b, architecture.styles_of(b))
n = why_not(architecture.Building.chapel.gothic)
print(n)cologne ['gothic']
hagia ['pendentive_dome']
abbey ['romanesque']
chapel []
sedlec []
rule `architecture.gothic_building` needs architecture.Building[chapel].flying_buttress == True, and architecture.Building[chapel].flying_buttress is False (bool)Cologne is recorded with the three features its style names, and is Gothic. Hagia Sophia is recorded with its dome and its pendentives and nothing else, and carries a dome on pendentives without a style. The abbey and the chapel are invented: the abbey has the Romanesque features, and the chapel has two of the three Gothic ones. building() writes all nine features, true for those named and false for the rest, so the chapel's missing flying buttress is a fact and not a gap, and why_not names it. The ossuary was never described. It has no style here, and that says nothing about it: a building with no record is unknown, which is not the same as a building of no style.
2. The record of height
A record of height is kept twice, for structures and for buildings, and a rule decides it from the records a reader writes. A structure is the tallest when it was completed if no structure recorded was completed in that year or before it, still stood after it, and was taller:
if s.height > 0.0 and s.completed > -1000000.0 and none(o in Structure: o.completed <= s.completed and o.until > s.completed and o.height > s.height):
s.tallest_structure = TrueThe second rule asks the same among buildings only. A structure stands until the year in its until, which fell() writes; a year before the common era is written negative, and the rules only compare years. The records below are the list's: the Great Pyramid of Giza, 146.6 metres, about 2570 BC; Old St Paul's Cathedral in London, 150.2, 1221, whose spire was destroyed in 1561; Lincoln Cathedral, 160, 1311; Strasbourg Cathedral, 142, 1439; Beauvais Cathedral's tower, 153, 1569; Cologne, 157, 1880; the Washington Monument, 169, 1884; the Eiffel Tower, 300, 1889; and Ulm Minster, 161.53, 1890. Lincoln's tall lead-encased wooden spire was blown down in a storm in 1548, and at Beauvais, in 1573 on Ascension day, the collapse of the tower and crossing vaults halted work again.
import architecture
architecture.structure("pyramid", 146.6, -2570.0, False)
architecture.structure("stpauls", 150.2, 1221.0, True)
architecture.fell("stpauls", 1561.0)
architecture.structure("lincoln", 160.0, 1311.0, True)
architecture.fell("lincoln", 1548.0)
architecture.structure("strasbourg", 142.0, 1439.0, True)
architecture.structure("beauvais", 153.0, 1569.0, True)
architecture.fell("beauvais", 1573.0)
architecture.structure("cologne", 157.0, 1880.0, True)
architecture.structure("washington", 169.0, 1884.0, False)
architecture.structure("eiffel", 300.0, 1889.0, False)
architecture.structure("ulm", 161.53, 1890.0, True)
for s in architecture.tallest_structures():
print(s, architecture.record_until(s, False))
for s in architecture.tallest_buildings():
print(s, "building", architecture.record_until(s, True))
n = why_not(architecture.Structure.strasbourg.tallest_structure)
print(n)beauvais 1573.0
cologne 1884.0
eiffel 10000.0
lincoln 1548.0
pyramid 1221.0
stpauls 1311.0
washington 1889.0
beauvais building 1573.0
cologne building 1890.0
lincoln building 1548.0
stpauls building 1311.0
ulm building 10000.0
rule `architecture.tallest_structure_when_completed` needs architecture.Structure[strasbourg].tallest_structure_when_completed__none1 to be absent, and it is presentThe years agree with the list's own: the pyramid until 1221, Old St Paul's from 1221 to 1311, Lincoln from 1311 to 1548, Beauvais from 1569 to 1573, Cologne as a structure until the Washington Monument of 1884 and as a building until Ulm of 1890, and the Washington Monument until the Eiffel Tower of 1889. record_until gives the earlier of the year a structure fell and the year a taller one was completed after it, and 10000.0 for the Eiffel Tower and for Ulm, which nothing recorded here passed: passed by nothing recorded, not held for ever. The pyramid is ranked with a negative year. Lincoln's fall in 1548 is what lets Beauvais, at 153 metres, take a record in 1569 though it was shorter than Lincoln had been.
Strasbourg is not ranked, and its why_not says why in the program's terms: the rule asks that no taller structure be found, and one was, since Lincoln still stood in 1439. The list calls Strasbourg the tallest structure on Earth "from 1647 to 1874, between the St. Mary's Church spire collapse and the construction of the Church of St. Nicholas". Strasbourg became the tallest when taller ones fell, and the rule asks a narrower question, which structure was the tallest when it was completed. The library answers that question and no other. The Washington Monument's own page gives December 6, 1884 as the day it was topped out and 1888 as the year it was completed, and the list takes the first: a year of completion is a choice, and the record follows it.
3. The list against itself
The list goes on. It gives the Mole Antonelliana in Turin, 167.5 metres, 1889, as "formally tallest building on Earth from 1889 to 1908", and Philadelphia City Hall, 167 metres, 1894, as "Considered to be the tallest building in the world from 1894 to 1908". Ulm Minster's row says it "Was tallest building on Earth from 1890 to 1894", and Cologne's that it was the tallest building until 1890. Written down as the list gives them, the four rows are records a rule can be asked about:
import architecture
architecture.structure("mole", 167.5, 1889.0, True)
architecture.structure("philadelphia", 167.0, 1894.0, True)
print(architecture.tallest_buildings())
print(architecture.record_until("cologne", True), architecture.record_until("mole", True))['beauvais', 'cologne', 'lincoln', 'mole', 'stpauls']
1889.0 10000.0On the list's own heights and years, the Mole is the tallest building from 1889, Cologne's record as a building passes in 1889 and not in 1890, and neither Ulm, at 161.53 metres, nor Philadelphia, at 167, was ever taller than the Mole while it stood. The four sentences cannot all be true of the figures beside them, unless the Mole is not counted as a building; the word "formally" in its row may be that doubt, and the program cannot read it. A page that keeps a record in prose can say four things at once. A rule over the same figures says one, and names the record that makes the difference.
4. A tower that tips
The Leaning Tower of Pisa is known for its nearly four-degree lean, the result of an unstable foundation. Its page gives the height from the ground floor as 55.863 metres, the outer diameter of the base as 15.484 metres, and the angle of slant as "3.97 degrees or 3.9 m from the vertical". The library's model is a straight tower of even weight: its centre of mass is half the top's offset from the vertical, and it tips when that passes the edge of its base.
shift: real = offset / 2.0
radius: real = base / 2.0
if t.shift > t.radius:
t.tips = Trueimport architecture
off = architecture.top_offset(55.863, 3.97)
print(off, architecture.lean_degrees(3.9, 55.863))
architecture.tower("pisa", 55.863, 3.9, 15.484)
architecture.tower("pisa1990", 55.863, architecture.top_offset(55.863, 5.5), 15.484)
print(architecture.tipping_towers())
s = current(architecture.Tower.pisa1990.shift)
r = current(architecture.Tower.pisa1990.radius)
print(s.value, r.value)
print(architecture.lean_degrees(15.484, 55.863))3.87692974618484 3.9935478684225463
[]
2.6894975497295497 7.742
15.492208116783498A lean of 3.97 degrees on that height puts the top 3.88 metres out, which the page rounds to 3.9, and 3.9 metres out is a lean of 3.99 degrees: the page's two figures agree to the precision it gives them. By 1990 the tilt had reached 5.5 degrees. On the model the tower then shifted its centre of mass 2.69 metres, far inside a radius of 7.742, and it would not tip until a lean of 15.49 degrees. The real tower was closed to the public on 7 January 1990, after more than two decades of stabilisation studies and spurred by the abrupt collapse of the Civic Tower of Pavia in 1989, and residences in the path of a potential collapse were vacated.
The danger was the ground, which the model does not see. In 1178 the tower began to sink after construction progressed to the second floor, because of a mere three-metre foundation set in weak, unstable subsoil. Construction was then halted for the better part of a century, while the Republic of Pisa was almost continually at war with Genoa, Lucca and Florence, and that allowed time for the underlying soil to settle; otherwise, its page says, the tower would almost certainly have toppled. The cure was the ground's too. Starting in 1993, 870 tonnes of lead counterweights were added, which straightened the tower slightly, and the tilt was reduced to a safer angle by removing 38 cubic metres of soil from underneath the raised end; the remedial work between 1993 and 2001 reduced the tilt to 3.97 degrees. A rule over a model says what the model says. That a tower which does not tip on the model may still fall is the first thing the library states about its towers.
5. A hull that capsizes
Vasa is a Swedish warship built between 1626 and 1628. The ship sank after sailing roughly 1,300 metres into her maiden voyage on 10 August 1628, and was salvaged with a largely intact hull in 1961 after 333 years on the seabed. Her page states the cause plainly: Vasa was dangerously unstable, with too much weight in the upper structure of the hull, and she sank only a few minutes after encountering a wind stronger than a breeze.
The measure of it is the metacentric height. The metacentric height (GM) is a measurement of the initial static stability of a floating body, calculated as the distance between the centre of gravity of a ship and its metacentre, with KM = KB + BM and BM = I/V, and an excessively low or negative GM increases the risk of a ship capsizing in rough weather, for example HMS Captain or the Vasa. The library takes a box: its centre of buoyancy is half its draught, and BM is its beam squared over twelve times its draught. Those two forms are the library's derivation from the page's equations, not a published formula, and a hull is unstable where GM is not positive:
kb: real = draught / 2.0
bm: real = beam * beam / (12.0 * draught)
gm: real = (0.5 * kb + 0.5 * bm - 0.5 * kg) * 2.0
if h.gm <= 0.0:
h.unstable = TrueGM is KB + BM - KG, and the library adds the halves and doubles the sum, which changes no digit of it and keeps a sum of two very large terms from passing the largest real a field can hold.
import architecture
architecture.hull("box", 10.0, 4.0, 4.5)
g = current(architecture.Hull.box.gm)
print(architecture.unstable_hulls(), g.value)
architecture.hull("box", 10.0, 4.0, 3.5)
h = current(architecture.Hull.box.gm)
print(architecture.unstable_hulls(), h.value)['box'] -0.4166666666666661
[] 0.5833333333333339A box 10 metres wide and 4 deep has its centre of buoyancy 2 metres above the keel and BM of 2.08, so with its centre of gravity at 4.5 metres its metacentric height is negative and it is unstable. Lowered to 3.5, the same box has 0.58 and the verdict is withdrawn. The model's ballast lowers the centre of gravity and nothing else. The Vasa's page says her underlying fault was not possible to correct by adding more ballast, and might have required a major redesign. A model can be put right by a number that a ship could not be put right by, and a GM measures stability at small angles of heel only.
6. A room that rings
In 1895, acoustically improving the Fogg Lecture Hall, part of the recently constructed Fogg Art Museum, was considered an impossible task by the senior staff of the physics department at Harvard. The assignment was passed down until it landed on a young physics professor, Wallace Clement Sabine, who deployed sound absorbing materials throughout the hall to cut its reverberation time. His formula, T = V/A · 0.161 s, gives the reverberation time of a room from its volume in cubic metres and its absorption, the sum over its surfaces of each area times the share of sound that surface absorbs. The equation was developed in the late 1890s in an empirical fashion, and the reverberation article gives its constant as about 0.1611. The accomplishment led to his hiring as the acoustical consultant for Boston's Symphony Hall, which his page calls the first concert hall to be designed using quantitative acoustics and the hall's page calls one of the first auditoria designed in accordance with scientifically derived acoustical principles. The hall was inaugurated on October 15, 1900, seats 2,625, and is a rectangular "shoebox", 18.6 metres high, 22.9 wide and 38.1 long.
rt: real = 0.161 * volume / absorption
sabins: real = area * coefficient
r.absorption = sum(s.sabins)import architecture
architecture.room("hall", 18750.0, 1.6, 2.2)
print(architecture.unmeasured_rooms())
architecture.surface("seats", "hall", 1200.0, 0.8)
architecture.surface("walls", "hall", 3000.0, 0.05)
architecture.surface("ceiling", "hall", 900.0, 0.1)
t = current(architecture.Room.hall.rt)
print(architecture.live_rooms(), architecture.dead_rooms(), t.value)
architecture.surface("curtains", "hall", 400.0, 0.6)
u = current(architecture.Room.hall.rt)
print(architecture.live_rooms(), architecture.dead_rooms(), u.value)
architecture.room("cell", 1.0, 0.1, 0.2)
for k in range(10):
architecture.surface("tile" + str(k), "cell", 1.0, 0.1)
a = current(architecture.Room.cell.absorption)
print(a.value, 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1)['hall']
['hall'] [] 2.515625
[] [] 2.0963541666666665
1.0 0.9999999999999999The hall is invented, and before any surface is recorded it is unmeasured: it has a volume and no time, and it is neither too live nor too dead. Seats, walls and ceiling absorb 960, 150 and 90 square metres, 1,200 in all, and 0.161 x 18,750 / 1,200 is 2.52 seconds, longer than the 2.2 wanted. Curtains of 400 square metres absorbing 0.6 of what reaches them bring the absorption to 1,440 and the time to 2.10, inside the range, and the verdict is withdrawn. The absorption is the exact sum of the surfaces' sabins, rounded once, so the order the surfaces are written in does not move it: ten tiles of a tenth make 1.0, where adding them one at a time in floating point makes 0.9999999999999999. Sabine's equation is the whole of the library's acoustics. Eyring's reverberation time equation was proposed by Carl F. Eyring of Bell Labs in 1930 to better estimate the reverberation time in small rooms with relatively large quantities of sound absorption, and it is not here.
7. A channel that falls too little
The Pont du Gard is an ancient Roman aqueduct bridge built in the first century AD to carry water over 50 kilometres to the Roman colony of Nemausus (Nîmes). The bridge stands 48.8 metres high. The Fontaine d'Eure, at 76 metres above sea level, is only 17 metres higher than the repartition basin in Nîmes, and that was enough: the aqueduct's average gradient is only 1 in 3,000, and as little as 1 in 20,000 in some sections. The Pont du Gard itself descends 2.5 centimetres in 456 metres, a gradient of 1 in 18,241, and its page also says that the structure's precise construction allowed an average gradient of 1 cm in 182.4 m.
What the Romans allowed is read two ways. In a translation of Vitruvius's eighth book, "the bed of the channel must have a fall of not less than half a foot to a length of one hundred". The Roman aqueduct article says that Vitruvius recommends a low gradient of not less than 1 in 4800 for the channel. Half a foot in a hundred is one in two hundred, twenty-four times steeper. The library holds both, as two values of one fact, and judges a channel against each:
gradient: real = drop / length
if c.standard == f and f.minimum > -1.0 and c.gradient < f.minimum:
c.too_flat = True
fall("vitruvius", 0.5 / 100.0, "half-a-foot-in-a-hundred")
fall("vitruvius", 1.0 / 4800.0, "one-in-4800")import architecture
architecture.vitruvius()
architecture.channel("nimes", 50000.0, 17.0, "vitruvius")
architecture.channel("bridge", 456.0, 0.025, "vitruvius")
architecture.channel("steep", 1000.0, 10.0, "vitruvius")
print(architecture.flat_channels(), architecture.unsettled())
print(architecture.one_in(50000.0, 17.0), architecture.one_in(456.0, 0.025), architecture.one_in(182.4, 0.01))['bridge', 'nimes'] ['fall vitruvius minimum']
2941.176470588235 18240.0 18240.0The whole aqueduct, 17 metres in 50 kilometres, is one in 2,941, which the page rounds to 3,000. It is too flat under half a foot in a hundred and within one in 4,800, and it is marked too flat because one value puts it there; a channel that is not marked, like the invented steep one, is within every value. The bridge is too flat under both. Its own figures, 2.5 centimetres in 456 metres and 1 centimetre in 182.4, are each one in 18,240, and the page's conclusion is one more. unsettled() names the fact the two readings disagree about, so that a reader who settles it knows which one to settle.
8. The arithmetic
The calculations answer values and write nothing. A lean and an offset are inverse:
return math.degrees(math.atan(offset / height))
t = math.tan(math.radians(math.fmod(degrees, 360.0)))and the offset is the height times t. The lean is taken modulo a full turn first, which math.fmod does exactly, so a lean given past 360 degrees loses no digits on its way to radians.
and a pendulum's period at standard gravity, for a small swing, is two pi times the square root of its length over g, which a constant defined by ISO standard 80000 sets at 9.80665 metres a second squared:
return 2.0 * math.pi * math.sqrt(length / 9.80665)
return 9.80665 * (period / (2.0 * math.pi)) ** 2The pendulum clock was invented by Christiaan Huygens in 1656, and the seconds pendulum, a pendulum with a period of two seconds so each swing takes one second, was widely used to measure gravity. In 1644, even before the pendulum clock, Marin Mersenne first determined the length of the seconds pendulum was 39.1 inches, by comparing the swing of a pendulum to the time it took a weight to fall a measured distance.
import architecture
print(architecture.pendulum_length(2.0), architecture.pendulum_period(39.1 * 0.0254))
print(architecture.lean_degrees(1.0, 14.0))0.9936213855661318 1.9995154654557823
4.085616779974876At standard gravity a seconds pendulum is 0.994 metres long. Mersenne's 39.1 inches, which the page converts to 990 millimetres, are 0.99314 metres, and at standard gravity a pendulum that long swings with a period of 1.9995 seconds, short of two by less than a thousandth of a second. Pendulums still work in buildings: Motioneering designed a 660-tonne steel pendulum for Taipei 101 that serves as a tuned mass damper, suspended from the 92nd to the 88th floor, which sways to offset movements in the building caused by strong gusts. Its page gives no length, so this essay computes no period for it.
The last line is a lean of a top one metre out on a height of fourteen. Each step in the library is rounded once: atan and tan give the correctly rounded value, and degrees and radians round a·180/π and a·π/180 once, so 4.085616779974876 is the double nearest the exact lean. CPython 3.11 prints 4.085616779974877. Every other value a calculation returns in this essay is CPython's to the last digit; the one other number that differs from adding in floating point is the exact sum of Section 6, and it differs on purpose.
9. When two sources disagree
The list's oldest rows hold a record it cannot settle. It gives the Yongning Pagoda in Luoyang a height of 137 to 154.95 metres, or taller, and a year of 516, and says it "Burned to the ground in 534 after being struck by lightning. Was possible tallest structure on Earth at the time it was buit." The Great Pyramid's row hedges to match: tallest "from 2570 BC~ to 516 AD and from 532 to 1221, if Yongning Pagoda surpassed its height, or from 2570 BC~ to 1221 if it wasn't". A height given as a range is two sources in one cell, and the library can hold both:
import architecture
architecture.structure("yongning", 137.0, 516.0, True)
architecture.fell("yongning", 534.0)
update(architecture.Structure.yongning.height, 154.95, "or taller")
print(architecture.tallest_structures())
print(architecture.unsettled())['beauvais', 'cologne', 'eiffel', 'lincoln', 'pyramid', 'stpauls', 'washington']
['fall vitruvius minimum', 'structure yongning height']The pagoda is not ranked. A record is concluded from what a rule does not find, so it holds only if nothing is found under any value, and under its two heights the pagoda is taller than itself. The pyramid keeps its record when it was completed, since the pagoda came three thousand years later. And asked now when the pyramid's record passed, record_until("pyramid", False) refuses, saying that yongning holds two values for height and that unsettled() names it: the list's "if", kept as a refusal rather than a guess. The row's own years differ too, 534 for the fire and 532 for the pyramid's record resumed, and the library would hold those as it holds the heights.
10. What the library leaves out
The library leaves out most of building. It has no loads, materials or foundations, no wind or earthquake, no stability at large angles of heel, no hull but a box, no reverberation formula but Sabine's and no frequency for a time, and no flow of water in a channel. A style is three features, recorded by a reader who has looked; a building no one described has no style and is not of none. A record is over the records written, asks only which structure was the tallest when it was completed, and passes at the first taller record written after it. The tower model sees the structure and not the ground under it, and the ground is where the Leaning Tower's danger was.
Closing
A building's history is a record of what was learned from what fell: a choir vault at Beauvais in 1284 and a tower in 1573, a spire at Lincoln in a storm, a warship a few minutes into her first voyage, a civic tower in Pavia whose collapse spurred the closing of the tower at Pisa. The library keeps a few of those lessons where a reader can run them and ask about them. It makes a family resemblance strict and says which feature a building lacks, keeps the record of height over the records written and shows a page's four sentences disagreeing with its figures, holds two readings of Vitruvius side by side and marks a channel too flat if either does, and refuses to say when a record passed while the height that might have passed it is in doubt. And because each conclusion names the facts it rests on, a fall written in one place, or a surface added to a room, is carried into every verdict that rested on it.