Vol. 1, Issue 2 · Fall 2026
Listing copy names architectural styles loosely, and a single label such as “Craftsman Bungalow” conflates what a house is with how it is shaped and what it is decorated with. This article describes an ontology, written in Prolog, that records a house’s architectural character on four separate axes: movement, style, form and detail. It covers the styles common in California, from the Victorian family through Period Revival, the Spanish-derived group, the modern line and post-war vernacular. The ontology keeps association apart from entailment. Only one relation, a style expressing a movement, licenses inference; typical forms, typical details and routine confusions are recorded as evidence from which nothing is inferred. Details observed by a person can be weighed against the styles that could explain them, with each detail’s weight computed from how many styles claim it rather than fitted, so the division of evidence can be shown and defended in a report. The article also sets out the guards that stop style words modifying something other than the house, such as “Craftsman quality” or “Tudor Drive”, from asserting a style, and records the known limits and contested points of the classification.
This article describes how a program reads architectural style out of listing text, what the resulting columns mean, and how far they can be trusted. It is written for appraisers who use such output, and for anyone maintaining the rules behind it.
Two files do the work, and it is worth knowing which is which:
file |
question it answers |
|---|---|
mls_remarks.pl |
Did the remark say this? |
architectural_styles.pl |
What is this, and what does it relate to? |
The first is a grammar: it reads text and emits columns. The second is a knowledge base: definitions, periods, characteristics and relationships. They are kept apart because they change for different reasons and at different rates — a new way of phrasing “Craftsman” is a grammar change; a decision that Prairie is not a subtype of Arts and Crafts is a change to the ontology (a structured list of the terms and how they relate).
Every query in this article is runnable. A code block beginning with
?- can be pasted after loading the ontology, for example in
Trealla Prolog:
tpl -q architectural_styles.pl
The single most common mistake in architectural classification — and the one multiple listing service (MLS) copy makes constantly — is to treat style, form and detailing as one thing. They are not. A house has all of them, separately.
MOVEMENT a movement, era or regional tradition
expressed BY styles; not itself a style
arts_and_crafts, victorian, bay_tradition
STYLE a specific design vocabulary
craftsman, italianate, spanish_colonial, eichler
FORM the shape of the building
bungalow, foursquare, ranch, farmhouse, hacienda
DETAIL a visible feature
exposed_rafters, half_timbering, mansard_roof
So one house produces flags on several axes at once:
"Classic 1912 Craftsman bungalow with art glass and deep eaves."
movement_arts_and_crafts = true
style_craftsman = true
form_bungalow = true
detail_art_glass = true
detail_deep_eaves = true
That is far more faithful than forcing a single value
"Craftsman Bungalow", because it can also represent the
cases where the axes come apart:
"Two story Arts and Crafts home." movement only — not a bungalow
"Charming California bungalow." form only — not Arts and Crafts
"Built-ins and exposed rafters." detail only — asserts no style at all
"Contemporary home on a ranch plan." style_contemporary + form_ranch
The axes are recorded separately. They are not statistically independent, and the ontology does not pretend otherwise. A Craftsman is usually a bungalow; a Spanish Colonial usually has a tile roof. Those associations are real and useful.
The rule is that association is evidence, never entailment (an automatic conclusion: if A, then always B):
P(bungalow | craftsman) is high
craftsman -> bungalow is false
(Read: most Craftsman houses are bungalows; but “every Craftsman is a bungalow” is false.) If the ontology encoded the second, every Craftsman in the dataset would silently assert bungalow — including the two-story Craftsman houses that are nothing of the kind. The reverse rule would be worse still: every bungalow, Chicago bungalows and plain builder work included, would assert Craftsman and with it Arts and Crafts. The association is left in the data, where a regression can find it, rather than manufactured by the rules, where it would be indistinguishable from evidence.
Every column exists on every row, with a default, so a missing value never means “column absent”.
| prefix | count | type | default |
|---|---|---|---|
movement_ |
3 | boolean | false |
style_ |
33 | boolean | false |
form_ |
5 | boolean | false |
detail_ |
44 | boolean | false |
Several flags on one axis firing together is normal, not an error. Bay Area stock from 1900–1930 is frequently Craftsman with Shingle, Tudor Revival or Colonial Revival elements mixed in; blending is the norm in that period, and the columns record what the text actually said.
Roof form is the single most reliable discriminator between several styles that are otherwise easily confused, so it is worth learning to read.
Two of those distinctions do real work:
Steep gable vs steep hip separates Tudor Revival (gable, usually with half-timbering) from French Normandy (hip, usually with a round entry turret). Both are routinely called Tudor in listing copy.
The catslide separates English Cottage from both.
Gable, hip, gambrel and catslide are recorded as detailing (so are
shed and mansard), and the weighting does the rest: a gambrel is claimed
by Dutch Colonial alone in this ontology and so carries a full point, a
hip and a catslide are each claimed by two styles and carry half, and a
gable is claimed by four and carries a quarter. That is the right
ordering. A gable is the commonest roof in the state and says
correspondingly little. A gambrel says the most, but only within this
ontology: the Shingle Style also uses it (see Figure 2), which is a candidate addition to
typical_detail/2.
Massing (the overall three-dimensional bulk and arrangement of the building) distinguishes the two commonest historic forms:
Neither implies a style. A bungalow may be Craftsman, Spanish, or plain builder work; a Foursquare was built in Craftsman, Prairie, Colonial Revival and vernacular dress alike.
Three, and each is a different kind of thing — which is itself worth noticing, because it is the reason they share an axis rather than sitting among the styles.
A late-nineteenth-century British design movement, not a house style: a reaction against ornate Victorian design and mass-produced industrial building, emphasizing simplicity, craftsmanship, natural materials and buildings appropriate to their setting.
More than one style expresses it, which is precisely why it belongs on the movement axis. In America the style most closely associated with it is Craftsman, and in California most often the Craftsman bungalow — but a Greene and Greene ultimate bungalow, a Stickley-influenced Foursquare and a two-story Arts and Crafts house are all Arts and Crafts and none of them is the compact bungalow the word usually names.
?- describe(arts_and_crafts).Strictly an era and family, roughly 1840–1910, covering several ornate and picturesque styles — in California particularly Italianate, Stick/Eastlake and Queen Anne.
It sits on the movement axis for want of a fifth axis, and that should be said plainly. San Francisco trade usage speaks of “a Victorian” as though it were a style, so it has to be emitted; it is not one. Note also that the dates do not stop at Queen Victoria’s death in 1901 — houses in these styles kept being built.
A regional tradition running through three generations: unpainted redwood or cedar, informal plans that follow the site rather than a style book, and a preference for regional material over imported vocabulary.
Distinct from Midcentury Modern, which is International-derived. This line is regionalist and material-led, and usually one-off architect work.
The American style derived from the movement, and in California most often executed as the Craftsman bungalow. Visible craftsmanship rather than applied ornament.
Exposed wood construction — rafters, brackets, beams, substantial porch posts
Broad low- or moderately-pitched roof with deep eaves
Prominent porch on heavy tapered or square columns
Multi-paned upper sashes, often over plain lower sashes
Built-in cabinetry, benches, bookcases and inglenook fireplaces
Natural materials — wood shingle or siding, river rock, clinker brick
The one containment in this part of the ontology:
naming Craftsman also sets movement_arts_and_crafts. Every
Craftsman is Arts and Crafts.
Wright-derived, contemporaneous with Craftsman, and sharing much of its detailing — which is exactly why the detail axis infers no style.
Strong horizontal emphasis; massing wider than tall
Low-pitched hipped roof with wide overhanging eaves
Bands of windows, often with art glass
Massive central chimney
Prairie is NOT a child of Arts and Crafts. Prairie School developed alongside the movement and was influenced by it. Whether Prairie belongs to the movement is contested (Wright was a founding member of the Chicago Arts and Crafts Society); the ontology records it as influence so that nothing infers from it. Containment would make every Prairie house assert Arts and Crafts, which the history does not settle:
?- influenced_by(prairie, arts_and_crafts).
true.
?- expresses(prairie, arts_and_crafts).
false.Three generations — First Bay, Second Bay and Sea Ranch — spanning
some seventy years, previously collapsed into one label. All three set
movement_bay_tradition. The Shingle Style, treated first,
is related to the line but does not set it.
A continuous wood-shingle skin stretched over irregular massing, subordinating detail to surface. Unbroken shingle cladding over walls and roof alike · irregular, asymmetrical massing · minimal trim, openings cut into the surface.
Closely connected to the First Bay Tradition in Northern California,
and recorded as related to it rather than under it: the
tradition draws on the style, but a Shingle Style house is not thereby
Bay Tradition work.
The housing stock is better represented than the listing
copy. The style is present in the older Bay Area neighborhoods,
but agents rarely name it — such a house is described as a Craftsman, an
Edwardian, or simply by its shingles. A low count in the
style_shingle column therefore says more about the
vocabulary of listing text than about what is standing.
Bernard Maybeck, Ernest Coxhead, Willis Polk, some of Julia Morgan. Closely tied to Arts and Crafts and the Shingle Style; vernacular building adapted to landscape. Berkeley and the Oakland hills.
William Wurster, Gardner Dailey, Joseph Esherick. Simpler, regional, wood-oriented modernism. This is the generation usually meant by the bare phrase “Bay Region style”.
Esherick and MLTW — Moore, Lyndon, Turnbull, Whitaker — with Halprin’s landscape plan. Inherits the regionalism but is not synonymous with the Second Tradition. Shed roofs, unpainted vertical siding, no eaves or trim.
Three subtypes, all of which set movement_victorian,
plus one period that deliberately does not.
The most familiar subtype, and in San Francisco the one usually meant by “Victorian” without qualification.
Asymmetrical facade and complex roofline · corner turret · wraparound porch with turned posts · patterned shingles in gable ends · spindlework.
Very common in San Francisco, particularly the flat-front and slanted-bay row houses of the Mission and Western Addition.
Bracketed cornice, often deep · tall narrow windows, frequently round-headed · flat or very low-pitched roof behind a parapet · slanted or squared bays.
Applied vertical and diagonal boards expressing — or decorating — the frame beneath. Transitional between Italianate and Queen Anne, and often mixed with both.
A Bay Area real-estate and preservation term for early-twentieth-century residential work, especially San Francisco. Not a Victorian subtype: it is the following era, and in San Francisco it effectively means the architecture of the post-1906 rebuilding.
Primarily a period designation rather than a discrete formal style — generally plainer than late Victorian work, often incorporating Classical Revival, Craftsman or transitional detailing. A classifier should not treat it as having a fixed set of characteristics, which is why it has no parent and few typical details.
The group most often mislabeled, and the labels most worth getting right.
Steeply pitched front-facing gables · half-timbering with stucco or brick infill · tall narrow casements in groups · massive chimney.
Routinely over-applied in California listing copy to any steep-roofed Period Revival house. The two readings it usually displaces:
Small, asymmetrical, picturesque. The distinguishing absence is half-timbering; the distinguishing presence is the catslide roof sweeping low, sometimes to head height, over the entry. Arched plank entry door.
Steeply pitched HIPPED roof — the clearest separation from Tudor · round or polygonal entry turret, often housing the stair · brick, stone or stucco.
?- setof(X, confusable(tudor, X), Xs).
Xs = [english_cottage, french_normandy].Deliberately whimsical: exaggerated rooflines, false thatch, turrets, crooked detail. A real Bay Area and Southern California idiom — but the word is also loose marketing copy, and “storybook charm” asserts nothing.
Symmetrical facade with centered entry · classical entry surround · balanced double-hung sashes. Not to be confused with Spanish Colonial Revival, which shares only the word — see Section 12.
The gambrel roof, claimed by Dutch Colonial alone in this ontology, shares little with the symmetrical Georgian-derived form, which is why it is separated. Full-width shed dormer.
Reproduces the classical vocabulary rather than quoting it at domestic scale: full-height portico with columns and pediment, strict symmetry.
Four siblings, deliberately without an umbrella parent: the boundaries between them are genuinely contested, and inventing a family would assert a taxonomy the trade does not share. Tuscan, treated last, is a later tract idiom recorded beside them, not a fifth sibling. The chronology is the clearest way in.
First of the group, taking its vocabulary directly from the California missions. Plainer and earlier than what followed.
Curvilinear shaped parapet — the espadaña gable · arcaded porch or walkway · smooth stucco with large unornamented surfaces · quatrefoil window.
The later, broader and far more elaborate vocabulary that supplanted Mission Revival, drawing on Spain and Latin America rather than the missions alone.
White or cream stucco · low-pitched red clay tile roof with little eave overhang · arched openings · wrought iron grilles and balconets · asymmetrical massing, often around a courtyard.
Broader and more eclectic, usually larger, mixing Italian and Renaissance sources with Spanish ones. The boundary with Spanish Colonial is contested and porous — this article does not pretend otherwise.
Uniquely Californian, and two things sharing a name. The historic Monterey Colonial (1830s–40s) is a hybrid of Spanish/Mexican adobe construction with Anglo-American and New England elements — the Larkin House in Monterey is the prototype. The Monterey Revival (1920s–40s) is the later revival, built mostly by speculative builders.
One identifier serves both, because MLS copy almost never distinguishes them and in California a listing saying “Monterey” means the revival in nearly every case.
The California tract idiom. Heavy textured stucco · stacked stone veneer · arched entries · faux-aged finishes · prominent front-facing garage.
Recorded as its own style rather than folded into Mediterranean, because it is a distinct market period, which a model can test separately from Mediterranean; that matters more for valuation than its stylistic ancestry.
Vertical emphasis · stepped or setback massing · zigzag and chevron ornament.
The horizontal successor to Art Deco, borrowing from ocean liners. Rounded corners · horizontal speed lines · glass block, porthole windows, pipe railings · flat roof, smooth pastel stucco.
The two are frequently conflated and look nothing alike: Deco is vertical and ornamental, Moderne horizontal and smooth.
European modernism as it reached California through Neutra and Schindler. Flat roof, no eave, no ornament · smooth unbroken white wall plane · ribbon windows and cantilevers.
Deliberately placeless — which separates it from the Bay Tradition, regionalist and wood-led, and from Midcentury, its later and more domestic American development.
Open plan · low horizontal massing · large glazing, often floor to ceiling · clerestory windows · post-and-beam left visible · flat or low-pitched roof with wide overhang.
Joseph Eichler’s tract modernism. Strictly a builder rather than a style, but the trade uses it as a style designation and attaches a higher price to Eichlers in Palo Alto, Sunnyvale, San Rafael and Walnut Creek — reason enough for its own identifier in an appraisal ontology, whatever an architectural historian would say.
Post-and-beam with exposed beams · floor-to-ceiling glass to private rear yards behind a blank street facade · central atrium entry · radiant-heated slab.
Several shed roofs meeting at odd angles · vertical wood siding · minimal ornament · deliberately site-responsive. Sea Ranch is its most distinguished expression rather than a synonym.
The compact, almost ornament-free house of the late Depression, the war years and immediately after — the direct precursor to the mass post-war Ranch, and enormously common in California. Conspicuously absent from most style lists because it is unglamorous.
Compact, usually single story · low or moderate roof pitch, close eaves · a vestigial front-facing gable as the only gesture.
Limitation. This is a preservation term. Agents write “starter home” or “1940s cottage”, so the flag will rarely fire from listing text and is far better derived from structured data — year built, small footprint, single story.
Both a style and a form, and the two are recorded separately because they come apart:
| style_ranch | form_ranch | |
|---|---|---|
| tract ranch | ✓ | ✓ |
| 2020 contemporary, ranch plan | ✓ | |
| Ranch-influenced split-level | ✓ |
Long, low, ground-hugging · low-pitched roof with wide eaves · attached street-facing garage · picture window · indoor-outdoor planning to a rear patio.
A genuine contemporary style vocabulary, and a different thing from the rural vernacular form it borrows from. Board-and-batten siding, usually white or very dark · standing-seam metal roof · black-framed windows · large simple gables.
A 1900 farmhouse is the form without the style; a 2021 build is usually the style and was never a farm.
Suburban work combining historical motifs without committing to any one of them: fragments of several revivals on one elevation, mixed cladding, prominent projecting garage. Far better than calling everything built after 1980 “Contemporary”.
Limitation. Agents never write the word, so this will effectively only appear in trade or appraisal text.
Design emphasizing the architectural vocabulary current at the time of construction rather than adherence to a historical revival.
The term is fixed at the date of construction: it means current then. A 1975 California house is properly Contemporary and does not stop being so as the decades pass. A Contemporary house may also borrow historical references, so “no historical vocabulary” is too strict a reading.
Five, and none of them implies a style.
form |
definition |
|---|---|
bungalow |
Low, compact, one or one-and-a-half stories, usually with a prominent front porch |
foursquare |
Boxy two-story cube, low hipped roof with central dormer, full-width porch, four rooms to a floor |
ranch |
Long, low, single story |
farmhouse |
Rural vernacular shape — simple gabled volume, often with a porch and later additions |
hacienda |
A courtyard plan: single story, rambling, rooms around an open court |
hacienda is on this axis deliberately.
In California MLS copy the word means almost anything vaguely Spanish
and sprawling, so it carries no stylistic inference.
Forty-four flags, chosen for discriminating power rather than
completeness. stucco and
low-pitched roof were considered and rejected: they appear
on nearly everything in California and would add noise rather than
signal. Roof shape is the exception, and is recorded: a gable is nearly
as common as stucco, but the weighting handles that by giving it a
quarter of a point, while a gambrel, claimed by one style, carries a
full one.
group |
details |
|---|---|
| Arts and Crafts | exposed_rafters, box_beams, built_ins, tapered_columns, deep_eaves, knee_braces, river_rock, stone_piers, divided_light, art_glass, wainscoting, window_seat |
| Victorian | turret, fishscale_shingles, spindlework, bracketed_cornice, wraparound_porch, bay_window, pocket_doors, mansard_roof |
| Tudor / storybook | half_timbering |
| Spanish / Mission / Monterey | clay_tile_roof, mission_parapet, arcade, arched_openings, wrought_iron, courtyard, second_story_balcony, adobe |
| Modern | post_and_beam, atrium, floor_to_ceiling_glass, clerestory, radiant_slab, band_windows, glass_block |
| Siding and roof shape | board_and_batten, shingle_siding, shed_roof, gable_roof, hipped_roof, gambrel_roof, catslide_roof, porte_cochere |
This is the most important rule in the ontology. No detail
sets a style flag or a form flag — with one exception: the bare
word gambrel also sets style_dutch_colonial —
because the same vocabulary is shared across styles:
?- evidence_of(bay_window, S).
S = [queen_anne, italianate, stick, edwardian].
?- evidence_of(clay_tile_roof, S).
S = [mission, spanish_colonial, mediterranean, monterey].
?- evidence_of(deep_eaves, S).
S = [craftsman, prairie].A remark listing five Victorian details and naming no style sets zero style flags. Whether those details add up to a style is a judgment, and the program leaves it to the valuation engineer (VE) — but the section on weighing observed detail shows how.
The ontology records six kinds of relationship. Only one of them licenses inference. This distinction is the safety property of the whole design.
relation |
licenses inference? |
example |
|---|---|---|
expresses |
yes — containment | craftsman →
arts_and_crafts |
influenced_by |
no | prairie ←
arts_and_crafts |
related |
no | sea_ranch ↔︎
shed_style |
typical_form |
no | craftsman ~
bungalow |
typical_detail |
no | craftsman ~
exposed_rafters |
confused_with |
no | english_cottage ↔︎
tudor |
In the examples: → expresses (is contained in); ← influenced by; ↔︎ either way; ~ typically has.
There are seven containment rules, and every one maps a style to a movement. There are no style-to-style containments:
movement_arts_and_crafts ──┬── style_craftsman
└── (prairie is influence only)
movement_victorian ────────┬── style_queen_anne
├── style_italianate
└── style_stick
movement_bay_tradition ────┬── style_first_bay_tradition
├── style_second_bay_tradition
└── style_sea_ranch
All of these run after loading
architectural_styles.pl.
A full record
?- describe(english_cottage).
english_cottage [style]
period: 1920-1940
in California: common
Small, asymmetrical and picturesque Period Revival, frequently miscalled
Tudor. The distinguishing absence is half-timbering; the distinguishing
presence is the rolled or catslide roof sweeping low over the entry.
characteristics:
- Steep roof sweeping low, sometimes to head height, over the entry
- Asymmetrical, cottage-scaled massing
- Stucco, brick or stone; little or no half-timbering
- Arched plank entry door
typical detailing (evidence, not entailment):
- catslide_roof
routinely confused with:
- storybook
- tudor
What expresses a movement
?- styles_of(bay_tradition, S).
S = [first_bay_tradition, second_bay_tradition, sea_ranch].What was being built in a given year
?- era(1925, S).What a detail is evidence for, and what a style’s detailing is
?- evidence_of(half_timbering, S).
S = [tudor].
?- evidence_for(eichler, D).
D = [post_and_beam, atrium, floor_to_ceiling_glass, radiant_slab].Which pairs get mixed up
?- confusable(A, B).Check the ontology after editing it
?- check.
ontology OK
check/0 verifies eight structural invariants — every
style has a definition and a period, every containment parent is a
movement and every child a style, every referenced detail and form
exists, nothing is both a style and a movement. Run it after any
edit.
Nothing in this program reads photographs. There is no vision model and no feature detector. The input below is a list of detail names typed by a person who has looked at the house or its photographs and decided what they see. What the ontology contributes is the arithmetic afterwards: given a set of observed details, how does the evidence divide among the styles that could explain it.
That division is the useful part, because it is the step an appraiser otherwise does in their head and cannot show anyone. Given the details observed across several photographs of one house:
?- report([exposed_rafters, tapered_columns, knee_braces, built_ins, deep_eaves]).
observed: [exposed_rafters,tapered_columns,knee_braces,built_ins,deep_eaves]
evidence divides as:
70.0% craftsman
20.0% prairie
10.0% first_bay_tradition
movement support:
arts_and_crafts 3.5000
bay_tradition 0.5000
Read that as: mostly Craftsman, with the remaining 30% divided between Prairie and the First Bay Tradition. Neither of those expresses Arts and Crafts: Prairie is recorded as influenced by the movement and the First Bay Tradition belongs to the Bay Tradition, which is why the movement support below the division credits Arts and Crafts with Craftsman’s share alone. Movement support is in weight points: the five details carry five points in all, and Craftsman’s 3.5 of them is its 70%.
Specificity is computed, not declared. A detail
claimed by one style discriminates; a detail claimed by six barely does.
The weight is the inverse of how many styles claim it, and it falls out
of typical_detail/2 with no hand-tuned table:
| detail | claimed by | weight |
|---|---|---|
tapered_columns |
craftsman only | 1.00 |
deep_eaves |
craftsman, prairie | 0.50 |
bay_window |
four Victorian styles | 0.25 |
That matters for defensibility. There is no coefficient anyone can accuse the VE of fitting: the only inputs are which details belong to which styles, and a disagreement is about one fact, in one place, that changes the arithmetic transparently.
?- report([exposed_rafters, deep_eaves, band_windows, art_glass]).
observed: [exposed_rafters,deep_eaves,band_windows,art_glass]
evidence divides as:
37.5% prairie
37.5% craftsman
12.5% international
12.5% first_bay_tradition
movement support:
arts_and_crafts 1.5000
bay_tradition 0.5000
A tie, and it should be. Taken together, those four details do not separate Craftsman from Prairie: two are shared, and the two that are not point one each way — the ontology says so directly, that Prairie shares much of the Craftsman detailing. A black-box classifier could have picked one and returned a confident number. This tells the VE that the photographs do not contain the discriminating evidence, and by implication what to go and photograph: the roof form and the massing, where the two actually differ. The two smaller shares come from details each shared with one further style: band windows with the International Style, and exposed rafters with the First Bay Tradition.
The output says how the observed detailing divides among the styles that could explain it. That is an honest claim and a different one from a calibrated probability, which would have to come from a model fitted on real photographs. This is the logical layer such a model would feed, not a substitute for it.
What a vision system would have to add, if one were built, comes to three things. First, a program that recognizes each detail in a photograph. Second, its scores would have to be checked so that, for each detail, among houses given a score of about 0.8, the detail is present in about 80%. Third, it would have to be trained on photographs like the ones it will be shown. None of that exists today. The ontology is deliberately the easier half of the problem.
California listing copy is full of style words that are modifying something other than the house. A naive word-matcher fails on every one of these, and each was a real failure during development:
"Craftsman quality throughout." workmanship
"Colonial doors and trim." a door profile
"Victorian molding and high ceilings." a molding profile
"Enjoy the Mediterranean climate." the weather
"Contemporary living at its finest." marketing
"Ranch lifestyle in the country." not a house
"Quiet mid-century neighborhood." the neighborhood
"Desirable Eichler neighborhood." next door to one is not being one
"Walk to Mission schools." a school district
"Home on Prairie Street." a street
"Tudor Drive location." a street
"A home with storybook charm." puffery
"Spanish tile roof." a roofing material
"Drive to Monterey Bay in an hour." a bay
All of them now produce no style flag. The failure is generic — a style word followed by a non-house noun — so the guard is generic too: one list of non-house nouns applied to every bare style word, rather than a special case per style.
Three guard mechanisms are in use:
guard |
example |
|---|---|
| next word is a non-house noun | quality, doors,
climate, neighborhood, Drive |
| previous word changes the meaning | Spanish
colonial, Sea Ranch,
horse ranch |
| the bare word is removed entirely | mission — a district, a
street and a saint before it is a style |
"Spanish tile roof" deserves a note. The style flag is
suppressed because Spanish is modifying a roofing material
— but detail_clay_tile_roof still fires, so the evidence is
kept without the style being asserted.
Recorded here rather than hidden, because a reader who knows the field will find them anyway.
victorian is an era, not a movement. It
sits on the movement axis for want of a fifth axis. Trade usage treats
it as a style; it is not one.
Prairie is recorded as influence, not containment. Whether the Prairie School belongs to the Arts and Crafts movement is contested: Wright was a founding member of the Chicago Arts and Crafts Society. The ontology records Prairie as influenced by the movement rather than expressing it, so that a Prairie flag never asserts Arts and Crafts.
The Spanish group has no umbrella. Mission, Spanish Colonial, Mediterranean and Monterey are siblings because their boundaries are genuinely contested. Inventing a parent would assert a taxonomy the trade does not share.
monterey conflates two styles — the
1830s Colonial and the 1920s Revival — because MLS copy does.
eichler is a builder, not a style.
Included because the trade uses it as one and attaches a higher price to
Eichlers in Palo Alto, Sunnyvale, San Rafael and Walnut Creek.
Two flags will barely ever fire from listing text —
minimal_traditional and neo_eclectic are
preservation and trade terms that agents do not write. Both are better
derived from structured data.
bay_window may be too common to be
useful in San Francisco, where it is near-universal on
Victorians and Edwardians. It is kept for the contrast with ranches and
marked for review.
The scoring covers only styles with recorded detailing. Seven styles — Colonial Revival, Neoclassical, Tuscan, Art Deco, Ranch, Neo-Eclectic and Contemporary — have no typical details in the ontology, so no set of observed details can ever return them, and five of the seven are common or very common in California. Seven detail flags are claimed by no style and carry no weight. A share of evidence is therefore a division among the styles the ontology can score, not among all thirty-three. Likewise the confusion pairs are those met in practice so far: nineteen styles appear in none, which records an absence of data, not an absence of confusion.
Still absent: Second Empire and Gothic Revival from the Victorian family; Beaux-Arts and Italian Renaissance; and on the form axis split-level, townhouse, duplex, cabin, A-frame and loft.
The pencil sketches in this article were generated with Grok, at the editor’s direction and for this article. They are illustrations of a type rather than records of particular buildings. Where a sketch carries an architect’s name it shows work characteristic of that architect, not a house they built, and nothing in any of them should be read as documentation of an existing property. A generated image can also be wrong in detail in ways a photograph cannot: each has been checked against the description it illustrates, and the one place where a sketch and the text differ — the Tuscan villa, which omits the front-facing garage of the tract idiom the section defines — is noted in its caption.
The photographs are a different matter. They were chosen for their rights as much as for what they show, and come from two collections at the Library of Congress.
HABS — the Historic American Buildings Survey, at the Library of Congress, is the cleanest source for publishable images: explicitly public domain, high-resolution, professionally photographed, and created specifically to document architecture.
Library of Congress, HABS/HAER/HALS collection (address in the references)
The Carol M. Highsmith Archive is the color counterpart: buildings photographed across the country from 1980 onward and given by the photographer to the Library, which records no known restrictions on publication.
National Register nomination photographs are a different matter. They are often contributed by state or local preservation staff rather than federal employees, which is why the National Park Service (NPS) points at its own content and copyright guidance rather than declaring the documentation public domain. They are excellent research material and risky publication material.
The corpus tooling behind this work reflects that split. Every
photograph carries a rights_status defaulting to
unknown, and the publishable_photos view
admits an image only on a positive determination with an attribution
line where one is required. Nothing becomes publishable by
omission. All six photographs in this article pass that
test.
The program files and their tests are published with this article as
a separate download, Prolog code (zip), on the article’s page.
The ontology is a single Prolog file with no dependencies outside the
Prolog systems themselves: it uses the standard list library, and under
Scryer two further standard libraries (below). Every query and output
shown in this article was checked under SWI-Prolog. The test suite and
the printed check, describe and
report examples were also run under Trealla (Trealla Prolog contributors,
n.d.), against which the ontology was first written, and under
Scryer Prolog, and the three systems print the same text. The facts, the
relations and the query predicates are plain ISO-standard Prolog. The
three printing predicates — describe/1,
check/0 and report/1 — use
format/2 and forall/2, which are not ISO:
Trealla and SWI-Prolog build them in, and Scryer keeps them in two
libraries that the file loads for itself where they exist. Both files
are reproduced at the end of this article: the ontology in full in
Appendix 17, and the architectural section of
the grammar in Appendix 18.
The ontology ships with a test suite of 50 cases covering its structural invariants, its query predicates and the scoring: the weights, the roof-shape distinctions and both divisions of evidence printed in this article are asserted there, so a change to the ontology that would falsify a printed figure fails a test first. The tests avoid the printing predicates, and pass under Trealla, SWI-Prolog and Scryer Prolog.
| file | what it is |
|---|---|
architectural_styles.pl |
the ontology: definitions, relations, scoring |
mls_remarks.pl |
the grammar: text in, columns out |
The definitions here follow the standard American style guides, read against California practice. McAlester (2013) is the reference the others are measured against, and its treatment of form and of the free classic Queen Anne underlies the separation of form from style used here. Whiffen (1969) is the older scholarly account of the same ground; Poppeliers and Chambers (2003) and Blumenson (1981) are the short illustrated guides an appraiser is most likely to have to hand, and their vocabularies are the ones that reach listing copy.
For the California material the article relies on Kirker (1960) for the nineteenth-century styles, Longstreth (1983) for the Bay Tradition and its first generation, Winter (1980) for the bungalow, and Gebhard and Winter (2003) for the Period Revival and Spanish-derived work of Southern California. The ranch is documented from both ends of its history: May (1946) as it was sold, and Hess (2004) as it is now read.
The practice of recording style as a data field, rather than as prose, follows the National Register: National Park Service (1997a) for what a style claim has to carry, National Park Service (1997b) for the architectural classification the registration form requires, and Ames and McClelland (2002) for post-war residential development, which is where the vernacular categories here come from. The Getty’s J. Paul Getty Trust (n.d.) is the nearest existing controlled vocabulary for styles and periods; it is broader and shallower than what is needed to read a listing, and it does not separate the four axes used here.
The photographs come from the Library of Congress: HABS (Library of Congress, n.d.-b) and the Carol M. Highsmith Archive (Library of Congress, n.d.-a).
architectural_styles.plThis is the knowledge base described in this article, reproduced complete as it stood when the issue went to press. It was run under Trealla, SWI-Prolog and Scryer Prolog, and needs only the standard list library and, under Scryer, the two further standard libraries described in the section on software availability. The comments at lines 827 and 848–849 imply a second style expressing Arts and Crafts; there is none (Section 11).
% SPDX-License-Identifier: AGPL-3.0-or-later
% Copyright (C) 2026 William Bert Craytor. Published by The Valuation Engineer
% Journal (Pacific Vista Net). This program is free software: you can
% redistribute it and/or modify it under the terms of the GNU Affero General
% Public License as published by the Free Software Foundation, either version 3
% of the License, or (at your option) any later version. It is distributed
% WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY or
% FITNESS FOR A PARTICULAR PURPOSE; see the COPYING file beside it or
% <https://www.gnu.org/licenses/agpl-3.0.html>.
/* architectural_styles.pl — the architectural ontology as a knowledge base.
This file is NOT the parser. mls_remarks.pl reads listing text and emits
columns; this file says what the resulting names MEAN, how they relate, and
what each style looks like. Keeping them apart matters: the grammar answers
"did the remark say this?", the ontology answers "what is this?", and the
two change for different reasons and at different rates.
FOUR AXES, orthogonal but not independent. A house has a movement, a style,
a form and detailing, recorded separately. The associations among them are
EVIDENCE, not logical entailment:
P(bungalow | craftsman) is high
craftsman -> bungalow is false
Only expresses/2 is containment and licenses inference. influenced_by/2,
related/2, typical_form/2, typical_detail/2 and confused_with/2 are
declarative: they record what is known without letting it become a
conclusion.
Entry points:
describe(+Id) print a full record
styles_of(+Movement, -Ss) the styles expressing a movement
confusable(?A, ?B) pairs routinely mistaken for each other
era(+Year, -Styles) styles current in a given year
axis_of(+Id, -Axis)
Definitions follow general architectural usage and California/Bay Area
trade practice. Where the two disagree the trade reading is given, since
this ontology exists to read listing text. Points that are contested rather
than settled are marked in the definition itself. */
:- use_module(library(lists)).
/* Scryer Prolog keeps format/2 and forall/2 in libraries; SWI-Prolog and
Trealla have them built in, and SWI has no library(format) to load. Loading
both under catch/3, after the file, suits all three. */
:- initialization(catch(use_module(library(format)), _, true)).
:- initialization(catch(use_module(library(iso_ext)), _, true)).
/* The facts below are grouped by subject -- each style's period, definition,
characteristics and detailing sit together -- so the clauses of any one
predicate are spread through the file. Declared discontiguous because a
strict ISO system otherwise discards the earlier clauses of each: SWI warns
and carries on, Scryer overwrites, and the ontology then loads incomplete.
See tests/test_architectural_styles.pl. */
:- discontiguous(axis/2).
:- discontiguous(movement/1).
:- discontiguous(style/1).
:- discontiguous(form/1).
:- discontiguous(detail/1).
:- discontiguous(period/3).
:- discontiguous(definition/2).
:- discontiguous(characteristic/2).
:- discontiguous(prevalence/3).
:- discontiguous(expresses/2).
:- discontiguous(influenced_by/2).
:- discontiguous(related/2).
:- discontiguous(typical_form/2).
:- discontiguous(typical_detail/2).
:- discontiguous(confused_with/2).
:- discontiguous(problem/1).
/* ============================================================
AXES
============================================================ */
axis(movement, 'A movement, era or regional tradition. Expressed BY styles; not itself a style.').
axis(style, 'A specific architectural style: a recognisable design vocabulary.').
axis(form, 'The shape of the building, independent of its style vocabulary.').
axis(detail, 'A visible feature. Evidence of style, never proof of it.').
axis_of(Id, movement) :- movement(Id), !.
axis_of(Id, style) :- style(Id), !.
axis_of(Id, form) :- form(Id), !.
axis_of(Id, detail) :- detail(Id).
/* ============================================================
MOVEMENTS
============================================================ */
movement(arts_and_crafts).
movement(victorian).
movement(bay_tradition).
period(arts_and_crafts, 1880, 1930).
definition(arts_and_crafts,
'Late-19th-century British design movement, a reaction against ornate \
Victorian design and mass-produced industrial building. Emphasised \
simplicity, craftsmanship, natural materials and buildings appropriate to \
their setting. A MOVEMENT, not one narrowly defined style: more than one \
style expresses it, and its influence reaches others still.').
period(victorian, 1840, 1910).
definition(victorian,
'Broad American real-estate and preservation family covering several ornate \
and picturesque residential styles, roughly 1840-1910; in California \
particularly Italianate, Stick/Eastlake and Queen Anne. Strictly an ERA and \
family rather than a movement or a style, and placed on this axis for want of \
a fifth: San Francisco trade usage speaks of a "Victorian" as though it were \
a style, so it must be emitted, but it is not one. Note the dates do not stop \
at Queen Victoria''s death in 1901 - houses in these styles kept being built.').
period(bay_tradition, 1890, 9999).
definition(bay_tradition,
'Bay Area regional tradition running through three generations: unpainted \
redwood or cedar, informal plans that follow the site rather than a style \
book, and a preference for regional material over imported vocabulary. \
Distinct from Midcentury Modern, which is International-derived; this line is \
regionalist and material-led, and usually one-off architect work.').
/* ============================================================
STYLES — Arts and Crafts line
============================================================ */
style(craftsman).
period(craftsman, 1900, 1930).
expresses(craftsman, arts_and_crafts).
definition(craftsman,
'The American style most closely associated with the Arts and Crafts \
movement, and in California most often executed as the Craftsman bungalow. \
Visible craftsmanship rather than applied ornament; exposed structure; \
natural materials; earth tones; integration with the landscape.').
characteristic(craftsman, 'Exposed wood construction - rafters, brackets, beams, substantial porch posts').
characteristic(craftsman, 'Broad low- or moderately-pitched roof with deep eaves').
characteristic(craftsman, 'Prominent porch on heavy tapered or square columns').
characteristic(craftsman, 'Multi-paned upper sashes, often over plain lower sashes').
characteristic(craftsman, 'Built-in cabinetry, benches, bookcases and inglenook fireplaces').
characteristic(craftsman, 'Natural materials - wood shingle or siding, river rock, clinker brick').
typical_form(craftsman, bungalow).
typical_detail(craftsman, exposed_rafters).
typical_detail(craftsman, tapered_columns).
typical_detail(craftsman, built_ins).
typical_detail(craftsman, deep_eaves).
typical_detail(craftsman, knee_braces).
typical_detail(craftsman, river_rock).
typical_detail(craftsman, box_beams).
typical_detail(craftsman, art_glass).
prevalence(craftsman, california, very_common).
style(prairie).
period(prairie, 1900, 1920).
influenced_by(prairie, arts_and_crafts).
related(prairie, craftsman).
definition(prairie,
'Wright-derived Midwestern style, contemporaneous with Craftsman and \
sharing much of its detailing. NOT a subtype of Arts and Crafts: Prairie \
School developed alongside the movement and was influenced by it, and \
historians describe it as paralleling rather than belonging to it. \
Containment would make every Prairie house assert Arts and Crafts, which the \
history does not support.').
characteristic(prairie, 'Strong horizontal emphasis; massing wider than tall').
characteristic(prairie, 'Low-pitched hipped roof with wide overhanging eaves').
characteristic(prairie, 'Bands of windows, often with art glass').
characteristic(prairie, 'Massive central chimney').
typical_detail(prairie, band_windows).
typical_detail(prairie, deep_eaves).
typical_detail(prairie, art_glass).
typical_detail(prairie, built_ins).
prevalence(prairie, california, uncommon).
/* ============================================================
STYLES — Bay Area regional line
============================================================ */
style(shingle).
period(shingle, 1880, 1910).
related(shingle, first_bay_tradition).
definition(shingle,
'A continuous wood-shingle skin stretched over irregular massing, \
subordinating detail to surface. Strongly connected to the First Bay \
Tradition in Northern California.').
characteristic(shingle, 'Unbroken shingle cladding over walls and roof alike').
characteristic(shingle, 'Irregular, asymmetrical massing with few corners emphasised').
characteristic(shingle, 'Minimal trim; openings cut into the surface').
typical_detail(shingle, shingle_siding).
prevalence(shingle, california, uncommon).
style(first_bay_tradition).
related(first_bay_tradition, shingle).
period(first_bay_tradition, 1890, 1920).
expresses(first_bay_tradition, bay_tradition).
related(first_bay_tradition, arts_and_crafts).
definition(first_bay_tradition,
'The first Bay Area regional generation - Bernard Maybeck, Ernest Coxhead, \
Willis Polk, and some of Julia Morgan''s work. Closely tied to Arts and \
Crafts and the Shingle Style; vernacular building adapted to landscape. \
Berkeley and the Oakland hills.').
characteristic(first_bay_tradition, 'Unpainted wood shingle skin, weathering to grey').
characteristic(first_bay_tradition, 'Steep site adaptation; entry sequences that climb or descend').
characteristic(first_bay_tradition, 'Exposed structure, often idiosyncratic and hand-worked').
typical_detail(first_bay_tradition, shingle_siding).
typical_detail(first_bay_tradition, exposed_rafters).
prevalence(first_bay_tradition, california, uncommon).
style(second_bay_tradition).
period(second_bay_tradition, 1930, 1965).
expresses(second_bay_tradition, bay_tradition).
definition(second_bay_tradition,
'The second generation - William Wurster, Gardner Dailey, Joseph Esherick. \
Simpler, regional, wood-oriented modernism. This is the generation usually \
meant by the bare phrase "Bay Region style".').
characteristic(second_bay_tradition, 'Plain wood siding or shingle; little ornament').
characteristic(second_bay_tradition, 'Large simple windows; indoor-outdoor planning').
characteristic(second_bay_tradition, 'Modest scale and deliberately unmonumental massing').
typical_detail(second_bay_tradition, shingle_siding).
prevalence(second_bay_tradition, california, uncommon).
style(sea_ranch).
period(sea_ranch, 1963, 9999).
expresses(sea_ranch, bay_tradition).
definition(sea_ranch,
'The third generation, named for the Sonoma coast development: Joseph \
Esherick and MLTW - Charles Moore, Donlyn Lyndon, William Turnbull, Richard \
Whitaker - with Lawrence Halprin''s landscape plan. Inherits the regionalism \
but is not synonymous with the Second Tradition.').
characteristic(sea_ranch, 'Shed roofs, often multiple and at odd angles').
characteristic(sea_ranch, 'Unpainted vertical wood siding; no eaves or trim').
characteristic(sea_ranch, 'Forms shaped by wind and site rather than by style').
typical_detail(sea_ranch, shed_roof).
related(sea_ranch, shed_style).
prevalence(sea_ranch, california, rare).
/* ============================================================
STYLES — the Victorian family
============================================================ */
style(queen_anne).
period(queen_anne, 1880, 1910).
expresses(queen_anne, victorian).
definition(queen_anne,
'The most familiar Victorian subtype and, in San Francisco, the one most \
often meant by "Victorian" without qualification. Picturesque and \
deliberately irregular.').
characteristic(queen_anne, 'Asymmetrical facade and complex roofline').
characteristic(queen_anne, 'Corner turret or tower').
characteristic(queen_anne, 'Wraparound or wrapping porch with turned posts').
characteristic(queen_anne, 'Patterned shingles - fishscale, sawtooth - in gable ends').
characteristic(queen_anne, 'Spindlework and applied ornament').
typical_detail(queen_anne, turret).
typical_detail(queen_anne, fishscale_shingles).
typical_detail(queen_anne, spindlework).
typical_detail(queen_anne, wraparound_porch).
typical_detail(queen_anne, bay_window).
prevalence(queen_anne, california, common).
style(italianate).
period(italianate, 1855, 1890).
expresses(italianate, victorian).
definition(italianate,
'Very common in San Francisco, particularly in the flat-front and \
slanted-bay row houses of the Mission and Western Addition. Vertical \
proportions, classical detail applied to a simple box.').
characteristic(italianate, 'Bracketed cornice, often deep and heavily ornamented').
characteristic(italianate, 'Tall narrow windows, frequently round-headed').
characteristic(italianate, 'Flat or very low-pitched roof behind a parapet').
characteristic(italianate, 'Slanted or squared bay windows').
typical_detail(italianate, bracketed_cornice).
typical_detail(italianate, bay_window).
prevalence(italianate, california, common).
style(stick).
period(stick, 1870, 1895).
expresses(stick, victorian).
definition(stick,
'Stick and Stick-Eastlake: applied vertical and diagonal boards expressing \
- or decorating - the frame beneath. Transitional between Italianate and \
Queen Anne, and often mixed with both.').
characteristic(stick, 'Applied vertical, horizontal and diagonal stickwork on the wall plane').
characteristic(stick, 'Squared bay windows').
characteristic(stick, 'Machine-turned Eastlake ornament at porches and gables').
typical_detail(stick, bay_window).
prevalence(stick, california, uncommon).
style(edwardian).
period(edwardian, 1901, 1920).
definition(edwardian,
'A Bay Area real-estate and preservation term for early-20th-century \
residential work, especially San Francisco c.1900-1920. NOT a Victorian \
subtype and deliberately given no parent: it is the FOLLOWING era, and in San \
Francisco it effectively means the architecture of the post-1906 rebuilding. \
Primarily a period designation rather than a discrete formal style - \
generally less ornate than late Victorian work, often incorporating \
Classical Revival, Craftsman or transitional detailing. A classifier should \
not treat it as having a fixed set of characteristics.').
characteristic(edwardian, 'Plainer wall surfaces than Victorian work; restrained ornament').
characteristic(edwardian, 'Bay windows retained, detail simplified').
characteristic(edwardian, 'Frequently mixed vocabulary - classical, Craftsman or transitional').
typical_detail(edwardian, bay_window).
prevalence(edwardian, california, common).
/* ============================================================
STYLES — Period Revival
============================================================ */
style(tudor).
period(tudor, 1910, 1940).
definition(tudor,
'Tudor Revival. Routinely over-applied in California listing copy to any \
steep-roofed Period Revival house; see english_cottage and french_normandy \
for the readings it displaces.').
characteristic(tudor, 'Steeply pitched front-facing gables').
characteristic(tudor, 'Half-timbering with stucco or brick infill').
characteristic(tudor, 'Tall narrow casement windows in multiple groups').
characteristic(tudor, 'Massive prominent chimney, sometimes with chimney pots').
typical_detail(tudor, half_timbering).
confused_with(tudor, english_cottage).
confused_with(tudor, french_normandy).
prevalence(tudor, california, common).
style(english_cottage).
period(english_cottage, 1920, 1940).
definition(english_cottage,
'Small, asymmetrical and picturesque Period Revival, frequently miscalled \
Tudor. The distinguishing absence is half-timbering; the distinguishing \
presence is the rolled or catslide roof sweeping low over the entry.').
characteristic(english_cottage, 'Steep roof sweeping low, sometimes to head height, over the entry').
characteristic(english_cottage, 'Asymmetrical, cottage-scaled massing').
characteristic(english_cottage, 'Stucco, brick or stone; little or no half-timbering').
characteristic(english_cottage, 'Arched plank entry door').
confused_with(english_cottage, tudor).
confused_with(english_cottage, storybook).
prevalence(english_cottage, california, common).
style(french_normandy).
period(french_normandy, 1920, 1940).
definition(french_normandy,
'French Revival, also called French Normandy or French Eclectic. California \
has substantial numbers, and they too are commonly mislabelled Tudor.').
characteristic(french_normandy, 'Steeply pitched HIPPED roof - the clearest separation from Tudor').
characteristic(french_normandy, 'Round or polygonal entry turret, often housing the stair').
characteristic(french_normandy, 'Brick, stone or stucco, sometimes mixed').
confused_with(french_normandy, tudor).
prevalence(french_normandy, california, uncommon).
style(storybook).
period(storybook, 1920, 1940).
definition(storybook,
'Deliberately whimsical Period Revival, sometimes called Storybook Tudor or \
Hansel-and-Gretel. A real Bay Area and Southern California idiom, though the \
word is also loose marketing copy for anything merely cute.').
characteristic(storybook, 'Exaggeratedly steep and irregular rooflines').
characteristic(storybook, 'False thatch - rolled eaves imitating a thatched roof').
characteristic(storybook, 'Turrets, undulating walls, deliberately crooked detail').
confused_with(storybook, english_cottage).
prevalence(storybook, california, rare).
style(colonial).
period(colonial, 1890, 1955).
definition(colonial,
'American Colonial Revival: symmetrical, classically detailed, derived from \
Georgian and Federal precedent. Not to be confused with Spanish Colonial \
Revival, which shares only the word.').
characteristic(colonial, 'Symmetrical facade with centred entry').
characteristic(colonial, 'Classical entry surround - pilasters, pediment, fanlight').
characteristic(colonial, 'Double-hung sash windows in balanced pairs').
confused_with(colonial, spanish_colonial).
prevalence(colonial, california, common).
style(dutch_colonial).
period(dutch_colonial, 1895, 1940).
definition(dutch_colonial,
'Visually distinctive enough to warrant separation from Colonial Revival: \
the gambrel roof is unmistakable and shares little with the symmetrical \
Georgian-derived form.').
characteristic(dutch_colonial, 'Gambrel roof - two pitches to a side, the lower much steeper').
characteristic(dutch_colonial, 'Full-width shed dormer front and often rear').
prevalence(dutch_colonial, california, uncommon).
style(neoclassical).
period(neoclassical, 1895, 1950).
definition(neoclassical,
'Reproduces the classical vocabulary rather than quoting it at domestic \
scale, which is what separates it from Colonial Revival.').
characteristic(neoclassical, 'Full-height portico with columns and pediment').
characteristic(neoclassical, 'Strict symmetry').
characteristic(neoclassical, 'Correct classical orders rather than free adaptation').
confused_with(neoclassical, colonial).
prevalence(neoclassical, california, rare).
/* ============================================================
STYLES — the Spanish-derived group
Siblings, deliberately without an umbrella parent: the boundaries between
them are genuinely contested and inventing a family would assert a taxonomy
the trade does not share.
============================================================ */
style(mission).
period(mission, 1890, 1915).
definition(mission,
'Mission Revival: the FIRST of the group, taking its vocabulary directly \
from the California missions. Plainer and earlier than Spanish Colonial \
Revival, which supplanted it.').
characteristic(mission, 'Curvilinear shaped parapet - the espadana gable').
characteristic(mission, 'Arcaded porch or walkway').
characteristic(mission, 'Smooth stucco wall, large unornamented surfaces').
characteristic(mission, 'Quatrefoil window; occasional bell tower').
typical_detail(mission, mission_parapet).
typical_detail(mission, arcade).
typical_detail(mission, clay_tile_roof).
confused_with(mission, spanish_colonial).
prevalence(mission, california, uncommon).
style(spanish_colonial).
period(spanish_colonial, 1915, 1940).
definition(spanish_colonial,
'Spanish Colonial Revival: the later, broader and far more elaborate \
vocabulary that followed Mission Revival, drawing on Spain and Latin America \
rather than the missions alone. The commonest of the group in California.').
characteristic(spanish_colonial, 'White or cream stucco walls').
characteristic(spanish_colonial, 'Low-pitched red clay tile roof, little eave overhang').
characteristic(spanish_colonial, 'Arched openings - doors, windows, passageways').
characteristic(spanish_colonial, 'Wrought iron grilles, balconets and railings').
characteristic(spanish_colonial, 'Asymmetrical massing, often around a courtyard').
typical_detail(spanish_colonial, clay_tile_roof).
typical_detail(spanish_colonial, arched_openings).
typical_detail(spanish_colonial, wrought_iron).
typical_detail(spanish_colonial, courtyard).
typical_form(spanish_colonial, hacienda).
confused_with(spanish_colonial, mission).
confused_with(spanish_colonial, mediterranean).
prevalence(spanish_colonial, california, very_common).
style(mediterranean).
period(mediterranean, 1915, 1940).
definition(mediterranean,
'Mediterranean Revival: broader and more eclectic than Spanish Colonial, \
usually larger, and mixing Italian and Renaissance sources with Spanish ones. \
The boundary with Spanish Colonial Revival is contested and porous.').
characteristic(mediterranean, 'Larger, often symmetrical, frequently two-storey').
characteristic(mediterranean, 'Tile roof with greater eave overhang than Spanish Colonial').
characteristic(mediterranean, 'Classical or Renaissance detail - balustrades, quoins, arcades').
typical_detail(mediterranean, clay_tile_roof).
typical_detail(mediterranean, arched_openings).
confused_with(mediterranean, spanish_colonial).
confused_with(mediterranean, tuscan).
prevalence(mediterranean, california, common).
style(monterey).
period(monterey, 1830, 1945).
definition(monterey,
'Uniquely Californian, and two things sharing a name. The historic MONTEREY \
COLONIAL (1830s-40s) is a hybrid of Spanish/Mexican adobe construction with \
Anglo-American and New England elements - the Larkin House in Monterey is the \
prototype. The MONTEREY REVIVAL (1920s-40s) is the later commercial style. \
One identifier serves both because MLS copy almost never distinguishes them, \
and in California a listing saying "Monterey" means the revival in nearly \
every case.').
characteristic(monterey, 'Two storeys with a cantilevered second-storey balcony across the facade').
characteristic(monterey, 'Stucco or adobe walls; low-pitched tile or shingle roof').
characteristic(monterey, 'Spanish Colonial detail applied to an Anglo-American form').
typical_detail(monterey, second_story_balcony).
typical_detail(monterey, clay_tile_roof).
typical_detail(monterey, adobe).
prevalence(monterey, california, uncommon).
style(tuscan).
period(tuscan, 1985, 2010).
definition(tuscan,
'The California tract idiom of roughly 1985-2010. Recorded separately from \
Mediterranean Revival rather than folded into it because it is a distinct \
market period with a distinct - and now often negative - buyer reaction, \
which matters more for valuation than its stylistic ancestry.').
characteristic(tuscan, 'Heavy textured stucco, often in ochre or terracotta tones').
characteristic(tuscan, 'Stacked stone veneer at the base and entry').
characteristic(tuscan, 'Arched entries and window heads; faux-aged finishes').
characteristic(tuscan, 'Prominent front-facing garage').
confused_with(tuscan, mediterranean).
prevalence(tuscan, california, common).
/* ============================================================
STYLES — Shingle, and the modern line
============================================================ */
style(art_deco).
period(art_deco, 1925, 1940).
definition(art_deco,
'Geometric, vertical, ornamental modernism. More common in California \
multifamily and commercial work than in single-family houses, but the \
residential stock is real, particularly in San Francisco, Oakland and \
Alameda.').
characteristic(art_deco, 'Vertical emphasis; stepped or setback massing').
characteristic(art_deco, 'Zigzag, chevron and floral geometric ornament').
characteristic(art_deco, 'Smooth wall surfaces with decorative concentration at openings').
confused_with(art_deco, streamline_moderne).
prevalence(art_deco, california, uncommon).
style(streamline_moderne).
period(streamline_moderne, 1930, 1945).
related(streamline_moderne, art_deco).
definition(streamline_moderne,
'The horizontal successor to Art Deco, borrowing from ocean liners and \
aerodynamics. The two are frequently conflated and look nothing alike: Deco \
is vertical and ornamental, Moderne horizontal and smooth.').
characteristic(streamline_moderne, 'Rounded corners and curved wall planes').
characteristic(streamline_moderne, 'Horizontal banding, often as raised speed lines').
characteristic(streamline_moderne, 'Glass block, porthole windows, pipe railings').
characteristic(streamline_moderne, 'Flat roof; smooth white or pastel stucco').
typical_detail(streamline_moderne, glass_block).
confused_with(streamline_moderne, art_deco).
prevalence(streamline_moderne, california, uncommon).
style(international).
period(international, 1930, 1960).
definition(international,
'European modernism as it reached California through Neutra, Schindler and \
their followers. Deliberately placeless - which is what separates it from the \
Bay Tradition, regionalist and wood-led, and from Midcentury Modern, its \
later, softer and more domestic American development.').
characteristic(international, 'Flat roof; no eave, no ornament, no cornice').
characteristic(international, 'Smooth unbroken wall plane, usually white').
characteristic(international, 'Ribbon windows and cantilevered volumes').
typical_detail(international, band_windows).
confused_with(international, midcentury).
prevalence(international, california, rare).
style(midcentury).
period(midcentury, 1945, 1975).
definition(midcentury,
'The post-war American development of modernism: softer, more domestic and \
more material-friendly than the International Style, and built at tract scale \
as well as by architects.').
characteristic(midcentury, 'Open plan; low horizontal massing').
characteristic(midcentury, 'Large glazing, often floor to ceiling; clerestory windows').
characteristic(midcentury, 'Post-and-beam structure left visible').
characteristic(midcentury, 'Flat or low-pitched gable roof with wide overhang').
typical_detail(midcentury, post_and_beam).
typical_detail(midcentury, floor_to_ceiling_glass).
typical_detail(midcentury, clerestory).
typical_form(midcentury, ranch).
prevalence(midcentury, california, very_common).
style(eichler).
period(eichler, 1949, 1974).
related(eichler, midcentury).
definition(eichler,
'Joseph Eichler''s tract modernism. Strictly a BUILDER rather than a style, \
but the trade uses it as a style designation and it carries a measurable \
premium in Palo Alto, Sunnyvale, San Rafael and Walnut Creek - which is \
reason enough for its own identifier in an appraisal ontology, whatever an \
architectural historian would say.').
characteristic(eichler, 'Post-and-beam structure with exposed beams').
characteristic(eichler, 'Floor-to-ceiling glass to private rear yards; blank street facade').
characteristic(eichler, 'Central atrium entry').
characteristic(eichler, 'Radiant-heated concrete slab; flat or low-gable roof').
typical_detail(eichler, post_and_beam).
typical_detail(eichler, atrium).
typical_detail(eichler, floor_to_ceiling_glass).
typical_detail(eichler, radiant_slab).
prevalence(eichler, california, uncommon).
style(shed_style).
period(shed_style, 1960, 1985).
related(shed_style, sea_ranch).
definition(shed_style,
'Multiple shed roofs at opposing angles over asymmetrical massing. Sea \
Ranch is its most distinguished expression rather than a synonym for it.').
characteristic(shed_style, 'Several shed roofs meeting at odd angles').
characteristic(shed_style, 'Vertical wood siding; minimal trim and ornament').
characteristic(shed_style, 'Deliberately site-responsive, irregular plan').
typical_detail(shed_style, shed_roof).
prevalence(shed_style, california, uncommon).
/* ============================================================
STYLES — post-war vernacular and after
============================================================ */
style(minimal_traditional).
period(minimal_traditional, 1935, 1950).
definition(minimal_traditional,
'The compact, almost ornament-free house of the late Depression, the war \
years and immediately after - the direct precursor to the mass post-war \
Ranch, and enormously common in California. Conspicuously absent from most \
style lists because it is unglamorous. NOTE this is a preservation term: \
agents write "starter home" or "1940s cottage", so it is far better derived \
from structured data (year built, small footprint, single storey) than from \
listing text.').
characteristic(minimal_traditional, 'Compact, usually single storey, small footprint').
characteristic(minimal_traditional, 'Low or moderate roof pitch, close eaves').
characteristic(minimal_traditional, 'A vestigial front-facing gable as the only gesture').
characteristic(minimal_traditional, 'Almost no applied ornament').
prevalence(minimal_traditional, california, very_common).
style(ranch).
period(ranch, 1935, 1975).
definition(ranch,
'A recognised architectural tradition - Cliff May, the California ranch, \
the western and suburban ranch - and separately a physical shape. This \
identifier is the STYLE; form(ranch) is the shape. A house may have either \
without the other.').
characteristic(ranch, 'Long, low, single-storey, ground-hugging massing').
characteristic(ranch, 'Low-pitched roof with wide eaves').
characteristic(ranch, 'Attached garage facing the street; picture window').
characteristic(ranch, 'Indoor-outdoor planning to a rear patio').
typical_form(ranch, ranch).
prevalence(ranch, california, very_common).
style(modern_farmhouse).
period(modern_farmhouse, 2010, 9999).
definition(modern_farmhouse,
'A genuine contemporary style vocabulary, and a different thing from the \
rural vernacular FORM it borrows from. A 1900 farmhouse is the form without \
the style; a 2021 build is usually the style and was never a farm.').
characteristic(modern_farmhouse, 'Board-and-batten siding, usually white or very dark').
characteristic(modern_farmhouse, 'Standing-seam metal roof').
characteristic(modern_farmhouse, 'Black-framed windows; large simple gables').
characteristic(modern_farmhouse, 'Stripped-down vernacular massing without ornament').
typical_detail(modern_farmhouse, board_and_batten).
typical_form(modern_farmhouse, farmhouse).
prevalence(modern_farmhouse, california, common).
style(neo_eclectic).
period(neo_eclectic, 1980, 9999).
definition(neo_eclectic,
'Suburban work combining historical motifs without committing to any one of \
them. Far better than calling everything built after 1980 "Contemporary". \
NOTE agents never write the word, so this will effectively only appear in \
trade or appraisal text.').
characteristic(neo_eclectic, 'Fragments of several revivals applied to one elevation').
characteristic(neo_eclectic, 'Mixed cladding - stone veneer, stucco, siding - on one face').
characteristic(neo_eclectic, 'Prominent projecting garage; two-storey entry feature').
prevalence(neo_eclectic, california, very_common).
style(contemporary).
period(contemporary, 1960, 9999).
definition(contemporary,
'Design emphasising the architectural vocabulary current AT THE TIME OF \
CONSTRUCTION rather than adherence to a historical revival. The term is \
TEMPORALLY RELATIVE: a 1975 California house is properly Contemporary and \
does not stop being so as the decades pass. A Contemporary house may still \
borrow historical references, so "no historical vocabulary" is too strict a \
reading.').
characteristic(contemporary, 'Simplified forms; reduced applied ornament').
characteristic(contemporary, 'Large glazing; unconventional roof geometry').
characteristic(contemporary, 'Open plan').
prevalence(contemporary, california, very_common).
/* ============================================================
FORMS — the shape of the building, independent of style
============================================================ */
form(bungalow).
definition(bungalow,
'A FORM: low, compact, one or one-and-a-half storeys, usually with a \
prominent front porch. Very frequently executed in Craftsman vocabulary in \
California, which is why the two are conflated - but a Chicago bungalow is \
not Arts and Crafts, and plenty of California bungalows are plain builder \
work. A house is NOT a bungalow merely because it has Arts and Crafts \
detailing.').
prevalence(bungalow, california, very_common).
form(foursquare).
definition(foursquare,
'American Foursquare, c.1895-1930: a boxy two-storey cube, low hipped roof \
with a central dormer, full-width porch, four rooms to a floor. A FORM - it \
was built in Craftsman, Prairie, Colonial Revival and plain vernacular dress \
alike, so it implies no style.').
prevalence(foursquare, california, common).
form(ranch).
definition(ranch,
'A FORM: long, low, single-storey. Distinct from style(ranch): a 2020 \
contemporary house may have the ranch shape without the ranch style \
vocabulary, and a ranch-influenced split-level may have the style without the \
shape.').
prevalence(ranch, california, very_common).
form(farmhouse).
definition(farmhouse,
'A FORM: the rural vernacular shape - simple gabled volume, often with a \
porch and later additions. See style(modern_farmhouse) for the contemporary \
vocabulary that borrows from it.').
prevalence(farmhouse, california, common).
form(hacienda).
definition(hacienda,
'A courtyard PLAN as much as anything: single storey, rambling, rooms \
arranged around an open court. Placed on the form axis deliberately - in \
California MLS copy the word means almost anything vaguely Spanish and \
sprawling, so it should carry no stylistic inference.').
prevalence(hacienda, california, uncommon).
/* ============================================================
DETAILS — evidence, never proof
============================================================ */
detail(exposed_rafters). detail(box_beams). detail(built_ins).
detail(tapered_columns). detail(deep_eaves). detail(knee_braces).
detail(river_rock). detail(stone_piers). detail(divided_light).
detail(art_glass). detail(wainscoting). detail(window_seat).
detail(turret). detail(fishscale_shingles). detail(spindlework).
detail(bracketed_cornice). detail(wraparound_porch). detail(bay_window).
detail(pocket_doors). detail(mansard_roof). detail(half_timbering).
detail(clay_tile_roof). detail(mission_parapet). detail(arcade).
detail(arched_openings). detail(wrought_iron). detail(courtyard).
detail(second_story_balcony). detail(adobe). detail(post_and_beam).
detail(atrium). detail(floor_to_ceiling_glass). detail(clerestory).
detail(radiant_slab). detail(band_windows). detail(glass_block).
detail(board_and_batten). detail(shingle_siding). detail(shed_roof).
/* Roof shape. The article calls roof form the most reliable discriminator
there is, so the shapes that do the discriminating are recorded like any
other detail -- evidence, weighted by how many styles claim them. A gable
is claimed by many and is therefore weak evidence, which is correct: it is
the commonest roof in the state. */
detail(gable_roof). detail(hipped_roof). detail(gambrel_roof).
detail(catslide_roof).
detail(porte_cochere).
/* roof shape as evidence, from the distinctions the article draws */
typical_detail(french_normandy, turret). /* round or polygonal entry turret */
typical_detail(storybook, turret). /* a turret is part of the whimsy */
typical_detail(tudor, gable_roof).
typical_detail(french_normandy, hipped_roof).
typical_detail(english_cottage, catslide_roof).
typical_detail(dutch_colonial, gambrel_roof).
typical_detail(prairie, hipped_roof).
typical_detail(craftsman, gable_roof).
typical_detail(queen_anne, gable_roof).
typical_detail(storybook, catslide_roof).
typical_detail(minimal_traditional, gable_roof).
/* ============================================================
QUERIES
============================================================ */
/* the styles expressing a movement */
styles_of(Movement, Styles) :-
movement(Movement),
findall(S, expresses(S, Movement), Styles).
/* pairs routinely mistaken for each other, in both directions */
confusable(A, B) :- confused_with(A, B).
confusable(A, B) :- confused_with(B, A).
/* styles current in a given year */
era(Year, Styles) :-
findall(S, ( style(S), period(S, From, To), Year >= From, Year =< To ),
Styles).
/* details that are evidence for a style. NOT a rule for inferring it: several
styles share most of this vocabulary, which is why detailing sets no style
flag in the parser. */
evidence_for(Style, Details) :-
findall(D, typical_detail(Style, D), Details).
/* which styles a detail is evidence for -- usually more than one, which is
the point */
evidence_of(Detail, Styles) :-
detail(Detail),
findall(S, typical_detail(S, Detail), Styles).
/* ---------- printing ---------- */
describe(Id) :-
axis_of(Id, Axis),
format("~w [~w]~n", [Id, Axis]),
( period(Id, F, T) -> format(" period: ~w-~w~n", [F, T]) ; true ),
( prevalence(Id, california, P) -> format(" in California: ~w~n", [P]) ; true ),
( expresses(Id, M) -> format(" expresses: ~w~n", [M]) ; true ),
( influenced_by(Id, I) -> format(" influenced by: ~w (NOT containment)~n", [I]) ; true ),
( definition(Id, D) -> format(" ~w~n", [D]) ; true ),
( characteristic(Id, _)
-> format(" characteristics:~n", []),
forall(characteristic(Id, C), format(" - ~w~n", [C]))
; true ),
( typical_detail(Id, _)
-> format(" typical detailing (evidence, not entailment):~n", []),
forall(typical_detail(Id, Dt), format(" - ~w~n", [Dt]))
; true ),
/* setof, not forall: confused_with/2 is often declared in BOTH
directions, so a bare forall lists each pair twice */
( setof(X, confusable(Id, X), Xs)
-> format(" routinely confused with:~n", []),
forall(member(X, Xs), format(" - ~w~n", [X]))
; true ).
/* ---------- integrity checks ----------
Run check/0 after editing. These are the invariants the ontology relies on;
the parser's tests cover behaviour, these cover structure. */
check :-
findall(E, problem(E), Es),
( Es == [] -> format("ontology OK~n", [])
; forall(member(E, Es), format("PROBLEM: ~w~n", [E])) ).
problem(no_definition(Id)) :- ( style(Id) ; movement(Id) ; form(Id) ),
\+ definition(Id, _).
problem(no_period(Id)) :- ( style(Id) ; movement(Id) ), \+ period(Id, _, _).
problem(parent_not_movement(S, M)) :- expresses(S, M), \+ movement(M).
problem(child_not_style(S, M)) :- expresses(S, M), \+ style(S).
problem(unknown_detail(S, D)) :- typical_detail(S, D), \+ detail(D).
problem(unknown_form(S, F)) :- typical_form(S, F), \+ form(F).
problem(unknown_in_confusion(A, B)):- confused_with(A, B),
( \+ style(A) ; \+ style(B) ).
problem(style_and_movement(Id)) :- style(Id), movement(Id).
/* ============================================================
SCORING FROM OBSERVED DETAIL
Given the details seen across several photographs of one house, weigh the
evidence for each style. Documented rules, arguable but written down -
which is the point: an expert may disagree with a weighting, and can see
exactly which one to argue with.
Specificity is COMPUTED, not declared. A detail shared by one style
discriminates; a detail shared by six barely does. That is the inverse of
how many styles claim it, and it falls out of typical_detail/2 without any
new facts:
tapered_columns -> craftsman only weight 1.00
deep_eaves -> craftsman, prairie weight 0.50
bay_window -> four Victorian styles weight 0.25
The result is a SHARE of the evidence, not a probability. It says how the
observed detailing divides among the styles that could explain it, which is
what "80% Craftsman, 20% Arts and Crafts beyond Craftsman" means. Calibrated
probabilities have to come from a fitted model on real photographs; this is
the logical layer that model would feed.
============================================================ */
/* how many styles claim this detail; 1 means diagnostic */
detail_specificity(Detail, W) :-
evidence_of(Detail, Styles),
length(Styles, N), N > 0,
W is 1.0 / N.
/* weight of evidence for one style from a set of observed details */
style_support(Details, Style, Support) :-
style(Style),
findall(W, ( member(D, Details),
typical_detail(Style, D),
detail_specificity(D, W) ), Ws),
sum_(Ws, Support),
Support > 0.
/* the same for a movement, gathered from the styles that express it -- this
is how a detail can support "Arts and Crafts beyond Craftsman": it belongs
to a sibling style under the same movement */
movement_support(Details, Movement, Support) :-
movement(Movement),
findall(S, ( style_support(Details, St, S), expresses(St, Movement) ), Ss),
sum_(Ss, Support),
Support > 0.
sum_([], 0.0).
sum_([X|Xs], S) :- sum_(Xs, S0), S is S0 + X.
/* Ranked shares. Ranked is a list of Style-Percent, highest first, and the
percentages sum to 100 across the styles with any support. */
style_shares(Details, Ranked) :-
findall(Sup-St, style_support(Details, St, Sup), Pairs),
sum_pairs_(Pairs, Total),
Total > 0,
findall(Pct-St, ( member(Sup-St, Pairs),
Pct0 is (Sup / Total) * 100,
Pct is round(Pct0 * 10) / 10 ), Scored),
sort_desc_(Scored, Ranked).
/* Descending standard order, duplicates kept. Written out rather than called
as sort/4, which is not ISO and is absent from some systems; the list is at
most one entry per style, so an insertion sort costs nothing. */
sort_desc_([], []).
sort_desc_([X|Xs], Sorted) :-
sort_desc_(Xs, Rest),
insert_desc_(X, Rest, Sorted).
insert_desc_(X, [], [X]).
insert_desc_(X, [Y|T], Result) :-
( X @>= Y
-> Result = [X, Y|T]
; Result = [Y|Rest],
insert_desc_(X, T, Rest) ).
sum_pairs_([], 0.0).
sum_pairs_([S-_|T], Total) :- sum_pairs_(T, T0), Total is T0 + S.
/* The reading an appraiser would want: the leading style, its share, and what
else the detailing supports. Deliberately NOT a hard classification -- it
reports the division of evidence and leaves the call to the reader. */
classify(Details, leading(Style, Pct), Rest) :-
style_shares(Details, [Pct-Style|Rest]).
report(Details) :-
format("observed: ~w~n", [Details]),
( style_shares(Details, Ranked)
-> format("evidence divides as:~n", []),
forall(member(P-S, Ranked), format(" ~1f%~t~10| ~w~n", [P, S]))
; format("no style evidence in that detailing~n", []) ),
( movement_support(Details, _, _)
-> format("movement support:~n", []),
forall(movement_support(Details, Mv, Sv),
format(" ~w~t~24| ~4f~n", [Mv, Sv]))
; true ).
mls_remarks.plThe grammar file is 2,431 lines, most of them concerned with matters other than style: quality, condition, outbuildings, vehicle storage, conditions of sale. Reproduced here is its architectural section alone, lines 426 to 1093 of the file as used for this issue, which covers the style cues, the style-word modifier guard, the Bay Area regional line and architectural detailing. Line numbers are those of the full file.
/* ---------- Architectural style ----------
`craftsman` was not in the grammar at all — only `craftsmanship`, a quality
word — so "1912 Craftsman" registered neither the style nor the era. Style
is one of the "good bones" that decides whether an old house is restored or
torn down, so it belongs beside geology here.
Core grammar, not a tier pack: a Craftsman is a Craftsman in Vallejo as much
as in Piedmont, it is merely rarer. (The Bay Area pack already carries
`eichler` and `victorian`; those stay where they are — %% REVIEW whether
they should move here too.) */
/* Styles are not a flat list — some CONTAIN others:
ARTS AND CRAFTS (the movement)
|
+-- CRAFTSMAN these overlap, and the overlap
| is the "Craftsman bungalow"
BUNGALOW ----------------+
Arts and Crafts is the parent: a Craftsman is one, but so is a Greene &
Greene ultimate bungalow or a Stickley-influenced foursquare, and "arts and
crafts" on its own does NOT mean Craftsman. Bungalow is a FORM, not a style
— Chicago and California bungalows are not Craftsman — so it sits partly
outside. Only the intersection is a Craftsman bungalow.
Encoded as containment: craftsman implies arts_and_crafts (arch_parent/2),
bungalow stands alone, and a remark saying "Craftsman bungalow" sets all
three. The parent flag is therefore true for more houses than the child, so
the two are correlated but not redundant.
%% REVIEW the same question elsewhere in this list: Queen Anne is a
Victorian subtype and Edwardian is arguably a different era, yet all three
currently collapse into style_victorian. Spanish/Mediterranean/hacienda
likewise. */
/* STYLE and FORM are different axes and are kept in separate lists.
style = the design vocabulary Arts and Crafts, Craftsman, Tudor
form = the shape of the building bungalow, cottage, two-storey
You can have an Arts and Crafts bungalow, a two-storey Arts and Crafts
house, an Arts and Crafts cottage, or a large Arts and Crafts country house
that looks nothing like a bungalow. The two are strongly associated in
California only because the Craftsman bungalow became the commonest
expression of the movement — they are not interchangeable, and a house is
NOT a bungalow merely because it has Arts and Crafts detailing.
%% REVIEW `ranch` and `farmhouse`: both read as style AND form in MLS usage
("ranch style" is a designation; a ranch is also a low single-storey shape).
They sit in form for now. */
/* MOVEMENTS and FAMILIES are a separate axis from styles. They are different
kinds of entity, and putting them on one axis was what made the ontology
unsafe for inference: arts_and_crafts is a MOVEMENT, victorian an ERA and
family, bay_tradition a regional TRADITION, while craftsman, italianate and
sea_ranch are styles. A movement is expressed BY styles; it is not one.
Every arch_parent/2 rule maps a style to a movement — there are no
style-to-style containments — so the two lists partition cleanly.
%% NOTE `victorian` is strictly an era/family rather than a movement, and
sits here for want of a third axis. In San Francisco trade usage it is
spoken of as though it were a style, which is why it must be emitted at all;
it is not one. */
arch_movements([arts_and_crafts, victorian, bay_tradition]).
arch_styles([craftsman, prairie,
first_bay_tradition, second_bay_tradition, sea_ranch,
queen_anne, italianate, stick, edwardian,
tudor, storybook, mission, spanish_colonial, mediterranean,
shingle, colonial, dutch_colonial, neoclassical,
english_cottage, french_normandy,
monterey, minimal_traditional,
ranch, modern_farmhouse, shed_style, neo_eclectic, tuscan,
art_deco, streamline_moderne, international,
midcentury, eichler, contemporary]).
/* `ranch` and `farmhouse` appear on BOTH axes, which is not redundancy: a
1953 tract ranch is style_ranch AND form_ranch, a 2020 contemporary can be
form_ranch without the style, and a ranch-influenced split-level can be
style_ranch with a different form. `hacienda` moved here from style — it is
a courtyard PLAN, and in California MLS copy the word means almost anything
vaguely Spanish and sprawling, so it should carry no stylistic inference. */
arch_forms([bungalow, foursquare, ranch, farmhouse, hacienda]).
arch_parent(craftsman, arts_and_crafts).
/* Prairie is NOT a child (reverted 2026-08-27, user). Prairie School developed
ALONGSIDE Arts and Crafts and was influenced by it rather than contained by
it — historians describe it as paralleling the movement, not belonging to it.
Containment would make every Prairie house assert Arts and Crafts, which is
a stronger claim than the history supports. The association is recorded as
influence instead, which carries no inference. */
arch_influence(prairie, arts_and_crafts).
arch_related(prairie, craftsman).
/* Victorian is an ERA and a family (1837-1901); Queen Anne, Italianate and
Stick are subtypes within it, so naming one implies the family. Edwardian is
NOT a subtype — it is the following era (1901-1910), post-Victorian and
generally plainer, and San Francisco listings treat it as its own category.
It therefore has no parent. */
/* The Bay Area regional line is three generations, not one. A house in any of
them IS Bay Tradition, so this is genuine containment. */
arch_parent(first_bay_tradition, bay_tradition).
arch_parent(second_bay_tradition, bay_tradition).
arch_parent(sea_ranch, bay_tradition).
arch_parent(queen_anne, victorian).
arch_parent(italianate, victorian).
arch_parent(stick, victorian).
feat(arch(craftsman)) --> [craftsman], not_modifier.
feat(arch(arts_and_crafts)) --> [arts,and,crafts].
feat(arch(arts_and_crafts)) --> [W,and,crafts], { member(W, [art,arts]) }.
feat(form(bungalow)) --> [bungalow].
feat(form(bungalow)) --> [bungalows].
/* --- the Victorian family --- */
feat(arch(victorian)) --> [victorian], not_modifier.
feat(arch(queen_anne)) --> [queen,anne]. % asymmetrical, turret,
feat(arch(queen_anne)) --> [queen,ann]. % wraparound porch, spindlework
feat(arch(italianate)) --> [italianate], not_modifier. % bracketed cornice, tall narrow
% windows; very common in SF
feat(arch(stick)) --> [stick,eastlake]. % vertical stickwork, squared bays
feat(arch(stick)) --> [eastlake].
feat(arch(stick)) --> [stick,W], { member(W, [style,victorian]) }.
/* a different era, not a Victorian subtype */
feat(arch(edwardian)) --> [edwardian], not_modifier.
feat(arch(tudor)) --> [tudor], not_modifier.
/* PRAIRIE — Wright-derived, c.1900-1920, contemporaneous with Craftsman:
strong horizontals, low-pitched hipped roof, wide overhanging eaves, bands
of windows, massive central chimney. Shares much of the Craftsman detailing
(deep eaves, built-ins, art glass), which is why the detail flags
deliberately infer no style.
Prairie is INFLUENCED BY arts_and_crafts but not contained by it — see
arch_influence/2 above. arch_influence/2 and arch_related/2 are declarative
only: nothing consults them, so naming Prairie sets no other flag. They
record what is known without letting it become an inference. */
feat(arch(prairie)) --> [prairie,W], { member(W, [style,school,home,house,
influenced]) }.
feat(arch(prairie)) --> [prairie], not_modifier.
feat(arch(prairie)) --> [frank,lloyd,wright].
feat(arch(prairie)) --> [wright,W], { member(W, [inspired,influenced,designed]) }.
/* STORYBOOK — 1920s-30s whimsical revival: steeply pitched irregular
rooflines, false thatch, turrets, arched plank doors. A real Bay Area and
SoCal idiom, sometimes called Storybook Tudor or Hansel-and-Gretel.
The word is also loose MLS puffery — "storybook charm", "a storybook
setting" — meaning merely cute. Those are blocked; a storybook COTTAGE or
CHARMER is the style. */
feat(arch(shingle)) --> [shingle,W], { member(W, [style,home,house]) }.
feat(arch(storybook)) --> [storybook], not_modifier, not_next([perfect,ending]).
feat(arch(storybook)) --> [story,book,W], { member(W, [cottage,tudor,home,
house,charmer]) }.
feat(arch(storybook)) --> [hansel,and,gretel].
feat(arch(storybook)) --> [fairytale,W], { member(W, [cottage,tudor,home,house]) }.
/* --- the Spanish-derived group: siblings, not one flag ---
Mission Revival (c.1890-1915) came FIRST and takes its vocabulary from the
California missions: curvilinear parapets, arcades, quatrefoil windows.
Spanish Colonial Revival (c.1915-1940) is the later and commoner idiom:
white stucco, low-pitched red clay tile, arched openings, wrought iron.
Mediterranean is broader and more eclectic, usually larger, mixing Italian
and Spanish sources. Hacienda is a PLAN as much as a style — single storey,
rambling, arranged around a courtyard.
Kept as separate siblings with no parent: the boundaries between them are
genuinely contested, and inventing an umbrella would assert a taxonomy the
trade does not agree on. %% REVIEW if you want one. */
feat(arch(mission)) --> [mission,W], { member(W, [style,revival,
architecture]) }.
/* NOT the bare word `mission`: in the Bay Area it is a district, a street, a
school district and several saints before it is a style. */
feat(arch(spanish_colonial)) --> [spanish,W], { member(W, [colonial,revival,style,
eclectic]) }.
/* Bare `spanish` IS usually a style claim ("Spanish charmer", "Spanish villa"),
unlike bare `mission`, so it is kept — but blocked where the word is
modifying something else: Spanish tile is a roofing material, Spanish oak is
a floor, and a Spanish-speaking agent is not a style at all. */
feat(arch(spanish_colonial)) --> [spanish], not_modifier.
/* zero-width lookahead: the next token must not be one of Ws */
not_next(Ws, S, S) :- ( S = [T|_] -> \+ memberchk(T, Ws) ; true ).
/* ---------- the style-word modifier guard ----------
A style word followed by one of these is modifying something that is NOT
the house, and asserts nothing about its architecture:
"Craftsman quality" workmanship, not a Craftsman house
"Colonial doors" a door profile
"Victorian molding" a moulding profile
"Mediterranean climate" the weather
"Contemporary living" marketing
"mid-century neighborhood" the neighbourhood, not this house
"Eichler neighborhood" ditto — next door to one is not being one
"Tudor Drive" a street
"Mission schools" a school district
"Spanish tile" a roofing material
One list applied to every bare style word, rather than a separate list per
style: the failure mode is generic, so the guard should be too. Words that
legitimately FOLLOW a style word — home, house, style, revival, bungalow,
cottage, charmer — are deliberately absent. */
not_modifier(S, S) :- ( S = [T|_] -> \+ non_house_noun(T) ; true ).
non_house_noun(W) :-
member(W, [ /* attributes of workmanship, not of the house */
quality,workmanship,craftsmanship,detail,details,detailing,
influence,influences,touches,accents,flair,
/* components a style word can qualify */
molding,moldings,moulding,trim,millwork,woodwork,
door,doors,window,windows,cabinet,cabinets,
tile,tiles,oak,cedar,glass,fixtures,hardware,
/* not the building at all */
climate,weather,speaking,
living,lifestyle,charm,feel,feeling,vibe,ambiance,ambience,
setting,romance,
/* somewhere else */
neighborhood,neighbourhood,neighbors,neighbours,area,district,
school,schools,college,church,mission,park,village,city,town,
/* street types */
street,st,avenue,ave,road,rd,drive,dr,lane,ln,way,court,ct,
place,pl,boulevard,blvd,circle,cir,terrace,ter,creek,view ]).
feat(arch(mediterranean)) --> [mediterranean], not_modifier.
feat(form(hacienda)) --> [hacienda], not_modifier.
/* bare `colonial` is Colonial Revival — but not when it is the second word of
"Spanish colonial", which is a different style handled above, nor of "Dutch
colonial", which has its own flag below */
feat(not_after([spanish,dutch], arch(colonial))) --> [colonial], not_modifier.
/* DUTCH COLONIAL — visually distinctive enough to warrant its own classifier:
the gambrel roof, often with a full-width shed dormer, is unmistakable and
shares little with the symmetrical Georgian-derived Colonial Revival. */
feat(arch(dutch_colonial)) --> [dutch,colonial].
feat(arch(dutch_colonial)) --> [gambrel].
/* NEOCLASSICAL — full-height portico, columns, pediment, symmetry. Grander
and more explicitly classical than Colonial Revival, which quotes the
classical vocabulary at domestic scale rather than reproducing it. */
feat(arch(neoclassical)) --> [W], { member(W, [neoclassical,neoclassic]) }.
feat(arch(neoclassical)) --> [neo,classical].
feat(arch(neoclassical)) --> [greek,revival].
/* ENGLISH COTTAGE — kept SEPARATE from Tudor Revival, which it is routinely
miscalled. Both are Period Revival, but the cottage is small, asymmetrical,
steep-roofed and picturesque, often with a catslide roof over the entry and
little or no half-timbering. Many California 1920s-30s Period Revival
cottages are described as Tudor when this is the better reading. */
feat(arch(english_cottage)) --> [english,W], { member(W, [cottage,country,
revival]) }.
feat(arch(english_cottage)) --> [cotswold].
feat(arch(english_cottage)) --> [W,cottage], { member(W, [storybook,tudor,
period,fairytale]) }.
/* FRENCH NORMANDY / FRENCH REVIVAL — 1920s-30s: steep hipped roofs, a round
or polygonal entry turret, brick or stone with stucco. California has
substantial numbers of these, and they are commonly mislabelled Tudor. */
feat(arch(french_normandy)) --> [french,W], { member(W, [normandy,norman,
revival,country,
provincial,eclectic]) }.
feat(arch(french_normandy)) --> [normandy].
/* SHED STYLE — c.1960s-80s: multiple shed roofs at odd angles, asymmetrical
massing, vertical wood siding, minimal ornament, deliberately site-
responsive. Distinct from Sea Ranch, which is its most distinguished
expression rather than a synonym. */
feat(arch(shed_style)) --> [shed,style].
feat(arch(shed_style)) --> [W,sheds], { member(W, [multiple,intersecting]) }.
/* NEO-ECLECTIC — c.1980s onward suburban work combining historical motifs
without committing to one: mixed cladding, prominent garage, applied
fragments of several revivals. Far better than calling everything built
after 1980 "Contemporary". %% LIMITATION: agents never write the word, so
this will effectively only fire on trade or appraisal text. */
feat(arch(neo_eclectic)) --> [neo,eclectic].
feat(arch(neo_eclectic)) --> [neoeclectic].
/* TUSCAN — the 1990s-2000s California tract idiom: heavy stucco, arches,
stacked stone veneer, faux-aged finishes. Recorded as its own flag rather
than folded into `mediterranean` because it is a distinct market period
with a distinct — and now often negative — buyer reaction. */
feat(arch(tuscan)) --> [tuscan].
feat(arch(tuscan)) --> [W,tuscan], { member(W, [old,italian]) }.
feat(form(ranch)) --> [rancher].
/* RANCH — a recognised architectural tradition AND a physical shape.
Cliff May, the California ranch, the western and suburban ranch are a style;
long, low and single-storey is a form. Both are emitted, and a house can
have either without the other.
Bare `ranch` gives the FORM. It carries the shared modifier guard (which
blocks "ranch lifestyle") plus a lookbehind for the working-property senses:
a horse ranch is not a ranch house, and Sea Ranch is neither. */
ranch_not_after([sea,horse,working,cattle,guest,dude,equestrian]).
/* one rule for the form: bare `ranch`, with the shared modifier guard (which
blocks "ranch lifestyle") and the lookbehind list above. "ranch style" and
"ranch home" reach it too, since neither following word is a non-house
noun. */
feat(not_after([sea,horse,working,cattle,guest,dude,equestrian], form(ranch)))
--> [ranch], not_modifier.
feat(not_after([sea], arch(ranch))) --> [ranch,style].
feat(arch(ranch)) --> [W,ranch], { member(W, [california,western,
suburban]) }.
feat(arch(ranch)) --> [cliff,may].
/* MONTEREY — uniquely Californian, and two things sharing a name.
The historic Monterey Colonial (1830s-40s) is a hybrid: Spanish/Mexican
adobe construction with Anglo-American and New England elements, the Larkin
House in Monterey being the prototype. The Monterey Revival (1920s-40s) is
the later commercial style — two storeys, stucco, tile roof, and the
defining cantilevered second-storey balcony running the facade, with
Spanish Colonial detail mixed into Anglo-American form.
One flag for both: MLS copy almost never distinguishes them, and a listing
saying "Monterey" in California means the revival in nearly every case.
%% REVIEW if you want monterey_colonial and monterey_revival separately. */
feat(arch(monterey)) --> [monterey,W], { member(W, [colonial,revival,style]) }.
/* Monterey is a city, a bay, a county and a peninsula before it is a style,
and those place words cannot go in the shared non_house_noun list: "bay"
there would block "Victorian bay window", which is a Victorian. */
feat(arch(monterey)) --> [monterey], not_modifier,
not_next([bay,county,peninsula,harbor,harbour,
marina,aquarium,pines,pier,wharf,
cypress,carmel,salinas]).
/* MINIMAL TRADITIONAL — c.1935-1950: compact, one storey, low to moderate
roof pitch, almost no ornament, often a vestigial front-facing gable. The
precursor to the mass postwar Ranch, and California has enormous numbers of
them.
%% LIMITATION: this is a preservation/architectural-historian term. Agents
do NOT write it — they write "starter home", "1940s cottage", "wartime
bungalow" — so this flag will rarely fire from remarks alone. It is far
better derived from structured data (year_built c.1935-1950 + small
footprint + single storey) than from text. Included so the vocabulary
exists when the term IS used, not because remarks will supply it. */
feat(arch(minimal_traditional)) --> [minimal,traditional].
feat(arch(minimal_traditional)) --> [minimal,W], { member(W, [traditional,
traditionalist]) }.
/* ART DECO (1920s-30s) — geometric, vertical emphasis, zigzag and chevron
ornament, stepped massing. STREAMLINE MODERNE (1930s-40s) is its horizontal
successor: curved corners, glass block, porthole windows, flat roofs, ship
railings. Both are more common in California multifamily and commercial than
single-family, but the residential stock is real, particularly in SF,
Oakland and Alameda. Kept separate because the two look nothing alike. */
feat(arch(art_deco)) --> [art,deco].
feat(arch(art_deco)) --> [deco], not_modifier.
feat(arch(streamline_moderne)) --> [streamline,W], { member(W, [moderne,modern]) }.
feat(arch(streamline_moderne)) --> [moderne].
/* INTERNATIONAL STYLE — the 1920s-40s European modernism that reached
California through Neutra, Schindler and their followers: flat roof, smooth
unornamented wall plane, ribbon windows, cantilevers, no regional material
reference. Distinguished from `midcentury`, which is the later, softer,
more domestic American development, and from the Bay Tradition, which is
regionalist and wood-led where this is deliberately placeless. */
feat(arch(international)) --> [international,W], { member(W, [style,modern,
modernism]) }.
feat(arch(international)) --> [W], { member(W, [neutra,schindler]) }.
feat(arch(midcentury)) --> [W], { member(W, [midcentury,mcm]) }, not_modifier.
feat(arch(midcentury)) --> [mid,century], not_modifier.
/* EICHLER — Joseph Eichler's tract modernism, c.1949-1974: post-and-beam,
floor-to-ceiling glass, atrium entry, flat or low-gable roof, radiant slab.
Strictly a BUILDER rather than a style, but the trade uses it as a style
designation and it carries a measurable premium in Palo Alto, Sunnyvale,
San Rafael and Walnut Creek.
Moved here from mls_remarks_bayarea.pl, which guarded it on bayarea_ctx: an
Eichler is an Eichler wherever it stands, and there are tracts outside the
nine counties. Same test as Craftsman — the meaning does not shift with the
market, only the frequency. %% REVIEW: `likeness` cues ("Eichler-inspired",
"in the manner of") are deliberately included, since the trade uses them and
they carry some of the premium; drop them if you want the name only. */
feat(arch(eichler)) --> [eichler], not_modifier.
feat(arch(eichler)) --> [eichlers], not_modifier.
feat(arch(eichler)) --> [W,eichler], { member(W, [classic,original,
authentic]) }.
/* ---------- the Bay Area regional line ----------
Three generations, previously collapsed into one `bay_region` flag. They
share a regionalism — unpainted redwood or cedar, informal plans that follow
the site rather than a style book — but they are half a century apart and
built by different people for different clients.
FIRST BAY TRADITION (c.1890-1920) — Maybeck, Coxhead, Willis Polk, some of
Julia Morgan. Closely tied to Arts and Crafts and the Shingle style;
vernacular building adapted to landscape. Berkeley and the Oakland hills.
SECOND BAY TRADITION (c.1930s-1960s) — Wurster, Gardner Dailey, Esherick.
Simpler, regional, wood-oriented modernism. This is the one usually meant by
the bare phrase "Bay Region style".
SEA RANCH (c.1960s onward) — Esherick and MLTW (Moore, Lyndon, Turnbull,
Whitaker), with Halprin's landscape plan. Inherits the regionalism but is
not synonymous with the Second Tradition.
All three are distinct from `midcentury`: regionalist and material-led
rather than International-derived, and usually one-off architect work rather
than tract.
%% REVIEW the cue lists. Architect surnames are the strongest signal but
several are also ordinary names or places — `polk` is a major San Francisco
street, `moore` and `turnbull` are common surnames — so those need a
forename. This line is also more often DESCRIBED than named, so the cues
below will under-fire. */
feat(arch(bay_tradition)) --> [bay,W], { member(W, [region,regional,
tradition]) }.
feat(arch(first_bay_tradition)) --> [first,bay,tradition].
feat(arch(first_bay_tradition)) --> [W], { member(W, [maybeck,coxhead]) }.
feat(arch(first_bay_tradition)) --> [willis,polk].
feat(arch(second_bay_tradition)) --> [second,bay,tradition].
feat(arch(second_bay_tradition)) --> [W], { member(W, [wurster,esherick]) }.
feat(arch(second_bay_tradition)) --> [gardner,dailey].
feat(arch(sea_ranch)) --> [sea,ranch].
feat(arch(sea_ranch)) --> [mltw].
feat(arch(sea_ranch)) --> [charles,moore].
feat(arch(sea_ranch)) --> [william,turnbull].
feat(arch(sea_ranch)) --> [third,bay,tradition].
/* `farmhouse` alone is a form — the rural vernacular shape. MODERN FARMHOUSE
is a genuine contemporary style vocabulary and a different thing: board and
batten siding, standing-seam metal roof, black-framed windows, large simple
gables, stripped-down vernacular massing. A 1900 farmhouse is the form
without the style; a 2021 build is usually the style without ever having
been a farm. */
feat(form(farmhouse)) --> [farmhouse].
feat(arch(modern_farmhouse)) --> [W,farmhouse], { member(W, [modern,
contemporary]) }.
/* FOURSQUARE — American Foursquare, c.1895-1930: a boxy two-storey cube, low
hipped roof with a central dormer, full-width porch, four rooms to a floor.
A FORM, like bungalow — it was built in Craftsman, Prairie, Colonial Revival
and plain vernacular dress, so it implies no style. */
feat(form(foursquare)) --> [foursquare].
feat(form(foursquare)) --> [four,square].
feat(form(foursquare)) --> [W,foursquare], { member(W, [american,classic]) }.
/* CONTEMPORARY is TEMPORALLY RELATIVE, and the definition must say so: it
means the architectural vocabulary current when the house was built, not
present-day. A 1975 California house is properly Contemporary and does not
stop being so as the decades pass. Characterised by simplified forms, large
glazing, unconventional roof geometry, open plans and little applied
ornament — but it may still borrow historical references, so "no historical
vocabulary" was too strict a reading. */
feat(arch(contemporary)) --> [W], { member(W, [contemporary,modernist]) },
not_modifier.
/* ---------- Architectural detailing ----------
Agents describe the FEATURES and often never name the style: "built-ins,
box beam ceilings, exposed rafters" says Craftsman without saying Craftsman.
These are the visible-craftsmanship markers — exposed structure, natural
materials, built-in joinery, deep eaves, tapered porch columns.
Emitted as their own flags and NOT used to infer arch(craftsman): several
appear on Shingle, Prairie and Tudor Revival houses too, and a Bay Area
house from 1900-1930 is frequently Craftsman with elements of Shingle,
Tudor Revival, Mission or Colonial Revival mixed in. Style BLENDING is the
norm in that stock, so several style flags firing together is the correct
reading, not a defect. Let the model weigh feature flags and style flags
together rather than having the grammar collapse them.
%% REVIEW the vocabulary. */
/* Selected for DISCRIMINATING power, not for completeness. A detail earns a
flag when its presence distinguishes one style from another; `stucco`,
`hipped roof` and `low-pitched roof` were proposed and rejected, because
they appear on almost everything in California and would add noise rather
than signal. `bay_window` is borderline — near-universal on San Francisco
Victorians and Edwardians, absent on ranches — and is kept for that
contrast. %% REVIEW it if it proves too common to be worth a column. */
arch_details([ /* Arts and Crafts / Craftsman */
exposed_rafters, box_beams, built_ins, tapered_columns,
deep_eaves, knee_braces, river_rock, stone_piers,
divided_light, art_glass, wainscoting, window_seat,
/* Victorian */
turret, fishscale_shingles, spindlework, bracketed_cornice,
wraparound_porch, bay_window, pocket_doors, mansard_roof,
/* Tudor / storybook */
half_timbering,
/* Spanish / Mission / Monterey */
clay_tile_roof, mission_parapet, arcade, arched_openings,
wrought_iron, courtyard, second_story_balcony, adobe,
/* Modern: Eichler, midcentury, Prairie, International */
post_and_beam, atrium, floor_to_ceiling_glass, clerestory,
radiant_slab, band_windows, glass_block,
/* siding and roof shapes that discriminate */
board_and_batten, shingle_siding, shed_roof, porte_cochere,
gable_roof, hipped_roof, gambrel_roof, catslide_roof ]).
feat(det(exposed_rafters)) --> [exposed,W], { member(W, [rafters,rafter,beams,
beam,brackets,trusses]) }.
feat(det(exposed_rafters)) --> [rafter,tails].
feat(det(box_beams)) --> [box,W], { member(W, [beam,beams,beamed]) }.
feat(det(box_beams)) --> [coffered,W], { member(W, [ceiling,ceilings]) }.
feat(det(box_beams)) --> [beamed,W], { member(W, [ceiling,ceilings]) }.
feat(det(built_ins)) --> joined(W), { member(W, [builtin,builtins]) }.
feat(det(built_ins)) --> [built,W], { member(W, [ins,in]) }.
feat(det(built_ins)) --> [built,in,W], { member(W, [cabinetry,cabinets,
bookcases,buffet,hutch]) }.
feat(det(tapered_columns)) --> [tapered,W], { member(W, [columns,column,posts,post]) }.
feat(det(tapered_columns)) --> [W,columns], { member(W, [square,battered,porch]) }.
feat(det(deep_eaves)) --> [W,eaves], { member(W, [deep,wide,broad,overhanging,
generous]) }.
feat(det(deep_eaves)) --> [eave,W], { member(W, [brackets,overhang]) }.
feat(det(divided_light)) --> [divided,W], { member(W, [light,lights,lite,lites]) }.
/* `paned` as well as `pane`: "multi-paned windows" is the commoner phrasing
and tokenizes as [multi, paned, windows] */
feat(det(divided_light)) --> [W,X,Y], { member(W, [multi,six,eight,nine,ten,
twelve,true,divided]),
member(X, [pane,paned,panes]),
member(Y, [windows,window,sash]) }.
feat(det(divided_light)) --> [W,X], { member(W, [multi,six,eight,nine,twelve]),
member(X, [pane,paned,panes]) }.
/* ORNAMENTED WINDOWS — decorative glass, as distinct from divided_light,
which is geometry (small panes in muntins) rather than ornament. In
Craftsman work the art glass is typically in the UPPER sash over a plain
lower one; in Victorian it is more often a stair or entry window. Kept
separate from divided_light because a window can have either, both or
neither, and the two are evidence of somewhat different things. */
feat(det(art_glass)) --> [W,glass], { member(W, [art,leaded,stained,
beveled,bevelled,
textured,antique]) }.
feat(det(art_glass)) --> [W,window], { member(W, [leaded,stained,art] ) }.
feat(det(art_glass)) --> [W,windows], { member(W, [leaded,stained,art] ) }.
feat(det(art_glass)) --> [diamond,W], { member(W, [pane,paned,panes]) }.
feat(det(wainscoting)) --> joined(W), { member(W, [wainscoting,wainscot,
paneling,panelling]) }.
feat(det(wainscoting)) --> [picture,rail].
feat(det(wainscoting)) --> [plate,rail].
feat(det(window_seat)) --> [window,W], { member(W, [seat,seats]) }.
feat(det(window_seat)) --> [inglenook].
/* Not a Craftsman detail — Spanish/Mission — which is why this group is named
for architectural detailing generally rather than for one style. It exists
so "Spanish tile roof" records the evidence without ASSERTING the style:
the phrase is good evidence of Spanish Colonial, but `spanish` there is
modifying a roofing material, so the style flag is deliberately suppressed
(see not_next/3 above). The flag stands on its own and the model can weigh
it alongside the style flags. */
feat(det(clay_tile_roof)) --> [W,tile], { member(W, [clay,spanish,barrel,
mission,terracotta]) }.
feat(det(clay_tile_roof)) --> [terra,cotta,W], { member(W, [tile,tiles,roof]) }.
feat(det(clay_tile_roof)) --> [tile,roof].
feat(det(clay_tile_roof)) --> [tiled,roof].
/* --- Arts and Crafts / Craftsman --- */
feat(det(knee_braces)) --> [knee,W], { member(W, [brace,braces]) }.
feat(det(river_rock)) --> [river,W], { member(W, [rock,rocks,stone]) }.
feat(det(river_rock)) --> [clinker,W], { member(W, [brick,bricks]) }.
feat(det(stone_piers)) --> [W,piers], { member(W, [stone,brick,porch,
masonry,rock]) }.
feat(det(stone_piers)) --> [W,pillars], { member(W, [stone,brick,tapered]) }.
/* --- Victorian --- */
feat(det(turret)) --> [W], { member(W, [turret,turrets,tower]) }.
feat(det(fishscale_shingles))--> joined(W), { member(W, [fishscale,fishscales]) }.
feat(det(fishscale_shingles))--> [fish,scale].
feat(det(fishscale_shingles))--> [W,shingles], { member(W, [scalloped,patterned,
decorative]) }.
feat(det(spindlework)) --> joined(W), { member(W, [spindlework,spindles,
gingerbread]) }.
feat(det(bracketed_cornice))--> [W,cornice], { member(W, [bracketed,ornate,
decorative,deep]) }.
feat(det(bracketed_cornice))--> [corbel].
feat(det(bracketed_cornice))--> [corbels].
feat(det(wraparound_porch)) --> joined(W), { member(W, [wraparound,wrap]) },
[porch].
feat(det(wraparound_porch)) --> [wrap,around,porch].
feat(det(bay_window)) --> [bay,W], { member(W, [window,windows]) }.
feat(det(pocket_doors)) --> [pocket,W], { member(W, [door,doors]) }.
feat(det(gable_roof)) --> [W,roof], { member(W, [gable,gabled]) }.
feat(det(gable_roof)) --> [W,gable], { member(W, [front,cross,side,steep,steeply,pitched]) }.
feat(det(hipped_roof)) --> [W,roof], { member(W, [hip,hipped]) }.
feat(det(gambrel_roof)) --> [gambrel].
feat(det(gambrel_roof)) --> [barn,W], { member(W, [roof,style,roofline]) }.
feat(det(catslide_roof)) --> [catslide].
feat(det(catslide_roof)) --> [cat,slide].
feat(det(catslide_roof)) --> [W,X,roof], { member(W, [sweeping,swept]), member(X, [low,down]) }.
feat(det(mansard_roof)) --> [mansard].
/* --- Tudor / storybook --- */
feat(det(half_timbering)) --> joined(W), { member(W, [halftimbering,
halftimbered]) }.
feat(det(half_timbering)) --> [half,W], { member(W, [timbering,timbered,
timber]) }.
/* --- Spanish / Mission / Monterey --- */
feat(det(mission_parapet)) --> [W,parapet], { member(W, [mission,curvilinear,
shaped,espadana]) }.
feat(det(mission_parapet)) --> [bell,W], { member(W, [tower,gable]) }.
feat(det(arcade)) --> [W], { member(W, [arcade,arcaded,loggia,
colonnade]) }, not_modifier.
feat(det(arched_openings)) --> [arched,W], { member(W, [openings,opening,
doorway,doorways,
entry,windows,window,
passageway]) }.
feat(det(arched_openings)) --> [W,arches], { member(W, [interior,graceful,
romanesque,rounded]) }.
feat(det(wrought_iron)) --> [wrought,iron].
feat(det(courtyard)) --> [courtyard].
feat(det(courtyard)) --> [court,yard].
feat(det(second_story_balcony))--> [W,balcony], { member(W, [second,cantilevered,
upper,full,covered]) }.
feat(det(second_story_balcony))--> [second,story,W], { member(W, [balcony,
porch]) }.
/* Adobe is also a creek, a road and a software company in this market */
feat(det(adobe)) --> [adobe], not_modifier,
not_next([creek,road,rd,street,st,systems,
acrobat,reader]).
/* --- Modern: Eichler, midcentury, Prairie, International --- */
feat(det(post_and_beam)) --> [post,and,beam].
feat(det(post_and_beam)) --> [W,beam], { member(W, [exposed,structural,
glulam]) }.
feat(det(atrium)) --> [atrium].
feat(det(atrium)) --> [atriums].
feat(det(floor_to_ceiling_glass))--> [floor,to,ceiling,W], { member(W, [glass,
windows,window]) }.
feat(det(floor_to_ceiling_glass))--> [wall,of,glass].
feat(det(floor_to_ceiling_glass))--> [walls,of,glass].
feat(det(clerestory)) --> joined(W), { member(W, [clerestory,clearstory,
clerestories]) }.
feat(det(radiant_slab)) --> [radiant,W], { member(W, [heat,heating,floor,
floors,slab]) }.
feat(det(band_windows)) --> [W,windows], { member(W, [ribbon,banded,
continuous]) }.
feat(det(band_windows)) --> [bands,of,windows].
feat(det(glass_block)) --> [glass,W], { member(W, [block,blocks]) }.
/* --- siding and roof shapes that discriminate --- */
feat(det(board_and_batten)) --> [board,and,batten].
feat(det(shingle_siding)) --> [W,shingles], { member(W, [cedar,wood,redwood,
shake]) }.
feat(det(shingle_siding)) --> [shingle,W], { member(W, [siding,clad,exterior]) }.
feat(det(shed_roof)) --> [shed,W], { member(W, [roof,roofs,roofline,
rooflines]) }.
feat(det(porte_cochere)) --> [porte,cochere].
det_features(Raw, Feats) :-
arch_details(Ds),
findall(Key-Val,
( member(D, Ds), atom_concat(detail_, D, Key),
bool(memberchk(det(D), Raw), Val) ),
Feats).
/* a style is present if its cue fired OR a cue for one of its children did */
arch_present(Raw, A) :- memberchk(arch(A), Raw), !.
arch_present(Raw, A) :- arch_parent(Child, A), memberchk(arch(Child), Raw).
arch_features(Raw, Feats) :-
arch_movements(Ms),
findall(Key-Val,
( member(M, Ms), atom_concat(movement_, M, Key),
bool(arch_present(Raw, M), Val) ),
MFeats),
arch_styles(As),
findall(Key-Val,
( member(A, As), atom_concat(style_, A, Key),
bool(arch_present(Raw, A), Val) ),
SFeats0),
append(MFeats, SFeats0, SFeats),
arch_forms(Fs),
findall(Key-Val,
( member(Fm, Fs), atom_concat(form_, Fm, Key),
bool(memberchk(form(Fm), Raw), Val) ),
FFeats),
append(SFeats, FFeats, Feats).