Case 979

The earth was closest to the sun in the northern winter

the_earth_was_closest_to_the_sun_in_the_northern_winter.eml - A student at 50 degrees north knows that the Earth's orbit is an ellipse, that the distance to the Sun changes through the year, and that sunlight falls with the square of the distance, and concludes that summer is when the Earth is nearest the Sun. When the Earth is nearest, and how much that matters, is computed below.

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

EML

eml
# Self-authored for the EML case corpus (no external origin). A student at 50
# degrees north knows that the Earth's orbit is an ellipse, that the distance to
# the Sun changes through the year, and that sunlight falls with the square of
# the distance, and concludes that summer is when the Earth is nearest the Sun.
# When the Earth is nearest, and how much that matters, is computed below.
#
# The reasoning is careful. The orbit is an ellipse; the distance does change,
# from 147.1 to 152.1 million km; sunlight does fall with its square; and the
# intent is exactly 'why summer is warm'.
#
# The Earth is nearest the Sun in early January, the northern winter, and the
# distance moves the sunlight by only 69 per mille. The tilt of the axis moves
# the noon Sun at 50 north from 16.5 degrees high in winter to 63.5 in summer,
# and a high Sun lays its light on less ground: 895 per mille of the beam on
# each square metre in summer, 284 per mille in winter - of a beam that is 69
# per mille stronger, because it is January.

1471 => nearest_distance_hundred_thousand_km
1521 => farthest_distance_hundred_thousand_km
50 => latitude_north_degrees
235 => axial_tilt_tenths_of_a_degree
284 => sine_of_the_winter_noon_sun_per_mille
895 => sine_of_the_summer_noon_sun_per_mille
81 => winter_day_tenths_of_an_hour
164 => summer_day_tenths_of_an_hour

int(farthest_distance_hundred_thousand_km * farthest_distance_hundred_thousand_km * 1000 / (nearest_distance_hundred_thousand_km * nearest_distance_hundred_thousand_km)) => january_beam_vs_july_per_mille
january_beam_vs_july_per_mille - 1000 => january_beam_stronger_by_per_mille
900 - latitude_north_degrees * 10 - axial_tilt_tenths_of_a_degree => winter_noon_sun_height_tenths
900 - latitude_north_degrees * 10 + axial_tilt_tenths_of_a_degree => summer_noon_sun_height_tenths
int(sine_of_the_winter_noon_sun_per_mille * january_beam_vs_july_per_mille / 1000) => winter_noon_ground_light_per_mille_of_the_july_beam
sine_of_the_summer_noon_sun_per_mille => summer_noon_ground_light_per_mille_of_the_july_beam
int(summer_noon_ground_light_per_mille_of_the_july_beam * 100 / winter_noon_ground_light_per_mille_of_the_july_beam) => summer_noon_vs_winter_noon_per_hundred
int(summer_day_tenths_of_an_hour * 100 / winter_day_tenths_of_an_hour) => summer_day_vs_winter_day_per_hundred
int(100000 / january_beam_vs_july_per_mille) => july_beam_vs_january_per_hundred

"nearest the sun                 : " + str(nearest_distance_hundred_thousand_km) + " hundred thousand km, early january" ^0
"farthest from the sun           : " + str(farthest_distance_hundred_thousand_km) + " hundred thousand km, early july" ^0
"january beam vs july beam       : " + str(january_beam_vs_july_per_mille) + " per mille, " + str(january_beam_stronger_by_per_mille) + " per mille stronger" ^0
"" ^0
"at " + str(latitude_north_degrees) + " north, noon sun height    : " + str(winter_noon_sun_height_tenths) + " tenths of a degree in winter, " + str(summer_noon_sun_height_tenths) + " in summer" ^0
"noon light on the ground, winter : " + str(winter_noon_ground_light_per_mille_of_the_july_beam) + " per mille of the july beam" ^0
"noon light on the ground, summer : " + str(summer_noon_ground_light_per_mille_of_the_july_beam) + " per mille of the july beam" ^0
"summer noon vs winter noon      : " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred" ^0
"day length                      : " + str(winter_day_tenths_of_an_hour) + " tenths of an hour in winter, " + str(summer_day_tenths_of_an_hour) + " in summer, " + str(summer_day_vs_winter_day_per_hundred) + " per hundred" ^0
"" ^0

# ---- what the student verified ----

