Exercise 87.1.
After 0 :𝖼𝖺𝗅𝗅(𝗂𝗇𝖼), the active map records thread 0’s operation. Since the frozen counter has one thread and no internal visible operation, the only visible length-two prefix is 0:𝖼𝖺𝗅𝗅(𝗂𝗇𝖼);0:𝗋𝖾𝗍(𝗂𝗇𝖼,1). The proposed return-2 prefix passes CL-Seq-ret’s active-map premises but fails the counter state relation: from state 0, the increment response is 1, not 2. Thus the rejecting premise is 0𝖲𝗍𝖾𝗉𝑉𝖼𝗍𝗋(0:𝗋𝖾𝗍(𝗂𝗇𝖼,2))𝑠′.
Exercise 87.2.
For the left unit, expand 𝗌𝗎𝖻𝗌𝗍𝗂𝖽𝖬(𝖵𝗂𝗌(𝑚,𝑘)). The visible substitution clause and local bind equations give 𝖻𝗂𝗇𝖽(𝖵𝗂𝗌(𝑚,𝖱𝖾𝗍𝗎𝗋𝗇),𝜆𝑥.𝗌𝗎𝖻𝗌𝗍𝗂𝖽𝖬(𝑘(𝑥)))≈𝖯𝖵𝗂𝗌(𝑚,𝜆𝑥.𝗌𝗎𝖻𝗌𝗍𝗂𝖽𝖬(𝑘(𝑥))). Pointwise coinduction on 𝑘(𝑥) identifies this with 𝖵𝗂𝗌(𝑚,𝑘). For the right unit, 𝗌𝗎𝖻𝗌𝗍𝑀(𝖵𝗂𝗌(𝑚,𝖱𝖾𝗍𝗎𝗋𝗇)) expands to 𝖻𝗂𝗇𝖽(𝑀(𝑚),𝖱𝖾𝗍𝗎𝗋𝗇), and coinduction on 𝑀(𝑚) proves the right-unit law.
These module laws do not imply 𝑉 ▹𝗂𝖽𝖬 =𝑉. With two threads, 𝖪(𝑉) may expose overlay calls 0 :𝖼𝖺𝗅𝗅(𝑚0);1 :𝖼𝖺𝗅𝗅(𝑚1) before either underlay return is reflected to the overlay. Those open brackets are precisely the additional states used by linearizability; an atomic 𝑉 need not contain that overlay trace.
Exercise 87.3.
There are two total orders. If thread 0’s operation comes first, a deterministic atomic exchange must choose thread 0’s return before thread 1’s offer is present, so it cannot return 4. If thread 1 comes first, its operation must choose its return before thread 0’s offer is present, so it cannot return 2. Both orders contradict the four-event history. The paired set class containing both operations sees offers 2 and 4 together and returns (4,2), so the obstruction is atomic ordering rather than sequential consistency of either thread.
Exercise 87.4.
The exchanger class 𝐶 ={0 :𝖾𝗑𝖼𝗁(2)/4,1 :𝖾𝗑𝖼𝗁(4)/2} becomes two overlay calls, one underlay transition labelled by 𝐶, and two overlay returns. Each thread state holds one active operation, and the paired transition fixes both return values. Conversely, grouping the identity-module brackets around that one underlay transition recovers exactly 𝐶.
If 𝐶 also contains a second operation of thread 0, the forward construction would have to store two active operations at 𝑞(0). The thread state grammar in definition 87.3 stores at most one 𝖢𝗈𝗇𝗍 or 𝖴𝖢𝖺𝗅𝗅 package. Hence the at-most-one-operation premise of theorem 87.9 is necessary for this construction.
Exercise 87.5.
Project a tensor trace twice. Retain left-tagged events in one projection and right-tagged events in the other. Each projection deletes only events carrying the other register tag. It therefore preserves retained call/return order and the completion decision for pending calls. The shared active map supplies the missing cross-tag fact: one thread cannot have simultaneous left and right operations.
Linearize the two projections in 𝖪(𝑉1) and 𝖪(𝑉2). Shuffle those traces subject to the original cross-tag order of every thread. The component orders and the cross-tag per-thread orders are compatible because each linearization preserves the corresponding projected thread order. Left events change only the first state, and right events only the second, so the shuffle lies in 𝖪(𝑉1 ⊗𝑉2).
Conversely, tensor an arbitrary left trace with the empty right trace over the same thread set and project its assumed tensor linearization. Exchanging the tagged projections gives the right result.
Exercise 87.6.
Let thread 0 invoke 𝗐𝗌(3), then let threads 1 and 2 invoke 𝗐𝗌(5) and 𝗐𝗌(2) while thread 0 remains active. Let thread 0 return {3,5} before thread 2 returns {3,5,2}. No single atomic point for thread 0 sees exactly its reported overlap while also ordering all three complete operations. An interval presentation uses the classes 𝐼0={𝗂𝗇𝗏0(3)},𝐼1={𝗂𝗇𝗏1(5),𝗋𝖾𝗌𝗉0({3,5})},𝐼2={𝗂𝗇𝗏2(2),𝗋𝖾𝗌𝗉1,𝗋𝖾𝗌𝗉2}. Thread 0 spans 𝐼0 and 𝐼1; the exercise therefore lacks the premise that each operation is represented by one set class. The restricted set theorem does not apply.