Case 998
The stone thrown from the boat lowered the pond
the_stone_thrown_from_the_boat_lowered_the_pond.eml - Someone sitting in a small boat on a 10 square metre garden pond heaves a 100 kg stone over the side and reasons that the pond will rise, because the stone now takes up 40 litres of room under the water. Which way the pond level moves 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). Someone sitting in a
# small boat on a 10 square metre garden pond heaves a 100 kg stone over the side
# and reasons that the pond will rise, because the stone now takes up 40 litres
# of room under the water. Which way the pond level moves is computed below.
#
# The reasoning is careful. The stone really does take up 40 litres; it really
# is now under the water; anything sunk in a pond really does push the water
# up by its volume; and the intent is exactly 'what happens to the level'.
#
# While the stone rode in the boat it was already pushing water aside - enough
# to carry its weight, 100 kg of water, 100 litres. On the bottom it pushes
# aside only its own volume, 40 litres. The pond gives back 60 litres and the
# level falls 6 mm, where the reasoning expected it to rise 4.
100 => stone_kg
2500 => stone_kg_per_m3
1000 => water_kg_per_m3
10 => pond_area_m2
int(stone_kg * 1000 / water_kg_per_m3) => water_pushed_aside_in_the_boat_litres
int(stone_kg * 1000 / stone_kg_per_m3) => water_pushed_aside_on_the_bottom_litres
water_pushed_aside_in_the_boat_litres - water_pushed_aside_on_the_bottom_litres => water_given_back_litres
int(water_given_back_litres * 1000 * 100 / (pond_area_m2 * 10000)) => level_falls_tenths_of_a_mm
int(water_pushed_aside_on_the_bottom_litres * 1000 * 100 / (pond_area_m2 * 10000)) => rise_expected_tenths_of_a_mm
level_falls_tenths_of_a_mm + rise_expected_tenths_of_a_mm => expectation_off_by_tenths_of_a_mm
int(stone_kg_per_m3 * 100 / water_kg_per_m3) => stone_density_vs_water_per_hundred
"stone : " + str(stone_kg) + " kg, " + str(stone_density_vs_water_per_hundred) + " per hundred as dense as water" ^0
"pond : " + str(pond_area_m2) + " m2" ^0
"" ^0
"water pushed aside, in the boat : " + str(water_pushed_aside_in_the_boat_litres) + " litres, the stone's weight of water" ^0
"water pushed aside, on the bottom : " + str(water_pushed_aside_on_the_bottom_litres) + " litres, the stone's volume" ^0
"water given back to the pond : " + str(water_given_back_litres) + " litres" ^0
"" ^0
"level, expected : up " + str(rise_expected_tenths_of_a_mm) + " tenths of a mm" ^0
"level, actual : down " + str(level_falls_tenths_of_a_mm) + " tenths of a mm" ^0
"expectation off by : " + str(expectation_off_by_tenths_of_a_mm) + " tenths of a mm" ^0
"" ^0
# ---- what the thrower verified ----
"the stone-takes-up-room reasoning" ^0
" the stone's volume : " + str(water_pushed_aside_on_the_bottom_litres) + " litres" ^0
" where it is now : under the water, on the bottom" ^0
" the rule : a sunk object raises the water by its volume" ^0
" intent : what happens to the level" ^0
" facts wrong : 0" ^0
" verdict : THE POND RISES" ^0
"" ^0
" knowing that a sunk stone pushes aside its own volume is the" ^0
" part done right here, and it is why " + str(water_pushed_aside_on_the_bottom_litres) + " litres is exactly what" ^0
" it displaces on the bottom" ^0
"" ^0
# ---- where the stone was pushing before ----
"floating carries weight, sinking takes room" ^0
" in the boat : the boat sat deeper to carry the stone, pushing" ^0
" aside its weight in water, " + str(water_pushed_aside_in_the_boat_litres) + " litres" ^0
" on the bottom : the pond floor carries the weight, and the" ^0
" stone pushes aside only its volume, " + str(water_pushed_aside_on_the_bottom_litres) + " litres" ^0
" why they differ : the stone is " + str(stone_density_vs_water_per_hundred) + " per hundred as dense as water," ^0
" so its weight in water is bigger than its size" ^0
" what the pond gets back : " + str(water_given_back_litres) + " litres, and the level falls" ^0
"" ^0
# ---- what the thrower got ----
"the level" ^0
" believed : up " + str(rise_expected_tenths_of_a_mm) + " tenths of a mm" ^0
" actual : down " + str(level_falls_tenths_of_a_mm) + " tenths of a mm" ^0
" is the stone's volume wrong : no; " + str(water_pushed_aside_on_the_bottom_litres) + " litres" ^0
" is the stone new to the pond : no; it was already pushing" ^0
" water aside, more of it, from inside the boat" ^0
"" ^0
# ---- null control ----
# The same throw judged by comparing what the stone displaced before and after
# instead of by adding its volume to the pond.
40 => nc_level_change_read_as_adding_the_stone_tenths_of_a_mm
60 => nc_level_change_counting_the_boat_tenths_of_a_mm
100 => nc_tenths_of_a_mm_between_the_two_readings
"null control - compare before and after" ^0
" level change, read as adding the stone : up " + str(nc_level_change_read_as_adding_the_stone_tenths_of_a_mm) + " tenths of a mm" ^0
" level change, counting the boat : down " + str(nc_level_change_counting_the_boat_tenths_of_a_mm) + " tenths of a mm" ^0
" tenths of a mm between the two readings : " + str(nc_tenths_of_a_mm_between_the_two_readings) ^0
" no stone and no pond changed; what the stone displaced in the" ^0
" boat was counted before the throw" ^0
"" ^0
# ---- the rule ----
"what a sunk stone displacing its own volume guarantees" ^0
" it takes up " + str(water_pushed_aside_on_the_bottom_litres) + " litres of the pond : exactly" ^0
" the pond rises when it goes in : not addressed; in the boat it" ^0
" displaced its weight, " + str(water_pushed_aside_in_the_boat_litres) + " litres, so going overboard returns" ^0
" " + str(water_given_back_litres) + " litres and the level falls " + str(level_falls_tenths_of_a_mm) + " tenths of a mm" ^0
"" ^0
"a floating thing is paid for in weight and a sunken one in size; a stone" ^0
"heavier than water costs the pond more afloat than it ever will on the bottom" ^0
"" ^0
"The stone takes up " + str(water_pushed_aside_on_the_bottom_litres) + " litres under water - exactly. But in the boat it pushed" ^0
"aside its weight in water, " + str(water_pushed_aside_in_the_boat_litres) + " litres, so the throw hands " + str(water_given_back_litres) + " litres back and" ^0
"the level falls " + str(level_falls_tenths_of_a_mm) + " tenths of a mm where it was expected to rise " + str(rise_expected_tenths_of_a_mm) + ", until" ^0
"what the stone displaced in the boat is counted too." ^0Python (deterministic transpilation)
pythonstone_kg = 100
stone_kg_per_m3 = 2500
water_kg_per_m3 = 1000
pond_area_m2 = 10
water_pushed_aside_in_the_boat_litres = int(stone_kg * 1000 / water_kg_per_m3)
water_pushed_aside_on_the_bottom_litres = int(stone_kg * 1000 / stone_kg_per_m3)
water_given_back_litres = water_pushed_aside_in_the_boat_litres - water_pushed_aside_on_the_bottom_litres
level_falls_tenths_of_a_mm = int(water_given_back_litres * 1000 * 100 / (pond_area_m2 * 10000))
rise_expected_tenths_of_a_mm = int(water_pushed_aside_on_the_bottom_litres * 1000 * 100 / (pond_area_m2 * 10000))
expectation_off_by_tenths_of_a_mm = level_falls_tenths_of_a_mm + rise_expected_tenths_of_a_mm
stone_density_vs_water_per_hundred = int(stone_kg_per_m3 * 100 / water_kg_per_m3)
print("stone : " + str(stone_kg) + " kg, " + str(stone_density_vs_water_per_hundred) + " per hundred as dense as water")
print("pond : " + str(pond_area_m2) + " m2")
print("")
print("water pushed aside, in the boat : " + str(water_pushed_aside_in_the_boat_litres) + " litres, the stone's weight of water")
print("water pushed aside, on the bottom : " + str(water_pushed_aside_on_the_bottom_litres) + " litres, the stone's volume")
print("water given back to the pond : " + str(water_given_back_litres) + " litres")
print("")
print("level, expected : up " + str(rise_expected_tenths_of_a_mm) + " tenths of a mm")
print("level, actual : down " + str(level_falls_tenths_of_a_mm) + " tenths of a mm")
print("expectation off by : " + str(expectation_off_by_tenths_of_a_mm) + " tenths of a mm")
print("")
print("the stone-takes-up-room reasoning")
print(" the stone's volume : " + str(water_pushed_aside_on_the_bottom_litres) + " litres")
print(" where it is now : under the water, on the bottom")
print(" the rule : a sunk object raises the water by its volume")
print(" intent : what happens to the level")
print(" facts wrong : 0")
print(" verdict : THE POND RISES")
print("")
print(" knowing that a sunk stone pushes aside its own volume is the")
print(" part done right here, and it is why " + str(water_pushed_aside_on_the_bottom_litres) + " litres is exactly what")
print(" it displaces on the bottom")
print("")
print("floating carries weight, sinking takes room")
print(" in the boat : the boat sat deeper to carry the stone, pushing")
print(" aside its weight in water, " + str(water_pushed_aside_in_the_boat_litres) + " litres")
print(" on the bottom : the pond floor carries the weight, and the")
print(" stone pushes aside only its volume, " + str(water_pushed_aside_on_the_bottom_litres) + " litres")
print(" why they differ : the stone is " + str(stone_density_vs_water_per_hundred) + " per hundred as dense as water,")
print(" so its weight in water is bigger than its size")
print(" what the pond gets back : " + str(water_given_back_litres) + " litres, and the level falls")
print("")
print("the level")
print(" believed : up " + str(rise_expected_tenths_of_a_mm) + " tenths of a mm")
print(" actual : down " + str(level_falls_tenths_of_a_mm) + " tenths of a mm")
print(" is the stone's volume wrong : no; " + str(water_pushed_aside_on_the_bottom_litres) + " litres")
print(" is the stone new to the pond : no; it was already pushing")
print(" water aside, more of it, from inside the boat")
print("")
nc_level_change_read_as_adding_the_stone_tenths_of_a_mm = 40
nc_level_change_counting_the_boat_tenths_of_a_mm = 60
nc_tenths_of_a_mm_between_the_two_readings = 100
print("null control - compare before and after")
print(" level change, read as adding the stone : up " + str(nc_level_change_read_as_adding_the_stone_tenths_of_a_mm) + " tenths of a mm")
print(" level change, counting the boat : down " + str(nc_level_change_counting_the_boat_tenths_of_a_mm) + " tenths of a mm")
print(" tenths of a mm between the two readings : " + str(nc_tenths_of_a_mm_between_the_two_readings))
print(" no stone and no pond changed; what the stone displaced in the")
print(" boat was counted before the throw")
print("")
print("what a sunk stone displacing its own volume guarantees")
print(" it takes up " + str(water_pushed_aside_on_the_bottom_litres) + " litres of the pond : exactly")
print(" the pond rises when it goes in : not addressed; in the boat it")
print(" displaced its weight, " + str(water_pushed_aside_in_the_boat_litres) + " litres, so going overboard returns")
print(" " + str(water_given_back_litres) + " litres and the level falls " + str(level_falls_tenths_of_a_mm) + " tenths of a mm")
print("")
print("a floating thing is paid for in weight and a sunken one in size; a stone")
print("heavier than water costs the pond more afloat than it ever will on the bottom")
print("")
print("The stone takes up " + str(water_pushed_aside_on_the_bottom_litres) + " litres under water - exactly. But in the boat it pushed")
print("aside its weight in water, " + str(water_pushed_aside_in_the_boat_litres) + " litres, so the throw hands " + str(water_given_back_litres) + " litres back and")
print("the level falls " + str(level_falls_tenths_of_a_mm) + " tenths of a mm where it was expected to rise " + str(rise_expected_tenths_of_a_mm) + ", until")
print("what the stone displaced in the boat is counted too.")stdout (executed)
textstone : 100 kg, 250 per hundred as dense as water
pond : 10 m2
water pushed aside, in the boat : 100 litres, the stone's weight of water
water pushed aside, on the bottom : 40 litres, the stone's volume
water given back to the pond : 60 litres
level, expected : up 40 tenths of a mm
level, actual : down 60 tenths of a mm
expectation off by : 100 tenths of a mm
the stone-takes-up-room reasoning
the stone's volume : 40 litres
where it is now : under the water, on the bottom
the rule : a sunk object raises the water by its volume
intent : what happens to the level
facts wrong : 0
verdict : THE POND RISES
knowing that a sunk stone pushes aside its own volume is the
part done right here, and it is why 40 litres is exactly what
it displaces on the bottom
floating carries weight, sinking takes room
in the boat : the boat sat deeper to carry the stone, pushing
aside its weight in water, 100 litres
on the bottom : the pond floor carries the weight, and the
stone pushes aside only its volume, 40 litres
why they differ : the stone is 250 per hundred as dense as water,
so its weight in water is bigger than its size
what the pond gets back : 60 litres, and the level falls
the level
believed : up 40 tenths of a mm
actual : down 60 tenths of a mm
is the stone's volume wrong : no; 40 litres
is the stone new to the pond : no; it was already pushing
water aside, more of it, from inside the boat
null control - compare before and after
level change, read as adding the stone : up 40 tenths of a mm
level change, counting the boat : down 60 tenths of a mm
tenths of a mm between the two readings : 100
no stone and no pond changed; what the stone displaced in the
boat was counted before the throw
what a sunk stone displacing its own volume guarantees
it takes up 40 litres of the pond : exactly
the pond rises when it goes in : not addressed; in the boat it
displaced its weight, 100 litres, so going overboard returns
60 litres and the level falls 60 tenths of a mm
a floating thing is paid for in weight and a sunken one in size; a stone
heavier than water costs the pond more afloat than it ever will on the bottom
The stone takes up 40 litres under water - exactly. But in the boat it pushed
aside its weight in water, 100 litres, so the throw hands 60 litres back and
the level falls 60 tenths of a mm where it was expected to rise 40, until
what the stone displaced in the boat is counted too.Trace event types
eml:run:starteml:assigneml:outputeml:run:done