Definition · History, real-time order, and a linearizationA history is a set of operations, each with a start time, an end time and a return value. A linearization is a total order of those operations such that a precedes b whenever a ended before b started, and such that replaying them in that order against the object is legal — every read returns the most recently written value. A history is linearizable if at least one linearization exists.
The definition is an existence claim, and that is what makes the enumeration a decision procedure: generate every total order, apply the two filters, and count. A count of zero settles the question in the negative, and any count above zero settles it in the positive.
the register starts at 0
A write 1 [0, 4]
B read → 1 [2, 6]
C read → 0 [5, 9]
real time: A ends at 4 and C starts at 5, so A must precede C
A and B overlap; B and C overlap; no other constraint
Nothing about this history looks wrong operation by operation. B read 1, which was written. C read 0, which was the initial value. Both are values the register genuinely held, and a system that checked each response individually would report no problem at all.
order real time replay against a register starting at 0
A B C A before C w1, r→1 ✓, r→0 ✗ C reads 0 after the write
A C B A before C w1, r→0 ✗
B A C A before C r→1 ✗ nothing written yet
B C A C before A rejected by real time
C A B C before A rejected by real time
C B A C before A rejected by real time
total orders 6
allowed by real time 3
legal 0 the history is NOT linearizable
The verdict comes from the combination. C reading 0 would be fine if it could be placed before the write, and real time forbids that because A had already returned when C was issued. B reading 1 would be fine anywhere after the write. It is the pair of constraints together that leaves nothing, which is why linearizability is a property of histories and not of responses.
Why the lab stops at six operations
k k! what the enumeration costs
3 6
4 24
5 120
6 720 the cap the lab enforces
7 5040 refused, with the number printed
10 3 628 800
20 2.4 × 10¹⁸
The growth is factorial, so the cap is not a limitation of the page, it is the shape of the problem. Real checkers do not enumerate: they search with pruning, commit operations greedily and backtrack, or check a weaker property that is cheaper to decide. The lab refuses a seventh operation and prints 5040 rather than quietly truncating, because a silent truncation would teach the opposite of the thing worth learning.
Example · One return value makes it legalChange C to read 1 instead of 0 and nothing else about the history moves — same intervals, same real-time constraint. Now A B C replays as w1, r→1, r→1, which is legal, and A C B does too. Two of the three real-time-respecting orders survive, the count is 2, and the history is linearizable. A single returned value flipped the verdict, which is the sense in which linearizability is a property of the whole history and a very sharp one.
It is worth being precise about what this buys. Linearizability is the guarantee that the system behaves as though there were one copy of the data and every operation took effect at a single instant between its call and its return. “Quorums Overlap” gave a much weaker property — no acknowledged write is missed entirely — and the gap between the two is the whole reason this lesson exists.