Case 962

The insulation was doubled and the heat left by the glass

the_insulation_was_doubled_and_the_heat_left_by_the_glass.eml - A house loses heat through a hundred square metres of wall and twenty of glass, the owner doubles the wall insulation because the walls are five times the area, the work is done well, and the heating bill falls by a sixth. Where the heat was actually leaving is computed below.

ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-22

EML

eml
# Self-authored for the EML case corpus (no external origin). A house loses
# heat through a hundred square metres of wall and twenty of glass, the owner
# doubles the wall insulation because the walls are five times the area, the
# work is done well, and the heating bill falls by a sixth. Where the heat was
# actually leaving is computed below.
#
# The reasoning is careful. The areas are right; the wall is by far the larger
# surface; doubling insulation genuinely halves the wall's loss; and the intent
# was exactly 'cut the heat loss where most of the surface is'.
#
# Heat loss through a surface is its area times how conductive it is, and the
# glass conducts nine times as well as the wall per square metre, so the small
# glass area leaks more than the large wall - halving the wall's loss saves 15
# watts per degree while better glass saves 32, out of 86.

100 => wall_area_m2
20 => glass_area_m2
30 => wall_u_value_hundredths
15 => wall_u_value_after_doubling_insulation_hundredths
280 => glass_u_value_hundredths
120 => better_glass_u_value_hundredths

int(wall_area_m2 * wall_u_value_hundredths / 100) => wall_loss_watts_per_kelvin
int(glass_area_m2 * glass_u_value_hundredths / 100) => glass_loss_watts_per_kelvin
wall_loss_watts_per_kelvin + glass_loss_watts_per_kelvin => total_loss_watts_per_kelvin
int(glass_loss_watts_per_kelvin * 10000 / total_loss_watts_per_kelvin) => glass_share_of_the_loss_per_myriad
int(glass_u_value_hundredths / wall_u_value_hundredths) => glass_conducts_times_the_wall_per_square_metre
int(wall_area_m2 / glass_area_m2) => wall_is_times_the_glass_in_area

int(wall_area_m2 * wall_u_value_after_doubling_insulation_hundredths / 100) => wall_loss_after_doubling_insulation_watts_per_kelvin
wall_loss_watts_per_kelvin - wall_loss_after_doubling_insulation_watts_per_kelvin => saving_from_doubling_insulation_watts_per_kelvin
int(saving_from_doubling_insulation_watts_per_kelvin * 10000 / total_loss_watts_per_kelvin) => saving_from_insulation_per_myriad_of_total

int(glass_area_m2 * better_glass_u_value_hundredths / 100) => glass_loss_with_better_glass_watts_per_kelvin
glass_loss_watts_per_kelvin - glass_loss_with_better_glass_watts_per_kelvin => saving_from_better_glass_watts_per_kelvin
int(saving_from_better_glass_watts_per_kelvin * 10000 / total_loss_watts_per_kelvin) => saving_from_glass_per_myriad_of_total

"wall                            : " + str(wall_area_m2) + " m2 at U " + str(wall_u_value_hundredths) + " hundredths, " + str(wall_loss_watts_per_kelvin) + " W per degree" ^0
"glass                           : " + str(glass_area_m2) + " m2 at U " + str(glass_u_value_hundredths) + " hundredths, " + str(glass_loss_watts_per_kelvin) + " W per degree" ^0
"total                           : " + str(total_loss_watts_per_kelvin) + " W per degree" ^0
"glass share of the loss         : " + str(glass_share_of_the_loss_per_myriad) + " per ten thousand, from a fifth of the area" ^0
"per square metre                : glass conducts " + str(glass_conducts_times_the_wall_per_square_metre) + " times the wall" ^0
"" ^0
"double the wall insulation      : wall to " + str(wall_loss_after_doubling_insulation_watts_per_kelvin) + " W per degree, saving " + str(saving_from_doubling_insulation_watts_per_kelvin) + ", " + str(saving_from_insulation_per_myriad_of_total) + " per ten thousand of the total" ^0
"better glass instead            : glass to " + str(glass_loss_with_better_glass_watts_per_kelvin) + " W per degree, saving " + str(saving_from_better_glass_watts_per_kelvin) + ", " + str(saving_from_glass_per_myriad_of_total) + " per ten thousand of the total" ^0
"" ^0

# ---- what the owner verified ----

"the most-of-the-surface reasoning" ^0
"  areas : wall " + str(wall_area_m2) + " m2, glass " + str(glass_area_m2) + " m2, " + str(wall_is_times_the_glass_in_area) + " to 1" ^0
"  insulation : doubled, which halves the wall's loss" ^0
"  workmanship : good" ^0
"  intent : cut the heat loss where most of the surface is" ^0
"  facts wrong : 0" ^0
"  verdict : INSULATE THE BIG SURFACE" ^0
"" ^0
"  doubling the insulation and halving the wall's loss is the" ^0
"  part done right here, and it is why the wall's " + str(wall_loss_watts_per_kelvin) + " W per" ^0
"  degree really did become " + str(wall_loss_after_doubling_insulation_watts_per_kelvin) ^0
"" ^0