"the nearest-in-summer reasoning" ^0
"  orbit : an ellipse" ^0
"  distance : changes through the year, " + str(nearest_distance_hundred_thousand_km) + " to " + str(farthest_distance_hundred_thousand_km) ^0
"  sunlight : falls with the square of the distance" ^0
"  intent : why summer is warm" ^0
"  facts wrong : 0" ^0
"  verdict : SUMMER IS WHEN THE EARTH IS NEAREST THE SUN" ^0
"" ^0
"  squaring the distance ratio is the part done right here," ^0
"  and it is why the beam really is " + str(january_beam_stronger_by_per_mille) + " per mille stronger at the" ^0
"  nearest point" ^0
"" ^0

# ---- what the tilt does and the distance does not ----

"the height of the noon sun" ^0
"  when the earth is nearest : early january, the northern winter" ^0
"  what the distance changes : the beam, by " + str(january_beam_stronger_by_per_mille) + " per mille" ^0
"  what the tilt changes : the noon sun's height, from " + str(winter_noon_sun_height_tenths) + " to" ^0
"    " + str(summer_noon_sun_height_tenths) + " tenths of a degree, and a low sun spreads the same beam" ^0
"    over more ground" ^0
"  noon light on each square metre : " + str(winter_noon_ground_light_per_mille_of_the_july_beam) + " in winter against " + str(summer_noon_ground_light_per_mille_of_the_july_beam) ^0
"    in summer, " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred, even with winter's stronger beam" ^0
"  and the day itself : " + str(summer_day_vs_winter_day_per_hundred) + " per hundred as long in summer" ^0
"" ^0

# ---- what the student got ----

"the explanation" ^0
"  believed : summer is the near part of the orbit" ^0
"  actual : the near part of the orbit is the northern winter" ^0
"  is the inverse square wrong : no; it moves the beam " + str(january_beam_stronger_by_per_mille) + " per mille" ^0
"  is distance what makes the seasons : no; the tilt moves the" ^0
"    noon light on the ground " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred the other way" ^0
"" ^0

# ---- null control ----

# The same seasons read from the height of the noon sun instead of from the
# distance to it.
93 => nc_summer_light_vs_winter_read_from_distance_per_hundred
295 => nc_summer_light_vs_winter_read_from_sun_height_per_hundred
202 => nc_per_hundred_the_height_reading_adds

"null control - read the seasons from the sun's height" ^0
"  summer vs winter light, read from distance : " + str(nc_summer_light_vs_winter_read_from_distance_per_hundred) + " per hundred" ^0
"  summer vs winter light, read from sun height : " + str(nc_summer_light_vs_winter_read_from_sun_height_per_hundred) + " per hundred" ^0
"  per hundred the height reading adds : " + str(nc_per_hundred_the_height_reading_adds) ^0
"  no orbit and no latitude changed; the quantity that decides" ^0
"  how much light each square metre gets was the one measured" ^0
"" ^0

# ---- the rule ----

"what an elliptical orbit and the inverse square guarantee" ^0
"  sunlight changes with the distance through the year : exactly" ^0
"  summer is when the earth is nearest : not addressed; the nearest" ^0
"    point falls in january, the distance moves the beam by " + str(january_beam_stronger_by_per_mille) ^0
"    per mille, and the tilt moves the noon light on the ground by" ^0
"    " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred the other way" ^0
"" ^0

"a true cause can be the wrong size; the distance really does change the" ^0
"sunlight, by a little, in the wrong month, while the tilt changes it by a" ^0
"lot, in the right one" ^0
"" ^0

"The orbit is an ellipse and the inverse square holds: the beam is " + str(january_beam_stronger_by_per_mille) + " per" ^0
"mille stronger at the nearest point. But the nearest point is in january, and" ^0
"at " + str(latitude_north_degrees) + " north the summer noon sun lays " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred of winter's light on each" ^0
"square metre, over a day " + str(summer_day_vs_winter_day_per_hundred) + " per hundred as long, until the seasons are read from the" ^0
"sun's height rather than its distance." ^0

Python (deterministic transpilation)

