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." ^0

Python (deterministic transpilation)

python
short_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)

text
lenses                          : 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