# ---- where the heat was leaving ----

"area times conductance" ^0
"  what each surface loses : its area times how well it conducts" ^0
"  the wall : large area, small conductance, " + str(wall_loss_watts_per_kelvin) + " W per degree" ^0
"  the glass : a fifth of the area, " + str(glass_conducts_times_the_wall_per_square_metre) + " times the conductance," ^0
"    " + str(glass_loss_watts_per_kelvin) + " W per degree, " + str(glass_share_of_the_loss_per_myriad) + " per ten thousand of the whole" ^0
"  halving the smaller leak : saves " + str(saving_from_doubling_insulation_watts_per_kelvin) ^0
"  cutting the larger leak by half : saves " + str(saving_from_better_glass_watts_per_kelvin) ^0
"  what area alone ranked : the surfaces; what the heat" ^0
"    follows : the conductances" ^0
"" ^0

# ---- what the owner got ----

"the bill" ^0
"  believed : the big surface fixed, most of the loss gone" ^0
"  actual : " + str(saving_from_insulation_per_myriad_of_total) + " per ten thousand of the loss gone, a sixth" ^0
"  was the insulation wasted : no; it saved " + str(saving_from_doubling_insulation_watts_per_kelvin) + " W per degree" ^0
"  was it where the heat left : no; " + str(glass_share_of_the_loss_per_myriad) + " per ten thousand of the" ^0
"    heat left through the fifth of the surface that is glass" ^0
"" ^0

# ---- null control ----

# The same budget spent on the surface ranked by watts per degree instead of
# by square metres.
15 => nc_saving_ranking_surfaces_by_area_watts_per_kelvin
32 => nc_saving_ranking_surfaces_by_loss_watts_per_kelvin
17 => nc_watts_per_kelvin_the_ranking_recovers

"null control - rank the surfaces by what they lose" ^0
"  saving, ranking by area : " + str(nc_saving_ranking_surfaces_by_area_watts_per_kelvin) + " W per degree" ^0
"  saving, ranking by loss : " + str(nc_saving_ranking_surfaces_by_loss_watts_per_kelvin) + " W per degree" ^0
"  watts per degree the ranking recovers : " + str(nc_watts_per_kelvin_the_ranking_recovers) ^0
"  no house and no budget changed; the leaks were ranked by" ^0
"  area times conductance, not by area" ^0
"" ^0

# ---- the rule ----

"what doubling the insulation of the largest surface guarantees" ^0
"  that surface loses half what it did : exactly, " + str(wall_loss_watts_per_kelvin) + " to " + str(wall_loss_after_doubling_insulation_watts_per_kelvin) ^0
"  most of the house's loss is cut : not addressed; the loss" ^0
"    follows area times conductance, the glass carries " + str(glass_share_of_the_loss_per_myriad) + " per" ^0
"    ten thousand of it from a fifth of the area, and the wall" ^0
"    work saves " + str(saving_from_doubling_insulation_watts_per_kelvin) + " of " + str(total_loss_watts_per_kelvin) ^0
"" ^0

"heat does not leave by the square metre; it leaves by the path of least" ^0
"resistance, and a small window is a wide door when the wall beside it is" ^0
"already shut" ^0
"" ^0

"The wall is " + str(wall_is_times_the_glass_in_area) + " times the glass in area and its loss really was halved. But" ^0
"loss is area times conductance, and the glass conducts " + str(glass_conducts_times_the_wall_per_square_metre) + " times as well:" ^0
"" + str(glass_loss_watts_per_kelvin) + " W per degree from the glass against " + str(wall_loss_watts_per_kelvin) + " from the wall, so the insulation saved" ^0
"" + str(saving_from_doubling_insulation_watts_per_kelvin) + " where better glass saves " + str(saving_from_better_glass_watts_per_kelvin) + ", until the surfaces are ranked by what they lose." ^0

Python (deterministic transpilation)

