Case 993
The firebreaks took four percent of the woodland and half its interior
the_firebreaks_took_four_percent_of_the_woodland_and_half_its_interior.eml - A forester cuts two firebreaks, each 40 metres wide, crossing through the middle of a woodland 2 km on a side, and reasons that they take only 4 percent of the trees, leaving 96 percent of the woodland for its wildlife. How much of the habitat the deep- woodland species need is left is computed below.
ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-24
EML
eml# Self-authored for the EML case corpus (no external origin). A forester cuts two
# firebreaks, each 40 metres wide, crossing through the middle of a woodland 2 km
# on a side, and reasons that they take only 4 percent of the trees, leaving 96
# percent of the woodland for its wildlife. How much of the habitat the deep-
# woodland species need is left is computed below.
#
# The reasoning is careful. The firebreaks really do take 39 per mille of the
# area; the rest really stays wooded; the breaks really are narrow; and the
# intent is exactly 'how much habitat is left'.
#
# Species of the deep woodland avoid the edges - the light, wind, predators and
# weeds that reach about 200 metres in from any opening. Their habitat is the
# interior, and every new edge eats a 200 metre band on each side of it. The
# cross turns one block into four, the edge length nearly doubles, and the
# interior falls from 256 hectares to 134 - 474 per mille of it gone for 39 per
# mille of the trees.
2000 => woodland_side_m
40 => firebreak_width_m
200 => edge_effect_reaches_m
woodland_side_m * woodland_side_m => woodland_area_m2
2 * firebreak_width_m * woodland_side_m - firebreak_width_m * firebreak_width_m => firebreak_area_m2
int(firebreak_area_m2 * 1000 / woodland_area_m2) => trees_removed_per_mille
(woodland_side_m - 2 * edge_effect_reaches_m) * (woodland_side_m - 2 * edge_effect_reaches_m) => interior_before_m2
int((woodland_side_m - firebreak_width_m) / 2) => block_side_m
4 * (block_side_m - 2 * edge_effect_reaches_m) * (block_side_m - 2 * edge_effect_reaches_m) => interior_after_m2
interior_before_m2 - interior_after_m2 => interior_lost_m2
int(interior_lost_m2 * 1000 / interior_before_m2) => interior_lost_per_mille
int(interior_before_m2 / 10000) => interior_before_ha
int(interior_after_m2 / 10000) => interior_after_ha
int(woodland_area_m2 / 10000) => woodland_ha
4 * woodland_side_m => edge_before_m
4 * 4 * block_side_m => edge_after_m
"woodland : " + str(woodland_side_m) + " m on a side, " + str(woodland_ha) + " ha" ^0
"firebreaks : two, " + str(firebreak_width_m) + " m wide, crossing in the middle" ^0
"trees removed : " + str(trees_removed_per_mille) + " per mille of the area" ^0
"edge effects reach : " + str(edge_effect_reaches_m) + " m in from any opening" ^0
"" ^0
"blocks : 4, each " + str(block_side_m) + " m on a side" ^0
"edge length : " + str(edge_before_m) + " m before, " + str(edge_after_m) + " m after" ^0
"interior habitat : " + str(interior_before_ha) + " ha before, " + str(interior_after_ha) + " ha after" ^0
"interior lost : " + str(interior_lost_per_mille) + " per mille" ^0
"" ^0
# ---- what the forester verified ----
"the narrow-breaks reasoning" ^0
" area taken : " + str(trees_removed_per_mille) + " per mille, measured" ^0
" the rest : still wooded" ^0
" the breaks : narrow, " + str(firebreak_width_m) + " m" ^0
" intent : how much habitat is left" ^0
" facts wrong : 0" ^0
" verdict : THE WILDLIFE KEEPS NINETY-SIX PERCENT OF THE WOODLAND" ^0
"" ^0
" measuring the area the breaks take is the part done right here," ^0
" and it is why " + str(trees_removed_per_mille) + " per mille is exactly the share of trees felled" ^0
"" ^0
# ---- what an edge takes ----
"habitat is interior" ^0
" what the deep-woodland species avoid : the light, wind, predators" ^0
" and weeds that come in from an edge, up to " + str(edge_effect_reaches_m) + " m" ^0
" their habitat : what lies more than " + str(edge_effect_reaches_m) + " m from every edge" ^0
" one block : " + str(interior_before_ha) + " ha of interior inside a " + str(woodland_ha) + " ha woodland" ^0
" four blocks : each loses a " + str(edge_effect_reaches_m) + " m band along the new edges, and" ^0
" the edge length goes from " + str(edge_before_m) + " to " + str(edge_after_m) + " m" ^0
" what is left : " + str(interior_after_ha) + " ha, " + str(interior_lost_per_mille) + " per mille lost for " + str(trees_removed_per_mille) + " per mille of trees" ^0
"" ^0
# ---- what the forester got ----
"the habitat" ^0
" believed : " + str(1000 - trees_removed_per_mille) + " per mille of the woodland left for wildlife" ^0
" actual : " + str(1000 - interior_lost_per_mille) + " per mille of the interior left for the species that need it" ^0
" is the area measured wrongly : no" ^0
" is woodland the same as habitat : not for species that live" ^0
" only far from an edge" ^0
"" ^0
# ---- null control ----
# The same cut judged by the interior it removes instead of by the trees.
39 => nc_habitat_lost_read_as_trees_removed_per_mille
474 => nc_habitat_lost_counting_the_interior_per_mille
435 => nc_per_mille_the_new_edges_add
"null control - count the interior, not the trees" ^0
" habitat lost, read as trees removed : " + str(nc_habitat_lost_read_as_trees_removed_per_mille) + " per mille" ^0
" habitat lost, counting the interior : " + str(nc_habitat_lost_counting_the_interior_per_mille) + " per mille" ^0
" per mille the new edges add : " + str(nc_per_mille_the_new_edges_add) ^0
" no tree and no break changed; the habitat was measured the way" ^0
" the species that need it measure it" ^0
"" ^0
# ---- the rule ----
"what narrow firebreaks guarantee" ^0
" they fell " + str(trees_removed_per_mille) + " per mille of the woodland : exactly" ^0
" the wildlife keeps the rest : not addressed; the species of the" ^0
" deep woodland live more than " + str(edge_effect_reaches_m) + " m from any edge, and the cross" ^0
" cuts their interior from " + str(interior_before_ha) + " ha to " + str(interior_after_ha) + ", " + str(interior_lost_per_mille) + " per mille gone" ^0
"" ^0
"a cut is measured in what it removes and paid for in the edges it makes;" ^0
"for the animals that live away from edges, a line through the middle is" ^0
"worth more than a strip off the side" ^0
"" ^0
"The breaks take " + str(trees_removed_per_mille) + " per mille of the woodland - that is right. But the deep-" ^0
"woodland species need to be " + str(edge_effect_reaches_m) + " m from any edge, and four blocks of " + str(block_side_m) + " m" ^0
"hold " + str(interior_after_ha) + " ha of interior where one block held " + str(interior_before_ha) + ", " + str(interior_lost_per_mille) + " per mille gone, until the" ^0
"habitat is measured by its interior and not by its trees." ^0Python (deterministic transpilation)
pythonwoodland_side_m = 2000
firebreak_width_m = 40
edge_effect_reaches_m = 200
woodland_area_m2 = woodland_side_m * woodland_side_m
firebreak_area_m2 = 2 * firebreak_width_m * woodland_side_m - firebreak_width_m * firebreak_width_m
trees_removed_per_mille = int(firebreak_area_m2 * 1000 / woodland_area_m2)
interior_before_m2 = (woodland_side_m - 2 * edge_effect_reaches_m) * (woodland_side_m - 2 * edge_effect_reaches_m)
block_side_m = int((woodland_side_m - firebreak_width_m) / 2)
interior_after_m2 = 4 * (block_side_m - 2 * edge_effect_reaches_m) * (block_side_m - 2 * edge_effect_reaches_m)
interior_lost_m2 = interior_before_m2 - interior_after_m2
interior_lost_per_mille = int(interior_lost_m2 * 1000 / interior_before_m2)
interior_before_ha = int(interior_before_m2 / 10000)
interior_after_ha = int(interior_after_m2 / 10000)
woodland_ha = int(woodland_area_m2 / 10000)
edge_before_m = 4 * woodland_side_m
edge_after_m = 4 * 4 * block_side_m
print("woodland : " + str(woodland_side_m) + " m on a side, " + str(woodland_ha) + " ha")
print("firebreaks : two, " + str(firebreak_width_m) + " m wide, crossing in the middle")
print("trees removed : " + str(trees_removed_per_mille) + " per mille of the area")
print("edge effects reach : " + str(edge_effect_reaches_m) + " m in from any opening")
print("")
print("blocks : 4, each " + str(block_side_m) + " m on a side")
print("edge length : " + str(edge_before_m) + " m before, " + str(edge_after_m) + " m after")
print("interior habitat : " + str(interior_before_ha) + " ha before, " + str(interior_after_ha) + " ha after")
print("interior lost : " + str(interior_lost_per_mille) + " per mille")
print("")
print("the narrow-breaks reasoning")
print(" area taken : " + str(trees_removed_per_mille) + " per mille, measured")
print(" the rest : still wooded")
print(" the breaks : narrow, " + str(firebreak_width_m) + " m")
print(" intent : how much habitat is left")
print(" facts wrong : 0")
print(" verdict : THE WILDLIFE KEEPS NINETY-SIX PERCENT OF THE WOODLAND")
print("")
print(" measuring the area the breaks take is the part done right here,")
print(" and it is why " + str(trees_removed_per_mille) + " per mille is exactly the share of trees felled")
print("")
print("habitat is interior")
print(" what the deep-woodland species avoid : the light, wind, predators")
print(" and weeds that come in from an edge, up to " + str(edge_effect_reaches_m) + " m")
print(" their habitat : what lies more than " + str(edge_effect_reaches_m) + " m from every edge")
print(" one block : " + str(interior_before_ha) + " ha of interior inside a " + str(woodland_ha) + " ha woodland")
print(" four blocks : each loses a " + str(edge_effect_reaches_m) + " m band along the new edges, and")
print(" the edge length goes from " + str(edge_before_m) + " to " + str(edge_after_m) + " m")
print(" what is left : " + str(interior_after_ha) + " ha, " + str(interior_lost_per_mille) + " per mille lost for " + str(trees_removed_per_mille) + " per mille of trees")
print("")
print("the habitat")
print(" believed : " + str(1000 - trees_removed_per_mille) + " per mille of the woodland left for wildlife")
print(" actual : " + str(1000 - interior_lost_per_mille) + " per mille of the interior left for the species that need it")
print(" is the area measured wrongly : no")
print(" is woodland the same as habitat : not for species that live")
print(" only far from an edge")
print("")
nc_habitat_lost_read_as_trees_removed_per_mille = 39
nc_habitat_lost_counting_the_interior_per_mille = 474
nc_per_mille_the_new_edges_add = 435
print("null control - count the interior, not the trees")
print(" habitat lost, read as trees removed : " + str(nc_habitat_lost_read_as_trees_removed_per_mille) + " per mille")
print(" habitat lost, counting the interior : " + str(nc_habitat_lost_counting_the_interior_per_mille) + " per mille")
print(" per mille the new edges add : " + str(nc_per_mille_the_new_edges_add))
print(" no tree and no break changed; the habitat was measured the way")
print(" the species that need it measure it")
print("")
print("what narrow firebreaks guarantee")
print(" they fell " + str(trees_removed_per_mille) + " per mille of the woodland : exactly")
print(" the wildlife keeps the rest : not addressed; the species of the")
print(" deep woodland live more than " + str(edge_effect_reaches_m) + " m from any edge, and the cross")
print(" cuts their interior from " + str(interior_before_ha) + " ha to " + str(interior_after_ha) + ", " + str(interior_lost_per_mille) + " per mille gone")
print("")
print("a cut is measured in what it removes and paid for in the edges it makes;")
print("for the animals that live away from edges, a line through the middle is")
print("worth more than a strip off the side")
print("")
print("The breaks take " + str(trees_removed_per_mille) + " per mille of the woodland - that is right. But the deep-")
print("woodland species need to be " + str(edge_effect_reaches_m) + " m from any edge, and four blocks of " + str(block_side_m) + " m")
print("hold " + str(interior_after_ha) + " ha of interior where one block held " + str(interior_before_ha) + ", " + str(interior_lost_per_mille) + " per mille gone, until the")
print("habitat is measured by its interior and not by its trees.")stdout (executed)
textwoodland : 2000 m on a side, 400 ha
firebreaks : two, 40 m wide, crossing in the middle
trees removed : 39 per mille of the area
edge effects reach : 200 m in from any opening
blocks : 4, each 980 m on a side
edge length : 8000 m before, 15680 m after
interior habitat : 256 ha before, 134 ha after
interior lost : 474 per mille
the narrow-breaks reasoning
area taken : 39 per mille, measured
the rest : still wooded
the breaks : narrow, 40 m
intent : how much habitat is left
facts wrong : 0
verdict : THE WILDLIFE KEEPS NINETY-SIX PERCENT OF THE WOODLAND
measuring the area the breaks take is the part done right here,
and it is why 39 per mille is exactly the share of trees felled
habitat is interior
what the deep-woodland species avoid : the light, wind, predators
and weeds that come in from an edge, up to 200 m
their habitat : what lies more than 200 m from every edge
one block : 256 ha of interior inside a 400 ha woodland
four blocks : each loses a 200 m band along the new edges, and
the edge length goes from 8000 to 15680 m
what is left : 134 ha, 474 per mille lost for 39 per mille of trees
the habitat
believed : 961 per mille of the woodland left for wildlife
actual : 526 per mille of the interior left for the species that need it
is the area measured wrongly : no
is woodland the same as habitat : not for species that live
only far from an edge
null control - count the interior, not the trees
habitat lost, read as trees removed : 39 per mille
habitat lost, counting the interior : 474 per mille
per mille the new edges add : 435
no tree and no break changed; the habitat was measured the way
the species that need it measure it
what narrow firebreaks guarantee
they fell 39 per mille of the woodland : exactly
the wildlife keeps the rest : not addressed; the species of the
deep woodland live more than 200 m from any edge, and the cross
cuts their interior from 256 ha to 134, 474 per mille gone
a cut is measured in what it removes and paid for in the edges it makes;
for the animals that live away from edges, a line through the middle is
worth more than a strip off the side
The breaks take 39 per mille of the woodland - that is right. But the deep-
woodland species need to be 200 m from any edge, and four blocks of 980 m
hold 134 ha of interior where one block held 256, 474 per mille gone, until the
habitat is measured by its interior and not by its trees.Trace event types
eml:run:starteml:assigneml:outputeml:run:done