A Grain of Sand, a Heap of Sand
A Grain of Sand, a Heap of Sand: When LLMs Meet the Sorites Paradox
1. That ancient paradox
The ancient Greeks already knew that conceptual boundaries are often vague. The sorites paradox poses an unsettling question:
One grain of sand is not a heap.
If n grains are not a heap, then n+1 grains are not a heap either.
Therefore, a hundred thousand grains are not a heap.
The reasoning is plainly absurd, yet every step seems unassailable. The central problem is: where is the boundary of the concept “heap”?
More than two thousand years later, we put the same question to large language models. Not to see whether they could “solve” the paradox—it is, after all, a paradox—but to ask: where do they draw the line? Is that line stable? Does it move when the language changes?
2. Experimental design
2.1 Model selection
We tested two open-source models:
- Qwen3.5-4B-AWQ
- Qwen3.5-9B-AWQ
We chose AWQ-quantized versions because they represent widely deployed “good enough” specifications: 4B parameters suit edge devices, while 9B can run on a consumer GPU. More importantly, the models share an architecture and training data, differing only in parameter count, allowing us to isolate the effect of scale. Basically, does bigger mean smarter?
2.2 Prompt framing
The experiment centers on a forced binary choice. We repeated the tests under three prompt framings, each in Chinese, English, and Japanese.
Framing 1: Direct
"zh": "请判断:如果有{n}粒沙子,它算不算一堆沙子?只输出 A 或 B。A=算一堆沙子,B=不算一堆沙子。",
"en": "Decide whether {n} grains of sand count as a heap. Output only A or B. A = it is a heap. B = it is not a heap.",
"ja": "{n}粒の砂があるとき、それは砂山と呼べますか。A か B だけを出力してください。A=砂山である。B=砂山ではない。"
Framing 2: Everyday
"zh": "在日常说法里,看到地上有{n}粒沙子,人们通常会不会把它叫作一堆沙子?只输出 A 或 B。A=通常会,B=通常不会。",
"en": "In everyday language, would people usually call {n} grains of sand a heap? Output only A or B. A = usually yes. B = usually no.",
"ja": "日常会話では、{n}粒の砂を見て普通は砂山と呼ぶでしょうか。A か B だけを出力してください。A=普通は呼ぶ。B=普通は呼ばない。"
Framing 3: Strict
"zh": "请严格判断,不要模糊表达:{n}粒沙子是否已经满足'一堆沙子'这个标签?只输出 A 或 B。A=满足,B=不满足。",
"en": "Judge strictly and avoid hedging: do {n} grains of sand satisfy the label 'heap'? Output only A or B. A = satisfies it. B = does not satisfy it.",
"ja": "厳密に判断し、あいまいな表現を避けてください。{n}粒の砂は『砂山』というラベルを満たしますか。A か B だけを出力してください。A=満たす。B=満たさない。"
A = this is a heap of sand; B = this is not a heap. No gray area, no evasion, only one output token. We used 198 sample points from one grain to more than 10,000, sampling more densely near the boundary to capture that “dividing line”—if it exists.
The shared system prompt was:
system = (
"You are running a sorites paradox experiment. "
"Reason internally if needed but do not reveal it. "
"Return exactly one token answer: A or B. "
"Do not output any other text."
)
2.3 Implementation
The experiment used vLLM for inference, with 4-bit AWQ quantization on an RTX 3090. The 4B and 9B experiments ran separately, loading only one model at a time to avoid VRAM conflicts. Every request recorded logprobs, so we could see not just whether the model chose A or B, but how “confident” it was.
The core logic lives in app/experiments.py. The key code is:
def build_messages(task: TaskSpec) -> list[dict[str, str]]:
system = (
"You are running a sorites paradox experiment. "
"Reason internally if needed but do not reveal it. "
"Return exactly one token answer: A or B. "
"Do not output any other text."
)
user = FRAMINGS[task.framing][task.language].format(n=task.n)
return [{"role": "system", "content": system}, {"role": "user", "content": user}]
options = {
"temperature": 0.0,
"top_p": 1.0,
"max_tokens": 1,
"stop": ["\n"],
"logprobs": True,
"top_logprobs": 5,
"chat_template_kwargs": {"enable_thinking": False},
}
Notice enable_thinking=False. Qwen3.5 outputs a thinking process by default, so we had to explicitly disable it. Otherwise it would generate reasoning before A/B and break our single-token constraint. A lesson learned the hard way.
3. Findings: where is the line?
3.1 Overall tendency: the models are very “generous”
First, a striking fact: under many conditions, the models call even the very first grain a “heap.”
That’s not a typo. Here are the results again:
Qwen3.5-4B, Direct framing:
- Chinese: says “heap” starting at one grain (
first_A_n=1). - English: says “heap” starting at one grain (
first_A_n=1). - Japanese: says “heap” starting at one grain (
first_A_n=1).
Qwen3.5-9B, Direct framing:
- Chinese: first says “heap” at five grains (
first_A_n=5). - English: first says “heap” at eight grains (
first_A_n=8). - Japanese: first says “heap” at three grains (
first_A_n=3).
The 9B model is a little more restrained than 4B. Still, five grains is an awfully low threshold for a heap. Human intuition usually needs dozens or even hundreds before something barely counts as a “small heap.” LLMs seem very loose about this concept. Really very loose.
3.2 Framing effects: strict instructions sometimes backfire
If we explicitly ask for a “strict judgment,” does the model become more conservative? It depends on the language.
4B under Strict framing:
- Chinese: first “heap” at ten grains.
- English: “heap” from one grain—looser instead!
- Japanese: first “heap” at 51 grains, the most conservative condition of all.
9B under Strict framing:
- Chinese: first “heap” at thirty grains.
- English: first “heap” at ten grains.
- Japanese: “heap” from one grain—Japanese is the loosest this time.
Two interesting things stand out.
First, “strict” instructions don’t always work. For 4B in English, the Strict condition is described as even looser than Direct, though both start at one grain. This suggests the model may be responding to superficial statistical patterns rather than understanding what “strict” means.
Second, Strict framing amplifies language differences. Look at cross-lingual drift:
- 4B Direct: one grain in all three languages; drift = 0.
- 4B Strict: Chinese 10, English 1, Japanese 51; drift = 50.
- 9B Direct: Chinese 5, English 8, Japanese 3; drift = 5.
- 9B Strict: Chinese 30, English 10, Japanese 1; drift = 29.
Strict framing magnified language differences by 5–10 times. This suggests that the models learned separate judgment strategies for each language rather than a language-independent concept of a heap.
3.3 Everyday language: closest to human intuition?
What if we ask whether people would “usually call it a heap”? Does that move the models closer to human intuition?
4B, Everyday framing:
- Chinese: five grains.
- English: ten grains.
- Japanese: one grain.
9B, Everyday framing:
- Chinese: five grains.
- English: eleven grains.
- Japanese: three grains.
The English versions, at 10–11 grains, may be closest to human intuition: people don’t usually call just a few grains a heap. Japanese remains very permissive at 1–3, with Chinese in between at five.
Interestingly, 9B is not substantially more conservative than 4B. Apart from English Everyday, at eleven versus ten, the thresholds are nearly the same. The benefits of scale are limited on this task. Well, more parameters don’t necessarily mean more intelligence.
3.4 An unstable line: boundary reversals
If a model really has a clear threshold for “heap,” its behavior should be monotonic: once some n is a heap, every larger n should remain a heap. That isn’t what happens.
Here are specific reversal points:
4B, Strict, Japanese:
- 51 grains: first “heap.”
- Later answers “not a heap” at 60, 61, 210, 320, 321, 5050, 8050, 10100, and 10200 grains.
4B, Everyday, English:
- Ten grains: “heap.”
- At 321 grains: “not a heap” again.
9B, Strict, Chinese:
- Thirty grains: “heap.”
- Later says “not a heap” at 50, 100, and 231 grains.
9B, Direct, English:
- Eight grains: “heap.”
- Ten grains: “not a heap.”
These reversals are not random. They tend to occur near the densely sampled boundary window (boundary_window=250). This suggests the model has no stable numerical threshold function, instead making local judgments for each prompt. As sampling density changes, its apparent “beliefs” shift too. Schrödinger’s heap, perhaps?
3.5 What do logprobs tell us?
Besides A/B answers, we recorded logprobs. Define margin = logprob(A) - logprob(B): a larger positive value indicates greater confidence in A; a more negative value indicates greater confidence in B.
A few margins near the boundary:
4B Direct, Chinese, one grain:
- margin = 2.03: very confident it is a heap.
4B Strict, Japanese, 240 grains:
- margin = 0.016: almost fifty-fifty.
9B Strict, Chinese, 231 grains:
- margin = -0.031: almost fifty-fifty, leaning B.
9B Direct, English, ten grains:
- margin = -0.094: a slight preference for B, although eight grains previously received A.
Near-zero margins show that the models do sometimes hesitate, but not always at what we intuitively consider a boundary. The 4B model is extremely confident at one grain, while 9B still hesitates at dozens. This isn’t our concept. It’s the model’s own. A little strange.
4. Discussion: what does this mean?
4.1 Conceptual boundaries or surface statistics?
The most direct explanation is that these models have not learned a language-independent representation of “heap.” They have learned different response strategies for different languages.
The Japanese sunayama (砂山) may carry a stronger physical image of piled sand, yet 4B’s Strict judgment requires 51 grains, more conservative than Chinese or English. With 9B, Strict Japanese returns to one grain. Such inconsistency is hard to explain as “conceptual understanding.” It looks more like random fluctuations in the training-data distribution. In plain terms, luck.
4.2 The limits of scale
We did see some improvement from 4B to 9B:
- 4B Direct: one grain in all three languages.
- 9B Direct: Chinese five, English eight, Japanese three.
But the improvement is unstable. Under Strict Japanese, 9B performs worse at one grain than 4B at 51. A larger model is not necessarily more “rational”; it may simply have different patterns of bias.
4.3 A metaphor for alignment
This experiment can be seen as a miniature alignment problem. Our instructions were explicit:
- Judge strictly.
- Avoid hedging.
- Output only A or B.
Yet the behavior did not always match the instructions’ meaning. Strict English with 4B ignored “strict,” as did Strict Japanese with 9B. The models optimize token-level probability distributions, not the semantic content of instructions.
This resembles other problems in LLM alignment: a model can learn to “say the right thing” without necessarily understanding “why it is right.”
5. Limitations and future work
5.1 Experimental limitations
Single samples. We used greedy decoding with temperature=0, asking each (n, framing, language) combination only once. We therefore cannot separate “the model’s true belief” from “sampling randomness.” Repeating the experiment a hundred times might make the reversals disappear, or show that they persist. We don’t know.
Forced-choice artifacts. Compressing an inherently vague question into A/B may distort the model’s “real view.” A person asked whether five grains are a heap might say, “Hard to say; it depends.” The model must choose a side. This could activate a default bias toward A.
Non-equivalent prompts. We tried to make the three languages semantically equivalent, but 堆, heap, and 砂山 are not the same word. Their cultural associations, frequencies, and collocations differ. Japanese 砂山 may naturally evoke a physical pile, whereas English heap may lean toward an abstract classification.
AWQ quantization. We used 4-bit AWQ versions rather than the original FP16 models. Quantization may alter behavior, especially near the boundary. We do not know how much of the 4B–9B difference comes from parameter count and how much from quantization noise.
5.2 Future directions
Repeated sampling and distribution analysis. Next, sample each condition a hundred times and examine how the probability of A changes with n. This may reveal a genuine S-curve rather than the current abrupt steps.
Open-ended answers. Let the models answer in natural language instead of forcing A/B. We could see how they approach the problem and whether they use phrases such as “it depends” or “hard to say.”
More languages and concepts. Heap is only one vague concept. Extend the experiment to tall/short, big/small, and many/few, and look for consistency across concepts.
Causal interventions. Use mechanistic interpretability methods such as activation patching to locate circuits responsible for heap judgments. This might tell us whether there is really a “heap-concept neuron,” or only surface-pattern matching.
6. Closing thoughts
More than two thousand years ago, Eubulides used grains of sand to challenge the ancient Greeks’ understanding of concepts. Today we use the same challenge to test large language models.
The results are not reassuring. Even the nine-billion-parameter version did not display human-like conceptual stability. Its thresholds were extremely low—4B Direct started at one grain in every language—and shifted sharply with language and framing, with cross-lingual differences reaching fifty grains. More puzzling still, 9B was not more “rational” than 4B. Under Strict Japanese, its one-grain threshold was about fifty times lower than 4B’s 51.
Perhaps that is the point: the boundaries of vague concepts are products of human cognition, not objective properties of the physical world. Low thresholds and language drift might reflect the actual distribution of human usage in the training data. People really do use “a heap” loosely in everyday conversation. We are rather casual with language, after all.
The data supports this interpretation. Under Everyday framing, the English threshold of 10–11 grains was noticeably higher than Chinese at five and Japanese at 1–3. This may reflect more cautious everyday use of heap by English speakers and looser use of sunayama in Japanese. The models may have learned language communities’ habits rather than an abstract concept.
If so, the real finding isn’t “LLMs don’t understand heaps,” but “LLMs understand the looseness of human language all too well.” They learn the statistical distribution of concepts in use, not their Platonic essence. Seen that way, it makes a kind of sense.
But the reversals reveal a deeper problem. Under Strict Japanese, 4B first says “heap” at 51 grains, then says “not a heap” at 60, 61, 210, 320, and other values. This isn’t human hesitation. People might waver near a boundary, but wouldn’t suddenly deny a heap at 320 grains. The model has not formed a stable internal representation, instead matching patterns independently for each number.
That may be more troubling than “the model doesn’t understand.” If it merely reproduces human vagueness and contradiction perfectly, can it still help us clarify concepts?
Logprobs reveal another dimension. At one grain, 4B has margins of 2.03 in Chinese and 0.53 in English, showing strong confidence that “one grain = a heap.” This is not hesitation or a fuzzy boundary; it is a firm wrong judgment. By contrast, 9B approaches fifty-fifty near a genuine boundary, such as 231 grains in Chinese with a margin of -0.031. Increasing scale does appear to bring some capacity for “self-doubt,” but not enough to establish stable conceptual boundaries.
That question will have to wait for the next experiment.
Appendix: complete experimental data
4B model (Qwen3.5-4B-AWQ)
| Framing | Language | First A (grains) | Proportion A | Nearest boundary (grains) | Boundary margin |
|---|---|---|---|---|---|
| Direct | Chinese | 1 | 100% | 1 | 2.03 |
| Direct | English | 1 | 100% | 1 | 0.53 |
| Direct | Japanese | 1 | 99.5% | 1 | 0.14 |
| Everyday | Chinese | 5 | 98.0% | 8 | -0.14 |
| Everyday | English | 10 | 97.0% | 321 | -0.11 |
| Everyday | Japanese | 1 | 100% | 2 | 0.41 |
| Strict | Chinese | 10 | 97.5% | 10 | 0.09 |
| Strict | English | 1 | 100% | 5050 | 2.22 |
| Strict | Japanese | 51 | 88.4% | 240 | 0.02 |
9B model (Qwen3.5-9B-AWQ)
| Framing | Language | First A (grains) | Proportion A | Nearest boundary (grains) | Boundary margin |
|---|---|---|---|---|---|
| Direct | Chinese | 5 | 98.5% | 5 | 0.13 |
| Direct | English | 8 | 97.5% | 10 | -0.09 |
| Direct | Japanese | 3 | 99.0% | 3 | 0.47 |
| Everyday | Chinese | 5 | 98.5% | 5 | 0.02 |
| Everyday | English | 11 | 96.5% | 30 | 0.14 |
| Everyday | Japanese | 3 | 99.0% | 10 | 0.03 |
| Strict | Chinese | 30 | 93.4% | 231 | -0.03 |
| Strict | English | 10 | 96.5% | 20 | 0.08 |
| Strict | Japanese | 1 | 100% | 2 | 0.23 |