Foundations  ·  The Valuation Engineer

Hedonic Price Function — Prolog companion

Machine-readable Prolog representation of this entry's facts, rules, and worked example.

Download entry.pl
%% entry.pl
%%
%% Prolog companion to Foundations Vol. 1, Issue 1, Article 003
%%   Title:    Hedonic Price Function
%%   Author:   Bert Craytor
%%   Concept:  hedonic_price_function
%%   Version:  0.1.0-draft

% =====================================================================
% DICTIONARY IMPORT
% =====================================================================

:- use_module('../../../../tools/dictionary/dictionary').
:- dictionary_release('dictionary-2026.1').

% --- From the dictionary (loaded via :- use_module above) -----------
% term(hedonic_price_function, "Hedonic Price Function", economic_theory,
%      "The hedonic price function is the equilibrium mapping from
%       points in the characteristics space of a heterogeneous good to
%       transaction prices, formed as the envelope of buyer bid
%       functions and seller offer functions in a competitive market.",
%      published, 'dictionary-2026.1').
%
% term(bid_function, "Bid Function", economic_theory, ...).
% term(offer_function, "Offer Function", economic_theory, ...).
% term(sales_comparison_approach, ...).
% term(cost_approach, ...).
% term(income_approach, ...).
%
% formalized_by(hedonic_price_function, rosen_1974).
% depends_on(hedonic_price_function, heterogeneous_good).
% depends_on(hedonic_price_function, characteristics_space).
% ---------------------------------------------------------------------

:- use_terms([ hedonic_price_function, heterogeneous_good,
               characteristics_space, implicit_price, hedonic_regression,
               bid_function, offer_function,
               sales_comparison_approach, cost_approach, income_approach,
               adjustment, reconciliation ]).
:- use_relations([related/2, depends_on/2, formalized_by/2]).

% =====================================================================
% ARTICLE SUBJECT
% =====================================================================

article_concept(hedonic_price_function).
article_issue(volume(1), number(1), year(2026)).
article_id('foundations.2026.003').

% =====================================================================
% LOCAL VOCABULARY
% =====================================================================

local_term(equilibrium).
local_term(envelope).
local_term(functional_form).
local_term(market_segment).
local_term(linearity).
local_term(separability).
local_term(time_adjustment).
local_term(coefficient).
local_term(intercept).

% =====================================================================
% FORMAL ATTRIBUTION
% =====================================================================

attributed_formalization(hedonic_price_function, rosen_1974).

% =====================================================================
% CONSTRUCTION: ENVELOPE OF BID AND OFFER FUNCTIONS
% =====================================================================
%
% The Rosen (1974) construction: p(z) is the envelope of buyer bid
% functions and seller offer functions.

primitive_of_construction(bid_function,   buyer).
primitive_of_construction(offer_function, seller).

constructed_as_envelope_of(hedonic_price_function,
                           [bid_function, offer_function]).

emerges_from(hedonic_price_function, market_equilibrium).

% Property that flows from the construction: the function is not
% chosen by any single market participant.
property(hedonic_price_function, not_set_by_individual_participant).
property(hedonic_price_function, equilibrium_object).
property(hedonic_price_function, defined_per_market_segment).

% =====================================================================
% APPRAISER ENCOUNTERS — IMPLICIT MANIPULATIONS OF p(z)
% =====================================================================

implicit_manipulation_of_hedonic(
    adjustment,
    sales_comparison_approach,
    "Asserts a local slope of p in the relevant characteristic dimension.").
implicit_manipulation_of_hedonic(
    reconciliation,
    multi_approach_valuation,
    "Three approaches should converge on the same point of p; divergence requires editorial judgment.").
implicit_manipulation_of_hedonic(
    time_adjustment,
    market_analysis,
    "p shifts over time; appreciation rates are statements about that shift.").

% =====================================================================
% DEFENSIBILITY QUESTIONS
% =====================================================================
%
% The article names three questions the hedonic-price-function framing
% sharpens.

defensibility_question(function_existence,
    "In thin or rapidly-changing markets, the equilibrium function may be poorly defined; the inferential machinery operates on a shaky foundation.").
defensibility_question(segment_specificity,
    "One function per market segment, not one function globally. Conflating segments is usually wrong.").
defensibility_question(functional_form,
    "Rosen showed only that p is an envelope, not its shape. Empirically nonlinear with interactions and thresholds; estimation requires defending the form.").

% =====================================================================
% WORKED EXAMPLE: ADDITIVE LINEAR SPECIFICATION
% =====================================================================
%
% For the Pacifica neighborhood, the article adopts the additive linear
% specification:
%   p(z) = β0 + β_gla*z_gla + β_lot*z_lot + β_view*z_view + β_cond*z_cond
%
% The next entry (004) takes the coefficients as implicit prices; entry
% 005 estimates them by hedonic regression.

:- consult('../../kb/pacifica_comps').

specification_form(additive_linear).
specification_assumption(linearity_in_levels,
    "Contribution of each characteristic is linear in its level.").
specification_assumption(no_interactions,
    "Characteristics do not interact in the price function.").
specification_caveat(
    "Both assumptions are testable and frequently violated; adopted here as a starting point.").

% Coefficient values reported in the article (estimated in entry 005,
% asserted here so this entry's worked example can be queried).
coefficient(intercept,        80777.07).
coefficient(beta_gla,           574.93).
coefficient(beta_lot,            22.70).
coefficient(beta_view,        86179.03).
coefficient(beta_cond,        49824.33).

%! predicted_price(?Property, -Predicted) is det.
%
% The fitted additive-linear hedonic price function applied to a
% property's characteristics. Symbolic view/cond are mapped to {0,1}
% and {1,2,3} respectively.

predicted_price(P, Predicted) :-
    coord(P, gla_sqft, GLA),
    coord(P, lot_sqft, Lot),
    coord(P, view, View),
    coord(P, cond_numeric, Cond),
    coefficient(intercept, B0),
    coefficient(beta_gla,  Bg),
    coefficient(beta_lot,  Bl),
    coefficient(beta_view, Bv),
    coefficient(beta_cond, Bc),
    Predicted is B0 + Bg * GLA + Bl * Lot + Bv * View + Bc * Cond.

coord(P, A, N) :-
    attribute_value(P, A, V),
    ( number(V) -> N = V
    ; A == view, V == yes -> N = 1
    ; A == view, V == no  -> N = 0
    ; V = N
    ).

% =====================================================================
% THE CENTRAL CONCEPTUAL MOVE
% =====================================================================
%
% The function exists, in principle, before estimation. The function is
% a property of the market; estimation is recovery.

claim(function_precedes_estimation,
    "The hedonic price function is a property of the market and exists conceptually prior to any specific fitted model. Estimation is recovery, and recovery may be partial, biased, or noisy.").

% =====================================================================
% CROSS-REFERENCES
% =====================================================================

cross_reference(heterogeneous_good).
cross_reference(characteristics_space).
cross_reference(implicit_price).
cross_reference(hedonic_regression).

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.