python
nearest_distance_hundred_thousand_km = 1471
farthest_distance_hundred_thousand_km = 1521
latitude_north_degrees = 50
axial_tilt_tenths_of_a_degree = 235
sine_of_the_winter_noon_sun_per_mille = 284
sine_of_the_summer_noon_sun_per_mille = 895
winter_day_tenths_of_an_hour = 81
summer_day_tenths_of_an_hour = 164
january_beam_vs_july_per_mille = int(farthest_distance_hundred_thousand_km * farthest_distance_hundred_thousand_km * 1000 / (nearest_distance_hundred_thousand_km * nearest_distance_hundred_thousand_km))
january_beam_stronger_by_per_mille = january_beam_vs_july_per_mille - 1000
winter_noon_sun_height_tenths = 900 - latitude_north_degrees * 10 - axial_tilt_tenths_of_a_degree
summer_noon_sun_height_tenths = 900 - latitude_north_degrees * 10 + axial_tilt_tenths_of_a_degree
winter_noon_ground_light_per_mille_of_the_july_beam = int(sine_of_the_winter_noon_sun_per_mille * january_beam_vs_july_per_mille / 1000)
summer_noon_ground_light_per_mille_of_the_july_beam = sine_of_the_summer_noon_sun_per_mille
summer_noon_vs_winter_noon_per_hundred = int(summer_noon_ground_light_per_mille_of_the_july_beam * 100 / winter_noon_ground_light_per_mille_of_the_july_beam)
summer_day_vs_winter_day_per_hundred = int(summer_day_tenths_of_an_hour * 100 / winter_day_tenths_of_an_hour)
july_beam_vs_january_per_hundred = int(100000 / january_beam_vs_july_per_mille)
print("nearest the sun                 : " + str(nearest_distance_hundred_thousand_km) + " hundred thousand km, early january")
print("farthest from the sun           : " + str(farthest_distance_hundred_thousand_km) + " hundred thousand km, early july")
print("january beam vs july beam       : " + str(january_beam_vs_july_per_mille) + " per mille, " + str(january_beam_stronger_by_per_mille) + " per mille stronger")
print("")
print("at " + str(latitude_north_degrees) + " north, noon sun height    : " + str(winter_noon_sun_height_tenths) + " tenths of a degree in winter, " + str(summer_noon_sun_height_tenths) + " in summer")
print("noon light on the ground, winter : " + str(winter_noon_ground_light_per_mille_of_the_july_beam) + " per mille of the july beam")
print("noon light on the ground, summer : " + str(summer_noon_ground_light_per_mille_of_the_july_beam) + " per mille of the july beam")
print("summer noon vs winter noon      : " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred")
print("day length                      : " + str(winter_day_tenths_of_an_hour) + " tenths of an hour in winter, " + str(summer_day_tenths_of_an_hour) + " in summer, " + str(summer_day_vs_winter_day_per_hundred) + " per hundred")
print("")
print("the nearest-in-summer reasoning")
print("  orbit : an ellipse")
print("  distance : changes through the year, " + str(nearest_distance_hundred_thousand_km) + " to " + str(farthest_distance_hundred_thousand_km))
print("  sunlight : falls with the square of the distance")
print("  intent : why summer is warm")
print("  facts wrong : 0")
print("  verdict : SUMMER IS WHEN THE EARTH IS NEAREST THE SUN")
print("")
print("  squaring the distance ratio is the part done right here,")
print("  and it is why the beam really is " + str(january_beam_stronger_by_per_mille) + " per mille stronger at the")
print("  nearest point")
print("")
print("the height of the noon sun")
print("  when the earth is nearest : early january, the northern winter")
print("  what the distance changes : the beam, by " + str(january_beam_stronger_by_per_mille) + " per mille")
print("  what the tilt changes : the noon sun's height, from " + str(winter_noon_sun_height_tenths) + " to")
print("    " + str(summer_noon_sun_height_tenths) + " tenths of a degree, and a low sun spreads the same beam")
print("    over more ground")
print("  noon light on each square metre : " + str(winter_noon_ground_light_per_mille_of_the_july_beam) + " in winter against " + str(summer_noon_ground_light_per_mille_of_the_july_beam))
print("    in summer, " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred, even with winter's stronger beam")
print("  and the day itself : " + str(summer_day_vs_winter_day_per_hundred) + " per hundred as long in summer")
print("")
print("the explanation")
print("  believed : summer is the near part of the orbit")
print("  actual : the near part of the orbit is the northern winter")
print("  is the inverse square wrong : no; it moves the beam " + str(january_beam_stronger_by_per_mille) + " per mille")
print("  is distance what makes the seasons : no; the tilt moves the")
print("    noon light on the ground " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred the other way")
print("")
nc_summer_light_vs_winter_read_from_distance_per_hundred = 93
nc_summer_light_vs_winter_read_from_sun_height_per_hundred = 295
nc_per_hundred_the_height_reading_adds = 202
print("null control - read the seasons from the sun's height")
print("  summer vs winter light, read from distance : " + str(nc_summer_light_vs_winter_read_from_distance_per_hundred) + " per hundred")
print("  summer vs winter light, read from sun height : " + str(nc_summer_light_vs_winter_read_from_sun_height_per_hundred) + " per hundred")
print("  per hundred the height reading adds : " + str(nc_per_hundred_the_height_reading_adds))
print("  no orbit and no latitude changed; the quantity that decides")
print("  how much light each square metre gets was the one measured")
print("")
print("what an elliptical orbit and the inverse square guarantee")
print("  sunlight changes with the distance through the year : exactly")
print("  summer is when the earth is nearest : not addressed; the nearest")
print("    point falls in january, the distance moves the beam by " + str(january_beam_stronger_by_per_mille))
print("    per mille, and the tilt moves the noon light on the ground by")
print("    " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred the other way")
print("")
print("a true cause can be the wrong size; the distance really does change the")
print("sunlight, by a little, in the wrong month, while the tilt changes it by a")
print("lot, in the right one")
print("")
print("The orbit is an ellipse and the inverse square holds: the beam is " + str(january_beam_stronger_by_per_mille) + " per")
print("mille stronger at the nearest point. But the nearest point is in january, and")
print("at " + str(latitude_north_degrees) + " north the summer noon sun lays " + str(summer_noon_vs_winter_noon_per_hundred) + " per hundred of winter's light on each")
print("square metre, over a day " + str(summer_day_vs_winter_day_per_hundred) + " per hundred as long, until the seasons are read from the")
print("sun's height rather than its distance.")

stdout (executed)

text
nearest the sun                 : 1471 hundred thousand km, early january
farthest from the sun           : 1521 hundred thousand km, early july
january beam vs july beam       : 1069 per mille, 69 per mille stronger

at 50 north, noon sun height    : 165 tenths of a degree in winter, 635 in summer
noon light on the ground, winter : 303 per mille of the july beam
noon light on the ground, summer : 895 per mille of the july beam
summer noon vs winter noon      : 295 per hundred
day length                      : 81 tenths of an hour in winter, 164 in summer, 202 per hundred

the nearest-in-summer reasoning
  orbit : an ellipse
  distance : changes through the year, 1471 to 1521
  sunlight : falls with the square of the distance
  intent : why summer is warm
  facts wrong : 0
  verdict : SUMMER IS WHEN THE EARTH IS NEAREST THE SUN

  squaring the distance ratio is the part done right here,
  and it is why the beam really is 69 per mille stronger at the
  nearest point

the height of the noon sun
  when the earth is nearest : early january, the northern winter
  what the distance changes : the beam, by 69 per mille
  what the tilt changes : the noon sun's height, from 165 to
    635 tenths of a degree, and a low sun spreads the same beam
    over more ground
  noon light on each square metre : 303 in winter against 895
    in summer, 295 per hundred, even with winter's stronger beam
  and the day itself : 202 per hundred as long in summer

the explanation
  believed : summer is the near part of the orbit
  actual : the near part of the orbit is the northern winter
  is the inverse square wrong : no; it moves the beam 69 per mille
  is distance what makes the seasons : no; the tilt moves the
    noon light on the ground 295 per hundred the other way

null control - read the seasons from the sun's height
  summer vs winter light, read from distance : 93 per hundred
  summer vs winter light, read from sun height : 295 per hundred
  per hundred the height reading adds : 202
  no orbit and no latitude changed; the quantity that decides
  how much light each square metre gets was the one measured

what an elliptical orbit and the inverse square guarantee
  sunlight changes with the distance through the year : exactly
  summer is when the earth is nearest : not addressed; the nearest
    point falls in january, the distance moves the beam by 69
    per mille, and the tilt moves the noon light on the ground by
    295 per hundred the other way

a true cause can be the wrong size; the distance really does change the
sunlight, by a little, in the wrong month, while the tilt changes it by a
lot, in the right one

The orbit is an ellipse and the inverse square holds: the beam is 69 per
mille stronger at the nearest point. But the nearest point is in january, and
at 50 north the summer noon sun lays 295 per hundred of winter's light on each
square metre, over a day 202 per hundred as long, until the seasons are read from the
sun's height rather than its distance.

Trace event types

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