Case 882
Both cut the price and both lost
both_cut_the_price_and_both_lost.eml - Two firms each choose whether to hold or cut their price, each chooses the option that is better for it whatever the other does, and each computes its payoffs correctly. Where two correct best responses land is computed below.
ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-17
EML
eml# Self-authored for the EML case corpus (no external origin). Two firms each
# choose whether to hold or cut their price, each chooses the option that is
# better for it whatever the other does, and each computes its payoffs
# correctly. Where two correct best responses land is computed below.
#
# Each firm's reasoning is careful. Its payoff table is accurate; it checks its
# best move against both of the other's moves; it picks the move that wins in
# both columns; and the intent is exactly 'maximise our profit'.
#
# Cutting is better for each firm whatever the other does, so both cut - and
# both end up at 40 when both holding would have given each 100.
100 => hold_hold_each
150 => cut_when_other_holds
20 => hold_when_other_cuts
40 => cut_cut_each
cut_when_other_holds - hold_hold_each => gain_from_cutting_if_other_holds
cut_cut_each - hold_when_other_cuts => gain_from_cutting_if_other_cuts
hold_hold_each - cut_cut_each => loss_per_firm_at_the_equilibrium
int(loss_per_firm_at_the_equilibrium * 10000 / hold_hold_each) => cooperative_profit_lost_per_myriad
"both hold : " + str(hold_hold_each) + " each" ^0
"I cut, other holds : " + str(cut_when_other_holds) + " for me, " + str(hold_when_other_cuts) + " for the other" ^0
"both cut : " + str(cut_cut_each) + " each" ^0
"" ^0
"gain from cutting if other holds : " + str(gain_from_cutting_if_other_holds) ^0
"gain from cutting if other cuts : " + str(gain_from_cutting_if_other_cuts) ^0
"so each firm cuts : cutting wins in both columns" ^0
"outcome : both cut, " + str(cut_cut_each) + " each" ^0
"loss per firm vs both holding : " + str(loss_per_firm_at_the_equilibrium) ^0
"cooperative profit lost : " + str(cooperative_profit_lost_per_myriad) + " per ten thousand" ^0
"" ^0
# ---- what each firm verified ----
"each firm's decision" ^0
" payoff table : accurate" ^0
" checks : the best move against both of the other's moves" ^0
" picks : the move that wins in both columns" ^0
" intent : maximise our profit" ^0
" columns unexamined : 0" ^0
" verdict : CUT IS BETTER WHATEVER THE OTHER DOES" ^0
"" ^0
" checking the best response in both columns is the part" ^0
" done right here, and it is why neither firm could have" ^0
" done better by changing its own move alone" ^0
"" ^0
# ---- where two best responses land ----
"the pair of choices" ^0
" each firm's dominant move : cut" ^0
" what both cutting yields : " + str(cut_cut_each) + " each" ^0
" what both holding would yield : " + str(hold_hold_each) + " each" ^0
" can either firm improve alone from both-cut : no; holding" ^0
" alone drops it to " + str(hold_when_other_cuts) ^0
" so the outcome is stable : and worse for both than the" ^0
" outcome neither can reach alone" ^0
"" ^0
# ---- what the firms got ----
"the price war" ^0
" each firm earned : " + str(cut_cut_each) ^0
" each firm could have earned : " + str(hold_hold_each) ^0
" is either payoff table wrong : no" ^0
" is either choice a mistake, given the other : no; it is" ^0
" the best response" ^0
" is the joint outcome the best available : no; it is the" ^0
" stable one" ^0
"" ^0
# ---- null control ----
# The same firms in a repeated game with a credible response - a cut is answered
# by a cut next round - so holding becomes each firm's best long-run move.
40 => nc_each_firm_one_shot_best_response
100 => nc_each_firm_repeated_with_retaliation
60 => nc_profit_per_firm_the_commitment_recovers
"null control - repeat the game with a credible answer to a cut" ^0
" each firm, one-shot best response : " + str(nc_each_firm_one_shot_best_response) ^0
" each firm, repeated with retaliation : " + str(nc_each_firm_repeated_with_retaliation) ^0
" profit per firm the commitment recovers : " + str(nc_profit_per_firm_the_commitment_recovers) ^0
" no payoff changed; the move that wins in both columns" ^0
" stopped being the last word" ^0
"" ^0
# ---- the rule ----
"what a pair of dominant best responses guarantees" ^0
" neither firm can gain by changing its own move : exactly," ^0
" accurate tables, both columns checked" ^0
" the firms reach the best outcome available to them : not" ^0
" addressed; both cutting is stable at " + str(cut_cut_each) + " each while" ^0
" both holding gives " + str(hold_hold_each) + ", and no single firm can get" ^0
" from one to the other" ^0
"" ^0
"the best reply to every move is not the best outcome for the mover; a pair of" ^0
"correct individual choices can meet at a point both would leave if only they" ^0
"could leave together, and correctness at the seat is what keeps them there" ^0
"" ^0
"Each firm checks both columns and picks the move that wins in both - cut. Both" ^0
"cut and earn " + str(cut_cut_each) + " each where holding would earn " + str(hold_hold_each) + "; neither can improve" ^0
"alone, " + str(cooperative_profit_lost_per_myriad) + " per ten thousand of the cooperative profit lost, until a credible" ^0
"answer to a cut makes holding the best reply." ^0Python (deterministic transpilation)
pythonhold_hold_each = 100
cut_when_other_holds = 150
hold_when_other_cuts = 20
cut_cut_each = 40
gain_from_cutting_if_other_holds = cut_when_other_holds - hold_hold_each
gain_from_cutting_if_other_cuts = cut_cut_each - hold_when_other_cuts
loss_per_firm_at_the_equilibrium = hold_hold_each - cut_cut_each
cooperative_profit_lost_per_myriad = int(loss_per_firm_at_the_equilibrium * 10000 / hold_hold_each)
print("both hold : " + str(hold_hold_each) + " each")
print("I cut, other holds : " + str(cut_when_other_holds) + " for me, " + str(hold_when_other_cuts) + " for the other")
print("both cut : " + str(cut_cut_each) + " each")
print("")
print("gain from cutting if other holds : " + str(gain_from_cutting_if_other_holds))
print("gain from cutting if other cuts : " + str(gain_from_cutting_if_other_cuts))
print("so each firm cuts : cutting wins in both columns")
print("outcome : both cut, " + str(cut_cut_each) + " each")
print("loss per firm vs both holding : " + str(loss_per_firm_at_the_equilibrium))
print("cooperative profit lost : " + str(cooperative_profit_lost_per_myriad) + " per ten thousand")
print("")
print("each firm's decision")
print(" payoff table : accurate")
print(" checks : the best move against both of the other's moves")
print(" picks : the move that wins in both columns")
print(" intent : maximise our profit")
print(" columns unexamined : 0")
print(" verdict : CUT IS BETTER WHATEVER THE OTHER DOES")
print("")
print(" checking the best response in both columns is the part")
print(" done right here, and it is why neither firm could have")
print(" done better by changing its own move alone")
print("")
print("the pair of choices")
print(" each firm's dominant move : cut")
print(" what both cutting yields : " + str(cut_cut_each) + " each")
print(" what both holding would yield : " + str(hold_hold_each) + " each")
print(" can either firm improve alone from both-cut : no; holding")
print(" alone drops it to " + str(hold_when_other_cuts))
print(" so the outcome is stable : and worse for both than the")
print(" outcome neither can reach alone")
print("")
print("the price war")
print(" each firm earned : " + str(cut_cut_each))
print(" each firm could have earned : " + str(hold_hold_each))
print(" is either payoff table wrong : no")
print(" is either choice a mistake, given the other : no; it is")
print(" the best response")
print(" is the joint outcome the best available : no; it is the")
print(" stable one")
print("")
nc_each_firm_one_shot_best_response = 40
nc_each_firm_repeated_with_retaliation = 100
nc_profit_per_firm_the_commitment_recovers = 60
print("null control - repeat the game with a credible answer to a cut")
print(" each firm, one-shot best response : " + str(nc_each_firm_one_shot_best_response))
print(" each firm, repeated with retaliation : " + str(nc_each_firm_repeated_with_retaliation))
print(" profit per firm the commitment recovers : " + str(nc_profit_per_firm_the_commitment_recovers))
print(" no payoff changed; the move that wins in both columns")
print(" stopped being the last word")
print("")
print("what a pair of dominant best responses guarantees")
print(" neither firm can gain by changing its own move : exactly,")
print(" accurate tables, both columns checked")
print(" the firms reach the best outcome available to them : not")
print(" addressed; both cutting is stable at " + str(cut_cut_each) + " each while")
print(" both holding gives " + str(hold_hold_each) + ", and no single firm can get")
print(" from one to the other")
print("")
print("the best reply to every move is not the best outcome for the mover; a pair of")
print("correct individual choices can meet at a point both would leave if only they")
print("could leave together, and correctness at the seat is what keeps them there")
print("")
print("Each firm checks both columns and picks the move that wins in both - cut. Both")
print("cut and earn " + str(cut_cut_each) + " each where holding would earn " + str(hold_hold_each) + "; neither can improve")
print("alone, " + str(cooperative_profit_lost_per_myriad) + " per ten thousand of the cooperative profit lost, until a credible")
print("answer to a cut makes holding the best reply.")stdout (executed)
textboth hold : 100 each
I cut, other holds : 150 for me, 20 for the other
both cut : 40 each
gain from cutting if other holds : 50
gain from cutting if other cuts : 20
so each firm cuts : cutting wins in both columns
outcome : both cut, 40 each
loss per firm vs both holding : 60
cooperative profit lost : 6000 per ten thousand
each firm's decision
payoff table : accurate
checks : the best move against both of the other's moves
picks : the move that wins in both columns
intent : maximise our profit
columns unexamined : 0
verdict : CUT IS BETTER WHATEVER THE OTHER DOES
checking the best response in both columns is the part
done right here, and it is why neither firm could have
done better by changing its own move alone
the pair of choices
each firm's dominant move : cut
what both cutting yields : 40 each
what both holding would yield : 100 each
can either firm improve alone from both-cut : no; holding
alone drops it to 20
so the outcome is stable : and worse for both than the
outcome neither can reach alone
the price war
each firm earned : 40
each firm could have earned : 100
is either payoff table wrong : no
is either choice a mistake, given the other : no; it is
the best response
is the joint outcome the best available : no; it is the
stable one
null control - repeat the game with a credible answer to a cut
each firm, one-shot best response : 40
each firm, repeated with retaliation : 100
profit per firm the commitment recovers : 60
no payoff changed; the move that wins in both columns
stopped being the last word
what a pair of dominant best responses guarantees
neither firm can gain by changing its own move : exactly,
accurate tables, both columns checked
the firms reach the best outcome available to them : not
addressed; both cutting is stable at 40 each while
both holding gives 100, and no single firm can get
from one to the other
the best reply to every move is not the best outcome for the mover; a pair of
correct individual choices can meet at a point both would leave if only they
could leave together, and correctness at the seat is what keeps them there
Each firm checks both columns and picks the move that wins in both - cut. Both
cut and earn 40 each where holding would earn 100; neither can improve
alone, 6000 per ten thousand of the cooperative profit lost, until a credible
answer to a cut makes holding the best reply.Trace event types
eml:run:starteml:assigneml:outputeml:run:done