python
wall_area_m2 = 100
glass_area_m2 = 20
wall_u_value_hundredths = 30
wall_u_value_after_doubling_insulation_hundredths = 15
glass_u_value_hundredths = 280
better_glass_u_value_hundredths = 120
wall_loss_watts_per_kelvin = int(wall_area_m2 * wall_u_value_hundredths / 100)
glass_loss_watts_per_kelvin = int(glass_area_m2 * glass_u_value_hundredths / 100)
total_loss_watts_per_kelvin = wall_loss_watts_per_kelvin + glass_loss_watts_per_kelvin
glass_share_of_the_loss_per_myriad = int(glass_loss_watts_per_kelvin * 10000 / total_loss_watts_per_kelvin)
glass_conducts_times_the_wall_per_square_metre = int(glass_u_value_hundredths / wall_u_value_hundredths)
wall_is_times_the_glass_in_area = int(wall_area_m2 / glass_area_m2)
wall_loss_after_doubling_insulation_watts_per_kelvin = int(wall_area_m2 * wall_u_value_after_doubling_insulation_hundredths / 100)
saving_from_doubling_insulation_watts_per_kelvin = wall_loss_watts_per_kelvin - wall_loss_after_doubling_insulation_watts_per_kelvin
saving_from_insulation_per_myriad_of_total = int(saving_from_doubling_insulation_watts_per_kelvin * 10000 / total_loss_watts_per_kelvin)
glass_loss_with_better_glass_watts_per_kelvin = int(glass_area_m2 * better_glass_u_value_hundredths / 100)
saving_from_better_glass_watts_per_kelvin = glass_loss_watts_per_kelvin - glass_loss_with_better_glass_watts_per_kelvin
saving_from_glass_per_myriad_of_total = int(saving_from_better_glass_watts_per_kelvin * 10000 / total_loss_watts_per_kelvin)
print("wall                            : " + str(wall_area_m2) + " m2 at U " + str(wall_u_value_hundredths) + " hundredths, " + str(wall_loss_watts_per_kelvin) + " W per degree")
print("glass                           : " + str(glass_area_m2) + " m2 at U " + str(glass_u_value_hundredths) + " hundredths, " + str(glass_loss_watts_per_kelvin) + " W per degree")
print("total                           : " + str(total_loss_watts_per_kelvin) + " W per degree")
print("glass share of the loss         : " + str(glass_share_of_the_loss_per_myriad) + " per ten thousand, from a fifth of the area")
print("per square metre                : glass conducts " + str(glass_conducts_times_the_wall_per_square_metre) + " times the wall")
print("")
print("double the wall insulation      : wall to " + str(wall_loss_after_doubling_insulation_watts_per_kelvin) + " W per degree, saving " + str(saving_from_doubling_insulation_watts_per_kelvin) + ", " + str(saving_from_insulation_per_myriad_of_total) + " per ten thousand of the total")
print("better glass instead            : glass to " + str(glass_loss_with_better_glass_watts_per_kelvin) + " W per degree, saving " + str(saving_from_better_glass_watts_per_kelvin) + ", " + str(saving_from_glass_per_myriad_of_total) + " per ten thousand of the total")
print("")
print("the most-of-the-surface reasoning")
print("  areas : wall " + str(wall_area_m2) + " m2, glass " + str(glass_area_m2) + " m2, " + str(wall_is_times_the_glass_in_area) + " to 1")
print("  insulation : doubled, which halves the wall's loss")
print("  workmanship : good")
print("  intent : cut the heat loss where most of the surface is")
print("  facts wrong : 0")
print("  verdict : INSULATE THE BIG SURFACE")
print("")
print("  doubling the insulation and halving the wall's loss is the")
print("  part done right here, and it is why the wall's " + str(wall_loss_watts_per_kelvin) + " W per")
print("  degree really did become " + str(wall_loss_after_doubling_insulation_watts_per_kelvin))
print("")
print("area times conductance")
print("  what each surface loses : its area times how well it conducts")
print("  the wall : large area, small conductance, " + str(wall_loss_watts_per_kelvin) + " W per degree")
print("  the glass : a fifth of the area, " + str(glass_conducts_times_the_wall_per_square_metre) + " times the conductance,")
print("    " + str(glass_loss_watts_per_kelvin) + " W per degree, " + str(glass_share_of_the_loss_per_myriad) + " per ten thousand of the whole")
print("  halving the smaller leak : saves " + str(saving_from_doubling_insulation_watts_per_kelvin))
print("  cutting the larger leak by half : saves " + str(saving_from_better_glass_watts_per_kelvin))
print("  what area alone ranked : the surfaces; what the heat")
print("    follows : the conductances")
print("")
print("the bill")
print("  believed : the big surface fixed, most of the loss gone")
print("  actual : " + str(saving_from_insulation_per_myriad_of_total) + " per ten thousand of the loss gone, a sixth")
print("  was the insulation wasted : no; it saved " + str(saving_from_doubling_insulation_watts_per_kelvin) + " W per degree")
print("  was it where the heat left : no; " + str(glass_share_of_the_loss_per_myriad) + " per ten thousand of the")
print("    heat left through the fifth of the surface that is glass")
print("")
nc_saving_ranking_surfaces_by_area_watts_per_kelvin = 15
nc_saving_ranking_surfaces_by_loss_watts_per_kelvin = 32
nc_watts_per_kelvin_the_ranking_recovers = 17
print("null control - rank the surfaces by what they lose")
print("  saving, ranking by area : " + str(nc_saving_ranking_surfaces_by_area_watts_per_kelvin) + " W per degree")
print("  saving, ranking by loss : " + str(nc_saving_ranking_surfaces_by_loss_watts_per_kelvin) + " W per degree")
print("  watts per degree the ranking recovers : " + str(nc_watts_per_kelvin_the_ranking_recovers))
print("  no house and no budget changed; the leaks were ranked by")
print("  area times conductance, not by area")
print("")
print("what doubling the insulation of the largest surface guarantees")
print("  that surface loses half what it did : exactly, " + str(wall_loss_watts_per_kelvin) + " to " + str(wall_loss_after_doubling_insulation_watts_per_kelvin))
print("  most of the house's loss is cut : not addressed; the loss")
print("    follows area times conductance, the glass carries " + str(glass_share_of_the_loss_per_myriad) + " per")
print("    ten thousand of it from a fifth of the area, and the wall")
print("    work saves " + str(saving_from_doubling_insulation_watts_per_kelvin) + " of " + str(total_loss_watts_per_kelvin))
print("")
print("heat does not leave by the square metre; it leaves by the path of least")
print("resistance, and a small window is a wide door when the wall beside it is")
print("already shut")
print("")
print("The wall is " + str(wall_is_times_the_glass_in_area) + " times the glass in area and its loss really was halved. But")
print("loss is area times conductance, and the glass conducts " + str(glass_conducts_times_the_wall_per_square_metre) + " times as well:")
print("" + str(glass_loss_watts_per_kelvin) + " W per degree from the glass against " + str(wall_loss_watts_per_kelvin) + " from the wall, so the insulation saved")
print("" + str(saving_from_doubling_insulation_watts_per_kelvin) + " where better glass saves " + str(saving_from_better_glass_watts_per_kelvin) + ", until the surfaces are ranked by what they lose.")

