Case 976
The chaser slowed down to catch up
the_chaser_slowed_down_to_catch_up.eml - A pilot flying a spacecraft in a circular orbit is 94 km behind a station in the same orbit and fires the engine forward to catch up, the way any driver closes on the car ahead. What adding speed does to an orbit, and what closes the gap, 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 pilot flying a
# spacecraft in a circular orbit is 94 km behind a station in the same orbit
# and fires the engine forward to catch up, the way any driver closes on the
# car ahead. What adding speed does to an orbit, and what closes the gap, is
# computed below.
#
# The reasoning is careful. The station really is 94 km ahead, measured by
# radar; a forward burn really does add speed; the burn is small and exact,
# five and a half metres per second; and the intent is exactly 'close the gap
# to the station'.
#
# In orbit, speed buys height: the forward burn lifts the far side of the orbit
# 20 km, a bigger orbit takes longer to go round - by three halves of the change
# in its size - and after one lap the pilot is 188 km behind. The same burn fired
# backward drops the far side, shortens the lap by the same 12 seconds, and
# brings the craft back round 230 m ahead of the station.
6771 => orbit_radius_km
7673 => orbit_speed_m_per_s
5545 => orbit_period_s
94 => station_ahead_km
10 => orbit_size_change_km
int(station_ahead_km * 1000 * 100 / orbit_speed_m_per_s) => station_ahead_hundredths_s
int(orbit_speed_m_per_s * orbit_size_change_km * 10 / (2 * orbit_radius_km)) => burn_tenths_m_per_s
2 * orbit_size_change_km => far_side_moves_km
int(3 * orbit_size_change_km * orbit_period_s * 100 / (2 * orbit_radius_km)) => lap_time_change_hundredths_s
station_ahead_hundredths_s + lap_time_change_hundredths_s => behind_after_a_forward_lap_hundredths_s
int(behind_after_a_forward_lap_hundredths_s * orbit_speed_m_per_s / 100000) => behind_after_a_forward_lap_km
lap_time_change_hundredths_s - station_ahead_hundredths_s => early_after_a_backward_lap_hundredths_s
int(early_after_a_backward_lap_hundredths_s * orbit_speed_m_per_s / 100) => ahead_of_the_station_after_a_backward_lap_m
orbit_period_s + int(lap_time_change_hundredths_s / 100) => higher_orbit_lap_s
orbit_period_s - int(lap_time_change_hundredths_s / 100) => lower_orbit_lap_s
"orbit : " + str(orbit_radius_km) + " km from the centre, " + str(orbit_speed_m_per_s) + " m/s, a lap in " + str(orbit_period_s) + " s" ^0
"station ahead : " + str(station_ahead_km) + " km, " + str(station_ahead_hundredths_s) + " hundredths of a second of travel" ^0
"engine burn : " + str(burn_tenths_m_per_s) + " tenths of a m/s" ^0
"lap time change, either way : " + str(lap_time_change_hundredths_s) + " hundredths of a second" ^0
"" ^0
"burn forward : far side " + str(far_side_moves_km) + " km higher, a lap of " + str(higher_orbit_lap_s) + " s" ^0
" after one lap : " + str(behind_after_a_forward_lap_km) + " km behind the station" ^0
"burn backward : far side " + str(far_side_moves_km) + " km lower, a lap of " + str(lower_orbit_lap_s) + " s" ^0
" after one lap : back at the burn point " + str(early_after_a_backward_lap_hundredths_s) + " hundredths of a second" ^0
" before the station, " + str(ahead_of_the_station_after_a_backward_lap_m) + " m ahead of it" ^0
"" ^0
# ---- what the pilot verified ----
"the close-the-gap reasoning" ^0
" gap : " + str(station_ahead_km) + " km, measured by radar" ^0
" burn : forward, " + str(burn_tenths_m_per_s) + " tenths of a m/s, exact" ^0
" rule : going faster closes on what is ahead" ^0
" intent : close the gap to the station" ^0
" facts wrong : 0" ^0
" verdict : BURN FORWARD TO CATCH UP" ^0
"" ^0
" firing a small, exact forward burn is the part done right" ^0
" here, and it is why the craft really is faster in the moment" ^0
" after the engine stops" ^0
"" ^0
# ---- what adding speed does to an orbit ----
"speed buys height" ^0
" what the burn changes : not the speed along the old path but" ^0
" the path itself; the extra speed carries the far side " + str(far_side_moves_km) + " km up" ^0
" what a bigger orbit costs : a longer lap, by three halves of" ^0
" the change in size, " + str(lap_time_change_hundredths_s) + " hundredths of a second" ^0
" where the speed goes : into climbing, and a craft climbing is" ^0
" slowing, so it crosses the far side slower than the station" ^0
" after a lap forward : " + str(behind_after_a_forward_lap_km) + " km behind, twice the gap" ^0
" after a lap backward : the lower, shorter orbit gains the" ^0
" " + str(lap_time_change_hundredths_s) + " hundredths the gap was worth, and one more forward burn" ^0
" puts the craft back in the station's orbit alongside it" ^0
"" ^0
# ---- what the pilot got ----
"the chase" ^0
" believed : closing on the station" ^0
" actual : " + str(behind_after_a_forward_lap_km) + " km behind it after one lap" ^0
" is the engine wrong : no; the burn was exact" ^0
" does speed close a gap in orbit : not directly; it changes the" ^0
" orbit, and the bigger orbit is the slower one around" ^0
"" ^0
# ---- null control ----
# The same gap chased by burning backward instead of forward.
188 => nc_behind_after_a_lap_burning_forward_km
0 => nc_behind_after_a_lap_burning_backward_km
188 => nc_km_the_backward_burn_saves
"null control - burn backward to catch up" ^0
" behind after a lap, burning forward : " + str(nc_behind_after_a_lap_burning_forward_km) + " km" ^0
" behind after a lap, burning backward : " + str(nc_behind_after_a_lap_burning_backward_km) + " km" ^0
" km the backward burn saves : " + str(nc_km_the_backward_burn_saves) ^0
" no engine and no station changed; the burn was pointed to" ^0
" shorten the lap instead of to add speed" ^0
"" ^0
# ---- the rule ----
"what a forward burn guarantees" ^0
" the craft is faster the moment the engine stops : exactly" ^0
" the craft gains on the station ahead : not addressed; the extra" ^0
" " + str(burn_tenths_m_per_s) + " tenths of a m/s lift the far side " + str(far_side_moves_km) + " km, the lap grows by" ^0
" " + str(lap_time_change_hundredths_s) + " hundredths of a second, and the " + str(station_ahead_km) + " km gap becomes " + str(behind_after_a_forward_lap_km) ^0
"" ^0
"on a road, speed is how you catch up; in orbit, speed is how high you go," ^0
"and higher is slower around, so the way to reach what is ahead of you is" ^0
"to drop beneath it" ^0
"" ^0
"The forward burn really adds speed - " + str(burn_tenths_m_per_s) + " tenths of a m/s, exactly. But in" ^0
"orbit speed becomes height: the far side climbs " + str(far_side_moves_km) + " km, each lap takes " + str(lap_time_change_hundredths_s) ^0
"hundredths of a second longer, and the " + str(station_ahead_km) + " km gap grows to " + str(behind_after_a_forward_lap_km) + ", while the" ^0
"same burn backward brings the craft round " + str(ahead_of_the_station_after_a_backward_lap_m) + " m ahead of the station, until the" ^0
"gap is closed from below." ^0Python (deterministic transpilation)
pythonorbit_radius_km = 6771
orbit_speed_m_per_s = 7673
orbit_period_s = 5545
station_ahead_km = 94
orbit_size_change_km = 10
station_ahead_hundredths_s = int(station_ahead_km * 1000 * 100 / orbit_speed_m_per_s)
burn_tenths_m_per_s = int(orbit_speed_m_per_s * orbit_size_change_km * 10 / (2 * orbit_radius_km))
far_side_moves_km = 2 * orbit_size_change_km
lap_time_change_hundredths_s = int(3 * orbit_size_change_km * orbit_period_s * 100 / (2 * orbit_radius_km))
behind_after_a_forward_lap_hundredths_s = station_ahead_hundredths_s + lap_time_change_hundredths_s
behind_after_a_forward_lap_km = int(behind_after_a_forward_lap_hundredths_s * orbit_speed_m_per_s / 100000)
early_after_a_backward_lap_hundredths_s = lap_time_change_hundredths_s - station_ahead_hundredths_s
ahead_of_the_station_after_a_backward_lap_m = int(early_after_a_backward_lap_hundredths_s * orbit_speed_m_per_s / 100)
higher_orbit_lap_s = orbit_period_s + int(lap_time_change_hundredths_s / 100)
lower_orbit_lap_s = orbit_period_s - int(lap_time_change_hundredths_s / 100)
print("orbit : " + str(orbit_radius_km) + " km from the centre, " + str(orbit_speed_m_per_s) + " m/s, a lap in " + str(orbit_period_s) + " s")
print("station ahead : " + str(station_ahead_km) + " km, " + str(station_ahead_hundredths_s) + " hundredths of a second of travel")
print("engine burn : " + str(burn_tenths_m_per_s) + " tenths of a m/s")
print("lap time change, either way : " + str(lap_time_change_hundredths_s) + " hundredths of a second")
print("")
print("burn forward : far side " + str(far_side_moves_km) + " km higher, a lap of " + str(higher_orbit_lap_s) + " s")
print(" after one lap : " + str(behind_after_a_forward_lap_km) + " km behind the station")
print("burn backward : far side " + str(far_side_moves_km) + " km lower, a lap of " + str(lower_orbit_lap_s) + " s")
print(" after one lap : back at the burn point " + str(early_after_a_backward_lap_hundredths_s) + " hundredths of a second")
print(" before the station, " + str(ahead_of_the_station_after_a_backward_lap_m) + " m ahead of it")
print("")
print("the close-the-gap reasoning")
print(" gap : " + str(station_ahead_km) + " km, measured by radar")
print(" burn : forward, " + str(burn_tenths_m_per_s) + " tenths of a m/s, exact")
print(" rule : going faster closes on what is ahead")
print(" intent : close the gap to the station")
print(" facts wrong : 0")
print(" verdict : BURN FORWARD TO CATCH UP")
print("")
print(" firing a small, exact forward burn is the part done right")
print(" here, and it is why the craft really is faster in the moment")
print(" after the engine stops")
print("")
print("speed buys height")
print(" what the burn changes : not the speed along the old path but")
print(" the path itself; the extra speed carries the far side " + str(far_side_moves_km) + " km up")
print(" what a bigger orbit costs : a longer lap, by three halves of")
print(" the change in size, " + str(lap_time_change_hundredths_s) + " hundredths of a second")
print(" where the speed goes : into climbing, and a craft climbing is")
print(" slowing, so it crosses the far side slower than the station")
print(" after a lap forward : " + str(behind_after_a_forward_lap_km) + " km behind, twice the gap")
print(" after a lap backward : the lower, shorter orbit gains the")
print(" " + str(lap_time_change_hundredths_s) + " hundredths the gap was worth, and one more forward burn")
print(" puts the craft back in the station's orbit alongside it")
print("")
print("the chase")
print(" believed : closing on the station")
print(" actual : " + str(behind_after_a_forward_lap_km) + " km behind it after one lap")
print(" is the engine wrong : no; the burn was exact")
print(" does speed close a gap in orbit : not directly; it changes the")
print(" orbit, and the bigger orbit is the slower one around")
print("")
nc_behind_after_a_lap_burning_forward_km = 188
nc_behind_after_a_lap_burning_backward_km = 0
nc_km_the_backward_burn_saves = 188
print("null control - burn backward to catch up")
print(" behind after a lap, burning forward : " + str(nc_behind_after_a_lap_burning_forward_km) + " km")
print(" behind after a lap, burning backward : " + str(nc_behind_after_a_lap_burning_backward_km) + " km")
print(" km the backward burn saves : " + str(nc_km_the_backward_burn_saves))
print(" no engine and no station changed; the burn was pointed to")
print(" shorten the lap instead of to add speed")
print("")
print("what a forward burn guarantees")
print(" the craft is faster the moment the engine stops : exactly")
print(" the craft gains on the station ahead : not addressed; the extra")
print(" " + str(burn_tenths_m_per_s) + " tenths of a m/s lift the far side " + str(far_side_moves_km) + " km, the lap grows by")
print(" " + str(lap_time_change_hundredths_s) + " hundredths of a second, and the " + str(station_ahead_km) + " km gap becomes " + str(behind_after_a_forward_lap_km))
print("")
print("on a road, speed is how you catch up; in orbit, speed is how high you go,")
print("and higher is slower around, so the way to reach what is ahead of you is")
print("to drop beneath it")
print("")
print("The forward burn really adds speed - " + str(burn_tenths_m_per_s) + " tenths of a m/s, exactly. But in")
print("orbit speed becomes height: the far side climbs " + str(far_side_moves_km) + " km, each lap takes " + str(lap_time_change_hundredths_s))
print("hundredths of a second longer, and the " + str(station_ahead_km) + " km gap grows to " + str(behind_after_a_forward_lap_km) + ", while the")
print("same burn backward brings the craft round " + str(ahead_of_the_station_after_a_backward_lap_m) + " m ahead of the station, until the")
print("gap is closed from below.")stdout (executed)
textorbit : 6771 km from the centre, 7673 m/s, a lap in 5545 s
station ahead : 94 km, 1225 hundredths of a second of travel
engine burn : 56 tenths of a m/s
lap time change, either way : 1228 hundredths of a second
burn forward : far side 20 km higher, a lap of 5557 s
after one lap : 188 km behind the station
burn backward : far side 20 km lower, a lap of 5533 s
after one lap : back at the burn point 3 hundredths of a second
before the station, 230 m ahead of it
the close-the-gap reasoning
gap : 94 km, measured by radar
burn : forward, 56 tenths of a m/s, exact
rule : going faster closes on what is ahead
intent : close the gap to the station
facts wrong : 0
verdict : BURN FORWARD TO CATCH UP
firing a small, exact forward burn is the part done right
here, and it is why the craft really is faster in the moment
after the engine stops
speed buys height
what the burn changes : not the speed along the old path but
the path itself; the extra speed carries the far side 20 km up
what a bigger orbit costs : a longer lap, by three halves of
the change in size, 1228 hundredths of a second
where the speed goes : into climbing, and a craft climbing is
slowing, so it crosses the far side slower than the station
after a lap forward : 188 km behind, twice the gap
after a lap backward : the lower, shorter orbit gains the
1228 hundredths the gap was worth, and one more forward burn
puts the craft back in the station's orbit alongside it
the chase
believed : closing on the station
actual : 188 km behind it after one lap
is the engine wrong : no; the burn was exact
does speed close a gap in orbit : not directly; it changes the
orbit, and the bigger orbit is the slower one around
null control - burn backward to catch up
behind after a lap, burning forward : 188 km
behind after a lap, burning backward : 0 km
km the backward burn saves : 188
no engine and no station changed; the burn was pointed to
shorten the lap instead of to add speed
what a forward burn guarantees
the craft is faster the moment the engine stops : exactly
the craft gains on the station ahead : not addressed; the extra
56 tenths of a m/s lift the far side 20 km, the lap grows by
1228 hundredths of a second, and the 94 km gap becomes 188
on a road, speed is how you catch up; in orbit, speed is how high you go,
and higher is slower around, so the way to reach what is ahead of you is
to drop beneath it
The forward burn really adds speed - 56 tenths of a m/s, exactly. But in
orbit speed becomes height: the far side climbs 20 km, each lap takes 1228
hundredths of a second longer, and the 94 km gap grows to 188, while the
same burn backward brings the craft round 230 m ahead of the station, until the
gap is closed from below.Trace event types
eml:run:starteml:assigneml:outputeml:run:done