Case 950
The lens did not change the perspective and the feet did
the_lens_did_not_change_the_perspective_and_the_feet_did.eml - A photographer swaps a 50 mm lens for a 100 mm to get the flattering, compressed look of a portrait lens, steps back to keep the subject the same size in the frame, and credits the lens with the change in the background. What the lens changed and what the step back changed is computed below.
ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-21
EML
eml# Self-authored for the EML case corpus (no external origin). A photographer
# swaps a 50 mm lens for a 100 mm to get the flattering, compressed look of a
# portrait lens, steps back to keep the subject the same size in the frame, and
# credits the lens with the change in the background. What the lens changed and
# what the step back changed is computed below.
#
# The reasoning is careful. The lens was doubled; the subject came out the same
# size; the background did come out larger and closer-looking; and the intent
# was exactly 'the portrait-lens look'.
#
# Perspective is the ratio of the distances to the things in the frame and a
# lens cannot touch it - a 100 mm at 2 metres frames the background exactly as
# the 50 mm did, only magnified - so the compression came from standing at 4
# metres, where the background at 10 is only two and a half times as far as
# the subject instead of four.
50 => short_lens_mm
100 => long_lens_mm
2 => subject_distance_close_m
4 => subject_distance_stepped_back_m
6 => background_behind_the_subject_m
subject_distance_close_m + background_behind_the_subject_m => background_distance_close_m
subject_distance_stepped_back_m + background_behind_the_subject_m => background_distance_stepped_back_m
int(background_distance_close_m * 10000 / subject_distance_close_m) => background_to_subject_distance_ratio_close_per_myriad
int(background_distance_stepped_back_m * 10000 / subject_distance_stepped_back_m) => background_to_subject_distance_ratio_stepped_back_per_myriad
background_to_subject_distance_ratio_close_per_myriad - background_to_subject_distance_ratio_stepped_back_per_myriad => compression_the_step_back_bought_per_myriad
int(short_lens_mm * 100 / subject_distance_close_m) => subject_size_short_lens_close
int(long_lens_mm * 100 / subject_distance_stepped_back_m) => subject_size_long_lens_stepped_back
int(long_lens_mm * 100 / subject_distance_close_m) => subject_size_long_lens_close
int(subject_size_long_lens_close / subject_size_short_lens_close) => magnification_the_long_lens_adds_at_the_same_spot
int(background_distance_close_m * 10000 / subject_distance_close_m) => background_to_subject_ratio_long_lens_close_per_myriad
background_to_subject_ratio_long_lens_close_per_myriad - background_to_subject_distance_ratio_close_per_myriad => perspective_change_from_the_lens_alone_per_myriad
"lenses : " + str(short_lens_mm) + " mm and " + str(long_lens_mm) + " mm" ^0
"subject : at " + str(subject_distance_close_m) + " m, then at " + str(subject_distance_stepped_back_m) + " m after the step back" ^0
"background : " + str(background_behind_the_subject_m) + " m behind the subject, so at " + str(background_distance_close_m) + " then " + str(background_distance_stepped_back_m) + " m" ^0
"" ^0
"background to subject, close : " + str(background_to_subject_distance_ratio_close_per_myriad) + " per ten thousand, four times as far" ^0
"background to subject, back : " + str(background_to_subject_distance_ratio_stepped_back_per_myriad) + " per ten thousand, two and a half times" ^0
"compression the step back bought : " + str(compression_the_step_back_bought_per_myriad) + " per ten thousand" ^0
"" ^0
"subject size, 50 mm at 2 m : " + str(subject_size_short_lens_close) ^0
"subject size, 100 mm at 4 m : " + str(subject_size_long_lens_stepped_back) + ", the same framing" ^0
"subject size, 100 mm at 2 m : " + str(subject_size_long_lens_close) + ", " + str(magnification_the_long_lens_adds_at_the_same_spot) + " times larger, nothing else different" ^0
"background to subject, 100 mm at 2 m : " + str(background_to_subject_ratio_long_lens_close_per_myriad) + " per ten thousand" ^0
"perspective change from the lens alone : " + str(perspective_change_from_the_lens_alone_per_myriad) + " per ten thousand" ^0
"" ^0
# ---- what the photographer verified ----
"the portrait-lens reasoning" ^0
" lens : doubled, " + str(short_lens_mm) + " to " + str(long_lens_mm) + " mm" ^0
" framing : subject the same size, by stepping back" ^0
" result : background larger, closer-looking, compressed" ^0
" intent : the portrait-lens look" ^0
" facts wrong : 0" ^0
" verdict : THE LONGER LENS COMPRESSED THE BACKGROUND" ^0
"" ^0
" doubling the lens and stepping back to hold the framing is" ^0
" the part done right here, and it is why the subject is the" ^0
" same size in both frames: " + str(subject_size_short_lens_close) + " and " + str(subject_size_long_lens_stepped_back) ^0
"" ^0
# ---- what the lens changed and what the feet changed ----
"two controls that were moved together" ^0
" what a lens does : magnifies the whole frame by its length," ^0
" every part by the same factor" ^0
" what perspective is : how much bigger the near thing is than" ^0
" the far thing, which is the ratio of their distances" ^0
" 100 mm at 2 m : the subject " + str(magnification_the_long_lens_adds_at_the_same_spot) + " times larger and the background " + str(magnification_the_long_lens_adds_at_the_same_spot) ^0
" times larger, ratio unchanged, " + str(perspective_change_from_the_lens_alone_per_myriad) + " per ten thousand of change" ^0
" 50 mm at 2 m, cropped to the middle : the 100 mm frame exactly" ^0
" stepping to 4 m : the background goes from " + str(background_to_subject_distance_ratio_close_per_myriad) + " to " + str(background_to_subject_distance_ratio_stepped_back_per_myriad) + " per ten" ^0
" thousand of the subject's distance, and that is the compression" ^0
"" ^0
# ---- what the photographer got ----
"the look" ^0
" believed : bought with the lens" ^0
" actual : bought with the " + str(subject_distance_stepped_back_m - subject_distance_close_m) + " m step back; the lens only restored the framing" ^0
" is the long lens useless : no; it let the step back happen" ^0
" without the subject shrinking" ^0
" can a lens change perspective : no; from one spot every lens" ^0
" sees the same picture at a different size" ^0
"" ^0
# ---- null control ----
# The same swap tested by changing the lens without moving, so only one control
# moves at a time.
0 => nc_perspective_change_lens_swapped_feet_still_per_myriad
15000 => nc_perspective_change_feet_moved_lens_still_per_myriad
15000 => nc_change_that_belongs_to_the_feet_per_myriad
"null control - move one control at a time" ^0
" perspective change, lens swapped, feet still : " + str(nc_perspective_change_lens_swapped_feet_still_per_myriad) + " per ten thousand" ^0
" perspective change, feet moved, lens still : " + str(nc_perspective_change_feet_moved_lens_still_per_myriad) + " per ten thousand" ^0
" change that belongs to the feet : " + str(nc_change_that_belongs_to_the_feet_per_myriad) + " per ten thousand" ^0
" no frame and no subject changed; the two moves were made" ^0
" separately so each effect had one cause" ^0
"" ^0
# ---- the rule ----
"what a doubled lens with the framing held guarantees" ^0
" the subject is the same size : exactly, " + str(subject_size_long_lens_stepped_back) + " both times" ^0
" the lens compressed the background : not addressed; a lens" ^0
" scales the whole frame and leaves the distance ratio at" ^0
" " + str(background_to_subject_ratio_long_lens_close_per_myriad) + " per ten thousand, and it was the step to " + str(subject_distance_stepped_back_m) + " m that" ^0
" brought it to " + str(background_to_subject_distance_ratio_stepped_back_per_myriad) ^0
"" ^0
"a lens is a magnifying glass over a picture the camera's position has already" ^0
"drawn; you can make the picture bigger with glass, but you can only change it" ^0
"by moving your feet" ^0
"" ^0
"The subject is the same size in both frames - the lens and the step back saw" ^0
"to that. But perspective is the ratio of distances: at " + str(subject_distance_close_m) + " m the background" ^0
"is " + str(background_to_subject_distance_ratio_close_per_myriad) + " per ten thousand of the way to the subject, at " + str(subject_distance_stepped_back_m) + " m it is " + str(background_to_subject_distance_ratio_stepped_back_per_myriad) + ", and the" ^0
"lens alone changes that by " + str(perspective_change_from_the_lens_alone_per_myriad) + ", until the look is credited to the feet that moved." ^0Python (deterministic transpilation)
pythonshort_lens_mm = 50
long_lens_mm = 100
subject_distance_close_m = 2
subject_distance_stepped_back_m = 4
background_behind_the_subject_m = 6
background_distance_close_m = subject_distance_close_m + background_behind_the_subject_m
background_distance_stepped_back_m = subject_distance_stepped_back_m + background_behind_the_subject_m
background_to_subject_distance_ratio_close_per_myriad = int(background_distance_close_m * 10000 / subject_distance_close_m)
background_to_subject_distance_ratio_stepped_back_per_myriad = int(background_distance_stepped_back_m * 10000 / subject_distance_stepped_back_m)
compression_the_step_back_bought_per_myriad = background_to_subject_distance_ratio_close_per_myriad - background_to_subject_distance_ratio_stepped_back_per_myriad
subject_size_short_lens_close = int(short_lens_mm * 100 / subject_distance_close_m)
subject_size_long_lens_stepped_back = int(long_lens_mm * 100 / subject_distance_stepped_back_m)
subject_size_long_lens_close = int(long_lens_mm * 100 / subject_distance_close_m)
magnification_the_long_lens_adds_at_the_same_spot = int(subject_size_long_lens_close / subject_size_short_lens_close)
background_to_subject_ratio_long_lens_close_per_myriad = int(background_distance_close_m * 10000 / subject_distance_close_m)
perspective_change_from_the_lens_alone_per_myriad = background_to_subject_ratio_long_lens_close_per_myriad - background_to_subject_distance_ratio_close_per_myriad
print("lenses : " + str(short_lens_mm) + " mm and " + str(long_lens_mm) + " mm")
print("subject : at " + str(subject_distance_close_m) + " m, then at " + str(subject_distance_stepped_back_m) + " m after the step back")
print("background : " + str(background_behind_the_subject_m) + " m behind the subject, so at " + str(background_distance_close_m) + " then " + str(background_distance_stepped_back_m) + " m")
print("")
print("background to subject, close : " + str(background_to_subject_distance_ratio_close_per_myriad) + " per ten thousand, four times as far")
print("background to subject, back : " + str(background_to_subject_distance_ratio_stepped_back_per_myriad) + " per ten thousand, two and a half times")
print("compression the step back bought : " + str(compression_the_step_back_bought_per_myriad) + " per ten thousand")
print("")
print("subject size, 50 mm at 2 m : " + str(subject_size_short_lens_close))
print("subject size, 100 mm at 4 m : " + str(subject_size_long_lens_stepped_back) + ", the same framing")
print("subject size, 100 mm at 2 m : " + str(subject_size_long_lens_close) + ", " + str(magnification_the_long_lens_adds_at_the_same_spot) + " times larger, nothing else different")
print("background to subject, 100 mm at 2 m : " + str(background_to_subject_ratio_long_lens_close_per_myriad) + " per ten thousand")
print("perspective change from the lens alone : " + str(perspective_change_from_the_lens_alone_per_myriad) + " per ten thousand")
print("")
print("the portrait-lens reasoning")
print(" lens : doubled, " + str(short_lens_mm) + " to " + str(long_lens_mm) + " mm")
print(" framing : subject the same size, by stepping back")
print(" result : background larger, closer-looking, compressed")
print(" intent : the portrait-lens look")
print(" facts wrong : 0")
print(" verdict : THE LONGER LENS COMPRESSED THE BACKGROUND")
print("")
print(" doubling the lens and stepping back to hold the framing is")
print(" the part done right here, and it is why the subject is the")
print(" same size in both frames: " + str(subject_size_short_lens_close) + " and " + str(subject_size_long_lens_stepped_back))
print("")
print("two controls that were moved together")
print(" what a lens does : magnifies the whole frame by its length,")
print(" every part by the same factor")
print(" what perspective is : how much bigger the near thing is than")
print(" the far thing, which is the ratio of their distances")
print(" 100 mm at 2 m : the subject " + str(magnification_the_long_lens_adds_at_the_same_spot) + " times larger and the background " + str(magnification_the_long_lens_adds_at_the_same_spot))
print(" times larger, ratio unchanged, " + str(perspective_change_from_the_lens_alone_per_myriad) + " per ten thousand of change")
print(" 50 mm at 2 m, cropped to the middle : the 100 mm frame exactly")
print(" stepping to 4 m : the background goes from " + str(background_to_subject_distance_ratio_close_per_myriad) + " to " + str(background_to_subject_distance_ratio_stepped_back_per_myriad) + " per ten")
print(" thousand of the subject's distance, and that is the compression")
print("")
print("the look")
print(" believed : bought with the lens")
print(" actual : bought with the " + str(subject_distance_stepped_back_m - subject_distance_close_m) + " m step back; the lens only restored the framing")
print(" is the long lens useless : no; it let the step back happen")
print(" without the subject shrinking")
print(" can a lens change perspective : no; from one spot every lens")
print(" sees the same picture at a different size")
print("")
nc_perspective_change_lens_swapped_feet_still_per_myriad = 0
nc_perspective_change_feet_moved_lens_still_per_myriad = 15000
nc_change_that_belongs_to_the_feet_per_myriad = 15000
print("null control - move one control at a time")
print(" perspective change, lens swapped, feet still : " + str(nc_perspective_change_lens_swapped_feet_still_per_myriad) + " per ten thousand")
print(" perspective change, feet moved, lens still : " + str(nc_perspective_change_feet_moved_lens_still_per_myriad) + " per ten thousand")
print(" change that belongs to the feet : " + str(nc_change_that_belongs_to_the_feet_per_myriad) + " per ten thousand")
print(" no frame and no subject changed; the two moves were made")
print(" separately so each effect had one cause")
print("")
print("what a doubled lens with the framing held guarantees")
print(" the subject is the same size : exactly, " + str(subject_size_long_lens_stepped_back) + " both times")
print(" the lens compressed the background : not addressed; a lens")
print(" scales the whole frame and leaves the distance ratio at")
print(" " + str(background_to_subject_ratio_long_lens_close_per_myriad) + " per ten thousand, and it was the step to " + str(subject_distance_stepped_back_m) + " m that")
print(" brought it to " + str(background_to_subject_distance_ratio_stepped_back_per_myriad))
print("")
print("a lens is a magnifying glass over a picture the camera's position has already")
print("drawn; you can make the picture bigger with glass, but you can only change it")
print("by moving your feet")
print("")
print("The subject is the same size in both frames - the lens and the step back saw")
print("to that. But perspective is the ratio of distances: at " + str(subject_distance_close_m) + " m the background")
print("is " + str(background_to_subject_distance_ratio_close_per_myriad) + " per ten thousand of the way to the subject, at " + str(subject_distance_stepped_back_m) + " m it is " + str(background_to_subject_distance_ratio_stepped_back_per_myriad) + ", and the")
print("lens alone changes that by " + str(perspective_change_from_the_lens_alone_per_myriad) + ", until the look is credited to the feet that moved.")stdout (executed)
textlenses : 50 mm and 100 mm
subject : at 2 m, then at 4 m after the step back
background : 6 m behind the subject, so at 8 then 10 m
background to subject, close : 40000 per ten thousand, four times as far
background to subject, back : 25000 per ten thousand, two and a half times
compression the step back bought : 15000 per ten thousand
subject size, 50 mm at 2 m : 2500
subject size, 100 mm at 4 m : 2500, the same framing
subject size, 100 mm at 2 m : 5000, 2 times larger, nothing else different
background to subject, 100 mm at 2 m : 40000 per ten thousand
perspective change from the lens alone : 0 per ten thousand
the portrait-lens reasoning
lens : doubled, 50 to 100 mm
framing : subject the same size, by stepping back
result : background larger, closer-looking, compressed
intent : the portrait-lens look
facts wrong : 0
verdict : THE LONGER LENS COMPRESSED THE BACKGROUND
doubling the lens and stepping back to hold the framing is
the part done right here, and it is why the subject is the
same size in both frames: 2500 and 2500
two controls that were moved together
what a lens does : magnifies the whole frame by its length,
every part by the same factor
what perspective is : how much bigger the near thing is than
the far thing, which is the ratio of their distances
100 mm at 2 m : the subject 2 times larger and the background 2
times larger, ratio unchanged, 0 per ten thousand of change
50 mm at 2 m, cropped to the middle : the 100 mm frame exactly
stepping to 4 m : the background goes from 40000 to 25000 per ten
thousand of the subject's distance, and that is the compression
the look
believed : bought with the lens
actual : bought with the 2 m step back; the lens only restored the framing
is the long lens useless : no; it let the step back happen
without the subject shrinking
can a lens change perspective : no; from one spot every lens
sees the same picture at a different size
null control - move one control at a time
perspective change, lens swapped, feet still : 0 per ten thousand
perspective change, feet moved, lens still : 15000 per ten thousand
change that belongs to the feet : 15000 per ten thousand
no frame and no subject changed; the two moves were made
separately so each effect had one cause
what a doubled lens with the framing held guarantees
the subject is the same size : exactly, 2500 both times
the lens compressed the background : not addressed; a lens
scales the whole frame and leaves the distance ratio at
40000 per ten thousand, and it was the step to 4 m that
brought it to 25000
a lens is a magnifying glass over a picture the camera's position has already
drawn; you can make the picture bigger with glass, but you can only change it
by moving your feet
The subject is the same size in both frames - the lens and the step back saw
to that. But perspective is the ratio of distances: at 2 m the background
is 40000 per ten thousand of the way to the subject, at 4 m it is 25000, and the
lens alone changes that by 0, until the look is credited to the feet that moved.Trace event types
eml:run:starteml:assigneml:outputeml:run:done