stdout (executed)

text
wall                            : 100 m2 at U 30 hundredths, 30 W per degree
glass                           : 20 m2 at U 280 hundredths, 56 W per degree
total                           : 86 W per degree
glass share of the loss         : 6511 per ten thousand, from a fifth of the area
per square metre                : glass conducts 9 times the wall

double the wall insulation      : wall to 15 W per degree, saving 15, 1744 per ten thousand of the total
better glass instead            : glass to 24 W per degree, saving 32, 3720 per ten thousand of the total

the most-of-the-surface reasoning
  areas : wall 100 m2, glass 20 m2, 5 to 1
  insulation : doubled, which halves the wall's loss
  workmanship : good
  intent : cut the heat loss where most of the surface is
  facts wrong : 0
  verdict : INSULATE THE BIG SURFACE

  doubling the insulation and halving the wall's loss is the
  part done right here, and it is why the wall's 30 W per
  degree really did become 15

area times conductance
  what each surface loses : its area times how well it conducts
  the wall : large area, small conductance, 30 W per degree
  the glass : a fifth of the area, 9 times the conductance,
    56 W per degree, 6511 per ten thousand of the whole
  halving the smaller leak : saves 15
  cutting the larger leak by half : saves 32
  what area alone ranked : the surfaces; what the heat
    follows : the conductances

the bill
  believed : the big surface fixed, most of the loss gone
  actual : 1744 per ten thousand of the loss gone, a sixth
  was the insulation wasted : no; it saved 15 W per degree
  was it where the heat left : no; 6511 per ten thousand of the
    heat left through the fifth of the surface that is glass

null control - rank the surfaces by what they lose
  saving, ranking by area : 15 W per degree
  saving, ranking by loss : 32 W per degree
  watts per degree the ranking recovers : 17
  no house and no budget changed; the leaks were ranked by
  area times conductance, not by area

what doubling the insulation of the largest surface guarantees
  that surface loses half what it did : exactly, 30 to 15
  most of the house's loss is cut : not addressed; the loss
    follows area times conductance, the glass carries 6511 per
    ten thousand of it from a fifth of the area, and the wall
    work saves 15 of 86

heat does not leave by the square metre; it leaves by the path of least
resistance, and a small window is a wide door when the wall beside it is
already shut

The wall is 5 times the glass in area and its loss really was halved. But
loss is area times conductance, and the glass conducts 9 times as well:
56 W per degree from the glass against 30 from the wall, so the insulation saved
15 where better glass saves 32, until the surfaces are ranked by what they lose.

Trace event types

eml:run:starteml:assigneml:outputeml:run:done