Foundations · The Valuation Engineer
Machine-readable Prolog representation of this entry's facts, rules, and worked example.
Download 001-heterogeneous-good.pl%% 001-heterogeneous-good.pl
%%
%% Prolog companion to Foundations Vol. 1, Issue 1, Article 001
%% Title: Heterogeneous Good
%% Author: Bert Craytor
%% Concept: heterogeneous_good
%% Version: 0.1.0-draft
%%
%% This file is the Prolog galley for the article: it encodes the
%% article's main claims, worked example, and inference rules in a form
%% that other Prolog code in the journal can consult, query, and verify
%% against. Read alongside the entry.tex / entry.pdf prose.
% =====================================================================
% DICTIONARY IMPORT
% =====================================================================
%
% The journal-wide dictionary is the source of truth for term definitions
% and relation schemas. The use_module below pulls those facts in at
% runtime; the comments that follow reproduce the relevant entries so a
% reader skimming this file in isolation can see what's been imported.
:- use_module('../../../../tools/dictionary/dictionary').
:- dictionary_release('dictionary-2026.1').
% --- From the dictionary (loaded via :- use_module above) -----------
% term(heterogeneous_good, "Heterogeneous Good", economic_theory,
% "Heterogeneous goods are goods that are not interchangeable
% because each is a distinct bundle of characteristics that buyers
% value separately, and whose characteristics are not separately
% traded.", published, 'dictionary-2026.1').
%
% term(characteristics_space, "Characteristics Space", economic_theory,
% "The characteristics space of a class of heterogeneous goods is
% the vector space whose coordinates index the attributes that
% buyers value, and in which each good is represented by the
% vector of its attribute levels.", published, 'dictionary-2026.1').
%
% term(implicit_price, "Implicit Price", economic_theory,
% "The implicit price of a characteristic is the partial derivative
% of the hedonic price function with respect to that characteristic,
% evaluated at a point in the characteristics space; it represents
% the marginal market price of an incremental unit of the
% characteristic, holding all other characteristics fixed.",
% published, 'dictionary-2026.1').
%
% term(hedonic_price_function, ...).
%
% relation(depends_on, 2, "depends on", [foundations_concept, foundations_concept],
% foundations_methodology, "...", accepted, 'dictionary-2026.1').
% relation(related, 2, ...).
%
% These facts are NOT declared in this file; the use_module above is
% what makes them available at runtime.
% ---------------------------------------------------------------------
:- use_terms([ % Foundations concepts (terms/foundations.pl)
heterogeneous_good, characteristics_space, implicit_price,
hedonic_price_function,
% Practice terms (terms/valuation-practice.pl)
real_estate, homogeneous_good,
sales_comparison_approach, cost_approach, income_approach,
comp_selection, paired_sales_analysis, adjustment,
reconciliation, uspap, standards_rule ]).
:- use_relations([related/2, depends_on/2]).
% =====================================================================
% ARTICLE SUBJECT
% =====================================================================
article_concept(heterogeneous_good).
article_issue(volume(1), number(1), year(2026)).
article_id('foundations.2026.001').
% =====================================================================
% ARTICLE-LOCAL VOCABULARY
% =====================================================================
%
% Terms the article needs that are NOT yet in the dictionary, and that
% the editor decided are too narrow to promote. These are field names
% for the worked-example property records — not concepts in the
% journal's ontology.
local_term(gla_sqft).
local_term(bedrooms).
local_term(baths).
local_term(lot_sqft).
local_term(view).
% =====================================================================
% FORMAL DEFINITION (restated as Prolog rule)
% =====================================================================
%
% From the formal definition: a good is heterogeneous IF buyers care
% about multiple distinguishable attributes that vary across items in
% the market, AND those attributes are bundled by production rather
% than separately traded.
%! heterogeneous(?Good) is nondet.
%
% True when Good satisfies both bundling criteria. The two predicates
% buyers_value_multiple_attributes/1 and attributes_bundled_by_production/1
% must be asserted for specific goods elsewhere; here they characterize
% the formal definition itself.
heterogeneous(Good) :-
buyers_value_multiple_attributes(Good),
attributes_bundled_by_production(Good).
% =====================================================================
% INTUITIVE FRAMING — CONTRASTS WITH HOMOGENEOUS GOODS
% =====================================================================
% Canonical examples of homogeneous goods cited in the article.
canonical_homogeneous_example(wti_crude).
canonical_homogeneous_example(no_2_yellow_corn).
canonical_homogeneous_example(kilowatt_hour).
canonical_homogeneous_example(common_stock_share).
% Their distinguishing feature: grading or specification standards make
% individual items interchangeable.
interchangeable_via_grading(wti_crude).
interchangeable_via_grading(no_2_yellow_corn).
interchangeable_via_specification(kilowatt_hour).
interchangeable_via_specification(common_stock_share).
% Canonical heterogeneous goods.
canonical_heterogeneous_example(real_estate).
canonical_heterogeneous_example(used_car).
canonical_heterogeneous_example(unique_machinery).
% Why real estate exhibits heterogeneity unusually strongly:
% locational characteristics are perfectly non-replicable.
buyers_value_multiple_attributes(real_estate).
attributes_bundled_by_production(real_estate).
non_replicable_attribute(real_estate, location).
% =====================================================================
% APPRAISER ENCOUNTERS
% =====================================================================
%
% The three classical valuation approaches are all methodological
% responses to heterogeneity. They differ in HOW they navigate the
% bundle, not in WHETHER they confront it.
valuation_approach(sales_comparison_approach).
valuation_approach(cost_approach).
valuation_approach(income_approach).
responds_to_heterogeneity(sales_comparison_approach,
"Reconciles the prices of distinct bundles by adjusting for composition differences; the grid records only adjustments, estimated directly, and never decomposes a price into feature value contributions.").
responds_to_heterogeneity(cost_approach,
"Reconstructs the bundle from priced components: foundation, framing, finishes, depreciation.").
responds_to_heterogeneity(income_approach,
"Abstracts the bundle into a single cash-flow profile; cap/yield rates absorb heterogeneity.").
% Practitioner-level encounters with heterogeneity.
practitioner_response_to_heterogeneity(comp_selection,
"Minimize bundle distance between subject and comp in characteristics space.").
practitioner_response_to_heterogeneity(paired_sales_analysis,
"Isolate an attribute's contribution by holding other attributes constant.").
practitioner_response_to_heterogeneity(adjustment,
"Quantify the price impact of one differing attribute at a time.").
% =====================================================================
% DEFENSIBILITY
% =====================================================================
%
% Why naming "heterogeneous good" sharpens USPAP defensibility questions.
defensibility_consequence(comp_selection,
"Comps must be close enough in characteristics space that recovered implicit prices generalize.").
defensibility_consequence(adjustment,
"Each adjustment must be supportable from market evidence of the implicit price.").
defensibility_consequence(reconciliation,
"Choice among approaches reflects which best navigates THIS property's heterogeneity.").
% Root claim: valuation methodology exists as a discipline BECAUSE
% real estate is heterogeneous. If it were homogeneous, value would be
% directly observable from posted prices.
root_claim(
"Valuation methodology exists as a discipline because real estate is heterogeneous; in the homogeneous case, value would be directly observable.").
% =====================================================================
% WORKED EXAMPLE — PACIFICA COMPS
% =====================================================================
%
% Two recent sales in the same Pacifica, California neighborhood. The
% example demonstrates that even "identical" houses are not identical:
% the $145,000 price spread is the joint contribution of differences in
% lot size and view, two implicit prices entangled in a single pair.
% The 8-comp Pacifica dataset is shared across entries 001-006 and
% lives in kb/pacifica_comps.pl. Consulting it here brings property/1,
% in_market/2, attribute_value/3, and sale_price/2 into this article's
% namespace.
:- consult('../../kb/pacifica_comps').
% --- Derived facts from the example -------------------------------
% The attributes that differ between the two comps.
differing_attribute(comp_a, comp_b, lot_sqft).
differing_attribute(comp_a, comp_b, view).
% The price differential and what it's attributable to.
price_differential(comp_a, comp_b, 145000).
attributed_to(price_differential(comp_a, comp_b, 145000),
[implicit_price_of(lot_sqft), implicit_price_of(view)]).
% --- Article's argument about identification ---------------------
% A single pair cannot separately identify the two implicit prices —
% they are entangled in the single $145K observation.
joint_identification_only(price_differential(comp_a, comp_b, 145000),
[lot_sqft, view]).
% Separate identification requires more pairs varying one attribute at
% a time. With sufficient variation, hedonic regression performs the
% disentanglement formally; with limited variation, the appraiser uses
% bracketed paired-sales reasoning, whose reliability depends on how
% close the bundles are in characteristics space.
identification_strategy(few_pairs,
"Bracketed paired-sales reasoning. Reliability depends on bundle proximity in characteristics space.").
identification_strategy(many_pairs_with_variation,
"Hedonic regression (see hedonic_regression).").
% =====================================================================
% INFERENCE RULES
% =====================================================================
%! comparable(?A, ?B) is nondet.
%
% A and B are comparable when they are distinct properties in the same
% market. This is the operational definition of "comp" used implicitly
% in the article.
comparable(A, B) :-
property(A),
property(B),
A \== B,
in_market(A, M),
in_market(B, M).
%! attribute_difference(?A, ?B, ?Attr, ?DA, ?DB) is nondet.
%
% A and B differ on Attr, with DA the value at A and DB the value at B.
% Use this to enumerate the dimensions on which two comps actually vary.
attribute_difference(A, B, Attr, DA, DB) :-
comparable(A, B),
attribute_value(A, Attr, DA),
attribute_value(B, Attr, DB),
DA \== DB.
%! identifiable_implicit_price(?Attr) is nondet.
%
% An attribute's implicit price is identifiable from the observed comps
% if there exists at least one pair of comparables differing ONLY in
% that attribute. With our two-comp example this fails for lot_sqft AND
% view (both differ in the same pair), which is exactly the article's
% point.
identifiable_implicit_price(Attr) :-
comparable(A, B),
findall(X, attribute_difference(A, B, X, _, _), Diffs),
Diffs == [Attr].
% =====================================================================
% CROSS-REFERENCES
% =====================================================================
%
% Concepts the article cross-references (corresponding to the
% \foundationsref{} macros in entry.tex).
cross_reference(characteristics_space).
cross_reference(hedonic_price_function).
cross_reference(implicit_price).
The source above is the canonical Prolog form of this entry. It imports the journal-wide dictionary (Issues/tools/dictionary/) and can be queried using SWI-Prolog. See the article's prose form (PDF / HTML galleys) for the human-readable exposition.