Reproducing the Traps in the Original Code
A companion to A Vector-Symbolic Clojure. The overview found five traps in a vector-symbolic Lisp. This page runs each one against the original authors’ own code. October 2026.
My Clojure started from Tomkins-Flanagan and Kelly’s “Hey Pentti, We Did It!” (ICCM 2024). That paper built Lisp 1.5 out of holographic vectors and showed that it can be done. Their follow-up with Hanley, “Hey Pentti, We Did (More of) It!” (IJCNN 2025), added integers in residue arithmetic. Both have public code. My five traps came from my code. The fair question is which of them exist in theirs. Here I answer it by running their code: I fetch it at a pinned commit, add noise the way my paper does, and count. The trap numbers 1–5 are those of the overview.
Their papers are proofs of concept, and holis’s README says so. Nothing below changes that. A proof of concept is where the next person starts, and this page lists what that next person (me) ran into.
If you maintain or build on either codebase, go to Errata for the authors: each defect with its location, a minimal program and a suggested fix.
The two codebases
holis (eilene-ftf/holis, commit db208d7, AGPL-3.0) is one Jupyter notebook. It adapts Norvig’s lispy to holographic reduced representations (HRR) at D = 512:
- Vectors are random Gaussian, bound by circular convolution.
- A cons cell is the bundle lhs⊗a + rhs⊗b + φ, but it is stored behind a fresh random pointer in a second memory, because, in the notebook’s words, “tuples turn out to degrade rather quickly”. Equal bundles share a pointer.
- CAR and CDR follow the pointer, unbind a role and clean up against a lookup table (argmax).
- The pointer memory looks up a noisy pointer by its nearest key, but only if the cosine exceeds θ = 0.2. Otherwise it returns the probe itself.
- The evaluator tests with a fixed floor of 0.2, and COND is the paper’s saturating ⊕ with cutoffs 0.8 and 0.2.
- Functions work by substitution, so there are no environments. Numbers are Peano lists: 0 is NIL and n+1 is (n).
residuelisp (hanleyc01/residuelisp, commit 09864c7, MIT) is the code of the second paper, a typed Python package. It uses complex FHRR vectors at D = 1000:
- Cells sit behind pointers, as in holis.
- Function calls bind parameters in a small memory keyed by symbol.
- Integers have two schemes. The default,
ListIntegers, is Peano lists as in holis.IntegerEncodingScheme.RHCIntegers, whichmain.py -i, thetest_rhc_*tests and all my runs use, is Kymn et al.’s residue code over the moduli 3, 5, 7, 11 (range 0..1154), plus a tag: int(x) = ζ(x) + int. R1 and R4 needRHCIntegers. - It keeps holis’s numbers: θ = 0.2 in the pointer memory and a 0.2 floor in its approximate equality. Its similarity is not normalised, though.
What I ran
Nothing of theirs is copied into my repository. A small loader fetches each codebase at its pinned commit when a script runs. For holis it executes the notebook’s code cells as a module. The scripts in repro/holis/ then:
- add probe noise exactly as in my paper: before every cleanup, the probe p becomes p + σ·|p|/√D · N(0, I). Cleanups are the item memory, the function memory and the pointer memory;
- change at most one thing as a control, and say which;
- count over seeds, and write every number on this page to a JSON file that the page reads.
First, their code works. Noise-free, holis computes these at D = 512 and 2048 over 5 seeds each:
| program | D | correct |
|---|---|---|
|
512 | 5 / 5 |
|
512 | 5 / 5 |
|
512 | 5 / 5 |
|
512 | 5 / 5 |
|
512 | 5 / 5 |
|
512 | 5 / 5 |
|
512 | 5 / 5 |
|
512 | 5 / 5 |
|
512 | 5 / 5 |
|
512 | 4 / 5 |
|
2048 | 5 / 5 |
|
2048 | 5 / 5 |
|
2048 | 5 / 5 |
|
2048 | 5 / 5 |
|
2048 | 5 / 5 |
|
2048 | 5 / 5 |
|
2048 | 5 / 5 |
|
2048 | 5 / 5 |
|
2048 | 5 / 5 |
|
2048 | 4 / 5 |
One program misses a seed. I return to it under E1 below. The authors’ own fizzbuzz helpers, verbatim from the notebook, also give the right answers. They are slow, which is why the noise sweeps below use smaller programs:
| program | result | expected | seconds |
|---|---|---|---|
| their fizzbuzz DEFINEs |
|
|
5.9 |
| countdown 3 1 |
|
|
16.6 |
| divisible 3 3 |
|
|
83.1 |
| divisible 4 3 |
|
|
767.8 |
| and T F |
|
|
51.7 |
| take 2 (a b c) |
|
|
241.2 |
residuelisp, noise-free at D = 1000 over 5 seeds:
| program | expected | correct |
|---|---|---|
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
|
|
5 / 5 |
So both interpreters do what their papers show. What follows asks for more than the papers claim.
Trap 1: Superposed cells, which the paper has and the code does not
Applies? To the paper’s equation (2), cons(a, b) = ν(L⊗a + R⊗b + φ), yes. To the code, no: both codebases put each cell behind a random pointer, as my fix does. The holis notebook gives the reason in a comment.
To see the paper’s cell inside their code, I added a paper mode. It is two attributes on their pointer memory: a cell is stored as its own normalised bundle, and “following” it returns it unchanged. The evaluator, CAR, CDR and the reader stay theirs. At D = 2048, Peano numerals n and n+1 then look alike. Pointer cells do not:
| mode | mean cos(n, n+1) | mean cos(n, n+2) | seeds |
|---|---|---|---|
| pointer | 0.000 | 0.005 | 5 |
| paper | 0.743 | 0.721 | 5 |
Reproduced? Yes, noise-free, and in a way I did not expect. Their evaluator decides that an expression “evaluates to itself”, and stops, when the result is similar to the input: (ee == e) > 0.2. With pointers, a form and its result are unrelated. With superposed cells, a form and its first evaluation step share terms, and their cosine is well above 0.2:
| mode | program | correct | results | mean cos(form, first step) |
|---|---|---|---|---|
| pointer |
|
10 / 10 | ["a"] ×10 | 0.005 |
| pointer |
|
10 / 10 | ["no"] ×10 | 0.001 |
| pointer |
|
9 / 10 | [["a", "b", "c"]] ×9, [["a", "LAMBDA", ["c"], "LAMBDA"]] ×1 | 0.005 |
| paper |
|
10 / 10 | ["a"] ×10 | -0.003 |
| paper |
|
10 / 10 | ["no"] ×10 | -0.001 |
| paper |
|
0 / 10 | [["CONS", "a", ["b", "c"]]] ×7, [["CONS", ["x", "b", "c"], ["b", "c"]]] ×2, [["CONS", ["b", "c"], ["b", "c"]]] ×1 | 0.435 |
In paper mode the LAMBDA program stops after the substitution and returns the body unevaluated. This is trap 1’s lesson in its plainest form: similarity of content is not identity.
Under noise the picture is less clean. Here numerals 1 to 8 are built, and then numeral 4 is read back with their reader:
| σ | pointer | pointer, theta=5/sqrt(D) | pointer, theta=-1 | paper |
|---|---|---|---|---|
| 0 | 20 / 20 | 20 / 20 | 0 / 20 | 20 / 20 |
| 0.500 | 20 / 20 | 20 / 20 | 0 / 20 | 20 / 20 |
| 1 | 20 / 20 | 20 / 20 | 0 / 20 | 20 / 20 |
| 1.500 | 20 / 20 | 20 / 20 | 0 / 20 | 20 / 20 |
| 2 | 20 / 20 | 20 / 20 | 0 / 20 | 20 / 20 |
| 3 | 20 / 20 | 20 / 20 | 0 / 20 | 19 / 20 |
| 4 | 16 / 20 | 20 / 20 | 0 / 20 | 17 / 20 |
| 5 | 0 / 20 | 18 / 20 | 0 / 20 | 15 / 20 |
| 6 | 0 / 20 | 17 / 20 | 0 / 20 | 14 / 20 |
| 8 | 0 / 20 | 1 / 20 | 0 / 20 | 5 / 20 |
| 10 | 0 / 20 | 0 / 20 | 0 / 20 | 1 / 20 |
| 12 | 0 / 20 | 0 / 20 | 0 / 20 | 0 / 20 |
| 16 | 0 / 20 | 0 / 20 | 0 / 20 | 0 / 20 |
With their θ = 0.2, pointer cells fail first, because of that threshold (trap 3 below). With θ set relative to chance, 5/√D, the comparison is between encodings alone. Then the curves cross: pointer cells read more numerals right at σ = 5 and 6, superposed cells at σ = 8. So this test does not show the loss of noise tolerance I measured in my own code (trap 1 on the overview). One difference: a superposed cell needs no pointer lookup, so each read makes fewer noisy cleanups. Plain argmax (θ = −1) breaks the pointer reads even at σ = 0. Their atom test needs a threshold, which I come back to in trap 3.
Verdict. The paper’s cell causes a noise-free failure in their code. The code’s own cell does not have that problem. The extra noise sensitivity did not reproduce in my read test.
Trap 2: Binding commutes
Applies? Mostly no. Neither codebase stores an unlabelled pair: cells carry the roles lhs and rhs. holis has no environments, and residuelisp’s are a keyed memory, not a sum of var⊗value. As a control, (x . y) and (y . x) read back correctly every time.
There is one opening. In holis the roles are also ordinary atoms: vsa_env enters lhs, rhs and φ in the lexicon. A program that mentions the symbol lhs therefore gets the role vector itself. The cell (x . lhs) then contains lhs⊗x + rhs⊗lhs. Unbinding lhs finds x and rhs at equal strength, because rhs⊗lhs = lhs⊗rhs.
Reproduced? Yes, through their parser, evaluator and reader, 40 seeds per row:
| program | D | expected | correct | results |
|---|---|---|---|---|
|
512 | x | 18 / 40 | rhs ×22, x ×18 |
|
512 | x | 17 / 40 | lhs ×23, x ×17 |
|
512 | x | 40 / 40 | x ×40 |
|
512 | x | 40 / 40 | x ×40 |
|
512 | x | 40 / 40 | x ×40 |
|
512 | y | 40 / 40 | y ×40 |
|
512 | y | 40 / 40 | y ×40 |
|
512 | x | 40 / 40 | x ×40 |
|
2048 | x | 19 / 40 | rhs ×21, x ×19 |
|
2048 | x | 22 / 40 | x ×22, lhs ×18 |
|
2048 | x | 40 / 40 | x ×40 |
|
2048 | x | 40 / 40 | x ×40 |
|
2048 | x | 40 / 40 | x ×40 |
|
2048 | y | 40 / 40 | y ×40 |
|
2048 | y | 40 / 40 | y ×40 |
|
2048 | x | 40 / 40 | x ×40 |
|
8192 | x | 20 / 40 | x ×20, rhs ×20 |
|
8192 | x | 22 / 40 | x ×22, lhs ×18 |
|
8192 | x | 40 / 40 | x ×40 |
|
8192 | x | 40 / 40 | x ×40 |
|
8192 | x | 40 / 40 | x ×40 |
|
8192 | y | 40 / 40 | y ×40 |
|
8192 | y | 40 / 40 | y ×40 |
|
8192 | x | 40 / 40 | x ×40 |
About half the reads give the wrong atom at every D. It is a tie, not noise, so a bigger D does not help. residuelisp names its roles __lhs and __rhs. Its lexer starts identifiers with a letter, so a program cannot name them (I read this in their lexer and did not run it).
Trap 3: Fixed thresholds cap robustness
Applies? To holis, yes. Its pointer memory accepts the nearest key only above cosine θ = 0.2. A probe with noise σ has cosine 1/√(1 + σ²) to its key. That falls below 0.2 at σ = √24 ≈ 4.9, whatever D is.
Reproduced? Yes. The control is the same code with θ = 5/√D, a threshold relative to chance, as my paper prescribes. It is one attribute set on their object. Plain argmax (θ = −1) would not do: their atom test needs the threshold to tell an atom, which matches no pointer, from a cell. With θ = −1 even noise-free reads fail. For D = 512, 5/√D = 0.22 is close to their 0.2. First, single CAR lookups on 25 stored 4-lists, 200 lookups per cell. The cells give correct lookups, and in parentheses how often θ made the memory return the probe itself:
| σ | D=512, theirs (theta=0.2) | D=512, chance floor (theta=5/sqrt(D)) | D=2048, theirs (theta=0.2) | D=2048, chance floor (theta=5/sqrt(D)) | D=8192, theirs (theta=0.2) | D=8192, chance floor (theta=5/sqrt(D)) |
|---|---|---|---|---|---|---|
| 0 | 200 (0) | 200 (0) | 200 (0) | 200 (0) | 200 (0) | 200 (0) |
| 1 | 200 (0) | 200 (0) | 200 (0) | 200 (0) | 200 (0) | 200 (0) |
| 2 | 196 (0) | 196 (0) | 200 (0) | 200 (0) | 200 (0) | 200 (0) |
| 3 | 159 (0) | 159 (1) | 200 (0) | 200 (0) | 200 (0) | 200 (0) |
| 4 | 103 (26) | 84 (54) | 195 (4) | 199 (0) | 200 (0) | 200 (0) |
| 4.500 | 48 (75) | 38 (101) | 164 (37) | 199 (0) | 190 (10) | 200 (0) |
| 5 | 26 (104) | 15 (147) | 83 (118) | 194 (0) | 75 (126) | 200 (0) |
| 5.500 | 21 (141) | 12 (165) | 31 (165) | 178 (0) | 6 (197) | 200 (0) |
| 6 | 9 (160) | 7 (180) | 8 (194) | 165 (0) | 1 (200) | 200 (0) |
| 7 | 3 (183) | 2 (194) | 2 (199) | 119 (15) | 1 (200) | 200 (0) |
| 8 | 5 (191) | 4 (197) | 1 (200) | 91 (46) | 0 (200) | 200 (0) |
| 10 | 1 (198) | 1 (200) | 0 (200) | 21 (147) | 1 (200) | 188 (0) |
| 12 | 1 (200) | 1 (200) | 2 (200) | 8 (179) | 2 (200) | 166 (0) |
| 16 | 2 (200) | 2 (200) | 2 (200) | 2 (200) | 2 (200) | 83 (46) |
With their θ, the lookups collapse between σ = 5 and 5.5 at D = 2048 and at D = 8192 alike, just past the predicted 4.9, and the fallback count shows why. With the chance floor, D = 8192 still gets 200 of 200 at σ = 8. At D = 512 the two rows agree, because there the item memory gives out first, and 5/√512 is close to 0.2 anyway.
The same holds one level up. Here is a 4-list read back with their reader, 20 seeds per cell:
| σ | D=512, theirs (theta=0.2) | D=512, chance floor (theta=5/sqrt(D)) | D=2048, theirs (theta=0.2) | D=2048, chance floor (theta=5/sqrt(D)) | D=8192, theirs (theta=0.2) | D=8192, chance floor (theta=5/sqrt(D)) |
|---|---|---|---|---|---|---|
| 0 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 |
| 1 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 |
| 2 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 |
| 3 | 14 / 20 | 14 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 |
| 4 | 0 / 20 | 0 / 20 | 17 / 20 | 20 / 20 | 20 / 20 | 20 / 20 |
| 5 | 0 / 20 | 0 / 20 | 0 / 20 | 18 / 20 | 0 / 20 | 20 / 20 |
| 6 | 0 / 20 | 0 / 20 | 0 / 20 | 15 / 20 | 0 / 20 | 20 / 20 |
| 8 | 0 / 20 | 0 / 20 | 0 / 20 | 0 / 20 | 0 / 20 | 20 / 20 |
| 10 | 0 / 20 | 0 / 20 | 0 / 20 | 0 / 20 | 0 / 20 | 18 / 20 |
| 12 | 0 / 20 | 0 / 20 | 0 / 20 | 0 / 20 | 0 / 20 | 11 / 20 |
And a whole program, ((LAMBDA (x) (CONS x (b c))) a), 10 seeds per cell. Its noise-free row already misses some seeds (E1 below):
| σ | D=512, theirs (theta=0.2) | D=512, chance floor (theta=5/sqrt(D)) | D=2048, theirs (theta=0.2) | D=2048, chance floor (theta=5/sqrt(D)) | D=8192, theirs (theta=0.2) | D=8192, chance floor (theta=5/sqrt(D)) |
|---|---|---|---|---|---|---|
| 0 | 9 / 10 | 9 / 10 | 9 / 10 | 9 / 10 | 7 / 10 | 7 / 10 |
| 2 | 6 / 10 | 6 / 10 | 10 / 10 | 10 / 10 | 7 / 10 | 7 / 10 |
| 4 | 0 / 10 | 0 / 10 | 3 / 10 | 10 / 10 | 8 / 10 | 8 / 10 |
| 5 | 0 / 10 | 0 / 10 | 0 / 10 | 7 / 10 | 0 / 10 | 8 / 10 |
| 6 | 0 / 10 | 0 / 10 | 0 / 10 | 0 / 10 | 0 / 10 | 8 / 10 |
| 8 | 0 / 10 | 0 / 10 | 0 / 10 | 0 / 10 | 0 / 10 | 7 / 10 |
| 10 | 0 / 10 | 0 / 10 | 0 / 10 | 0 / 10 | 0 / 10 | 3 / 10 |
Their θ stops the program at σ = 5 for D = 2048 and 8192 alike. With the chance floor, D = 8192 still gets 8 of 10 at σ = 5 and 6. That is as many as at σ = 4, and more than the 7 of 10 at σ = 0, which E1 costs.
residuelisp keeps the 0.2 but compares it with an unnormalised similarity. A noisy pointer keeps similarity about 1 to its own key at any σ. What grows is the spread of chance matches, about √((1 + σ²)/(2D)). So the cutoff should give way at a σ that grows like √D. Here is the two-lambda program, 10 seeds per cell:
| σ | D=500 | D=2000 | D=8000 |
|---|---|---|---|
| 0 | 10 / 10 | 10 / 10 | 10 / 10 |
| 1 | 10 / 10 | 10 / 10 | 10 / 10 |
| 2 | 7 / 10 | 10 / 10 | 10 / 10 |
| 3 | 0 / 10 | 10 / 10 | 10 / 10 |
| 4 | 0 / 10 | 8 / 10 | 10 / 10 |
| 6 | 0 / 10 | 0 / 10 | 10 / 10 |
| 8 | 0 / 10 | 0 / 10 | 9 / 10 |
| 12 | 0 / 10 | 0 / 10 | 1 / 10 |
| 16 | 0 / 10 | 0 / 10 | 0 / 10 |
| 24 | 0 / 10 | 0 / 10 | 0 / 10 |
| 32 | 0 / 10 | 0 / 10 | 0 / 10 |
The last σ with all 10 runs right is 1 at D = 500, 3 at D = 2000 and 6 at D = 8000. It roughly doubles for each 4× in D, as √D predicts. So in residuelisp the fixed numbers do not set a cap independent of D. Its failures are loud: every failing run raised an exception (mostly InterpreterError) or hit my cleanup budget, and none returned a wrong value (raw table in the appendix). A fixed floor has a different cost there, in trap 4.
Trap 5: A sum of tuples
Applies? No. Neither codebase builds superpositions of values, and neither has positional vectors, so there are no joint worlds to lose.
Further errata
Running the code turned up problems that my list does not cover. All are noise-free.
E1 (holis). CAR of an atom. To decide “is this head a lambda expression?”, their evaluator compares car(head) with LAMBDA. It does this even when head is an atom, and an atom has no CAR. car() then cleans up a meaningless probe and returns some stored item. When that item happens to match, the evaluator takes the wrong branch. Here is ((LAMBDA (x) (CONS x (b c))) a) over 100 seeds. The control makes car() answer NIL for anything that is not a stored pointer, and changes nothing else:
| D | variant | wrong |
|---|---|---|
| 512 | theirs | 7 / 100 |
| 512 | car(atom) = NIL | 0 / 100 |
| 2048 | theirs | 11 / 100 |
| 2048 | car(atom) = NIL | 0 / 100 |
Some of the wrong results:
| D | seed | result |
|---|---|---|
| 512 | 0 |
|
| 512 | 34 |
|
| 512 | 41 |
|
| 512 | 43 |
|
| 2048 | 2 |
|
| 2048 | 11 |
|
| 2048 | 21 |
|
| 2048 | 46 |
|
What car(a) returns for the atom a, after the run, over the 100 seeds. It is spread over the whole vocabulary:
| D | car(a) → item ×seeds |
|---|---|
| 512 | NIL ×11, CONS ×9, b ×9, 1 ×9, lhs ×8, a ×7, φ ×6, F ×6, T ×5, rhs ×5, c ×5, DEFINE ×4, QUOTE ×3, LABEL ×3, x ×2, CDR ×2, EQ ×2, ATOM ×1, COND ×1, CAR ×1, LAMBDA ×1 |
| 2048 | a ×14, lhs ×11, F ×9, T ×7, x ×7, c ×7, φ ×5, CONS ×5, NIL ×5, EQ ×5, DEFINE ×4, LAMBDA ×4, 1 ×4, CAR ×3, QUOTE ×2, LABEL ×2, b ×2, CDR ×2, rhs ×1, ATOM ×1 |
E2, E3 (holis). CAR does not evaluate its argument (nor does CDR; CONS does not either, but their evaluator re-evaluates the new cell, which hides that for plain arguments and loops on quoted ones; see the errata), and LABEL is dispatched but raises. Their paper says it leaves LABEL out, so E3 is a leftover, not a broken claim:
| program | D | results over seeds |
|---|---|---|
|
512 | ["CDR"] ×5 |
|
512 | TypeError: vsa_env.<locals>.label() got an unexpected keyword argument 'ind' ×5 |
E5 (holis), a question. For a list whose head is no function, the code evaluates the tail as a call, where the paper says to leave the list unevaluated. So (a CAR (b c)) gives the pair (a . b). Their programs rely on this, so it may well be intended (see the errata).
E4 (holis). The item memory adds 100 rows per item past 100. SimpleCleanUp.memorize appends 100 empty rows once it is full, but it never raises its capacity. So past 100 items, every new item appends another 100 rows. An empty row scores 0, so it can win a lookup only when every stored row scores below 0. Mostly it costs memory and time. It is why the fizzbuzz calls above take minutes, and why my noise sweep at D = 8192 needed smaller memories to stay under 8 GB. residuelisp’s CleanupMemory does raise its capacity.
| items stored | matrix rows | MB at D = 512 |
|---|---|---|
| 100 | 100 | 0.4 |
| 200 | 10100 | 41.4 |
| 400 | 30100 | 123.3 |
| 800 | 70100 | 287.1 |
| after their fizzbuzz DEFINEs, D = 512 | items stored | matrix rows |
|---|---|---|
| seed 0 | 635 | 53600 |
R2–R5 (residuelisp).
- R2:
andtests its left argument twice and never the right one. Structuraleq?on lists joins car and cdr withand, so it compares only the cars. - R3:
ifdoes not evaluate its condition. The condition is the unevaluated form, a pointer, which is neithernilnor#f. - R4: the decoder searches 0..199, while the moduli cover 0..1154.
- R5: see the lexer table below.
D = 1000, 5 seeds:
| erratum | program | expected | results |
|---|---|---|---|
| R1 |
|
#f | #t ×5 |
| R1 |
|
#f | #t ×5 |
| R1 control |
|
#t | #t ×5 |
| R2 |
|
#f | #t ×5 |
| R2 |
|
nil or #f | #t ×5 |
| R2 |
|
#f | #t ×5 |
| R2 control |
|
#t | #t ×5 |
| R3 |
|
no | yes ×5 |
| R3 |
|
no | yes ×5 |
| R3 control |
|
no | no ×5 |
| R4 |
|
250 | 37 ×1, 15 ×1, 119 ×1, 77 ×1, 61 ×1 |
| R4 |
|
200 | 173 ×1, 32 ×1, 16 ×2, 61 ×1 |
| R4 |
|
-2 (1153 mod 1155) | 173 ×1, 15 ×1, 121 ×1, 127 ×1, 46 ×1 |
| R4 control |
|
199 | 199 ×5 |
R5: the lexer drops a ) that directly follows an integer, so nested arithmetic parses wrongly. My residuelisp programs put a space there.
| source | tokens | result (seed 0) |
|---|---|---|
|
|
– |
|
|
– |
|
|
InterpreterError: Segmentation fault in car hehe |
|
|
6 |
What did not reproduce
- Trap 1 does not apply to either codebase as written: both use pointer cells. In my paper mode of holis it shows up as a noise-free failure, but the loss of noise tolerance did not show in my read test.
- Trap 2 shows up only through role names leaking into holis’s symbol table. The (x . y) / (y . x) controls are 40 of 40 correct.
- Trap 3 does not reproduce in residuelisp in the form “a cap independent of D”, because its similarity is unnormalised (see the table above).
- Trap 5 does not apply.
Summary
| trap | holis (2024) | residuelisp (2025) |
|---|---|---|
| 1 superposed cells | code: n/a (pointers), paper mode: noise-free failure reproduced, noise margin not | n/a (pointers) |
| 2 commuting bind | reproduced via role symbols | n/a |
| 3 fixed thresholds | reproduced | not reproduced (the cliff moves with √D) |
| 4 shared field | n/a | reproduced (integer tag) |
| 5 sum of tuples | n/a | n/a |
| new | E1 car of an atom, E2, E3, E4 memory growth; E5 a question (list tails) | R2 and, R3 if, R4 decoder range, R5 lexer |
Appendix
A. Commands
cd repro/holis
python3 -m venv .venv # Python 3.14.7
.venv/bin/pip install numpy more-itertools
export OPENBLAS_NUM_THREADS=1
ulimit -v 8000000
.venv/bin/python holis_control.py
.venv/bin/python holis_errata.py
.venv/bin/python holis_commute.py
.venv/bin/python holis_thresholds.py
.venv/bin/python holis_cells.py
.venv/bin/python residuelisp_control.py
.venv/bin/python residuelisp_errata.py
.venv/bin/python residuelisp_thresholds.py
.venv/bin/python holis_fixes.py
.venv/bin/python holis_tail.py
.venv/bin/python residuelisp_fixes.pyEach script writes the JSON file of the same name, which this page reads. The loader upstream.py fetches holis at db208d782863febfb50ec46b25a3700369f5cfea and residuelisp at 09864c74f1a35680a0008e59d7ab2571269a986f into a gitignored cache.
B. Settings, per file
| file | upstream | python / numpy | settings |
|---|---|---|---|
| holis_control.json | https://github.com/eilene-ftf/holis @ db208d7 | 3.14.7 / 2.5.4 |
|
| holis_errata.json | https://github.com/eilene-ftf/holis @ db208d7 | 3.14.7 / 2.5.4 |
|
| holis_commute.json | https://github.com/eilene-ftf/holis @ db208d7 | 3.14.7 / 2.5.4 |
|
| holis_thresholds.json | https://github.com/eilene-ftf/holis @ db208d7 | 3.14.7 / 2.5.4 |
|
| holis_cells.json | https://github.com/eilene-ftf/holis @ db208d7 | 3.14.7 / 2.5.4 |
|
| residuelisp_control.json | https://github.com/hanleyc01/residuelisp @ 09864c7 | 3.14.7 / 2.5.4 |
|
| residuelisp_errata.json | https://github.com/hanleyc01/residuelisp @ 09864c7 | 3.14.7 / 2.5.4 |
|
| residuelisp_thresholds.json | https://github.com/hanleyc01/residuelisp @ 09864c7 | 3.14.7 / 2.5.4 |
|
| holis_fixes.json | https://github.com/eilene-ftf/holis @ db208d7 | 3.14.7 / 2.5.4 |
|
| residuelisp_fixes.json | https://github.com/hanleyc01/residuelisp @ 09864c7 | 3.14.7 / 2.5.4 |
|
The holis notebook I ran has SHA-256 80eee8cdeed896fe1987bd9c391d3001c3e46f736227f8cac8f9784b2dd09175.
C. Harness excerpts (my code)
Probe noise, wrapped around their two cleanup methods (holis_common.py):
def _noisy(hrr):
s = STATE["sigma"]
if s <= 0:
return hrr
v = hrr.v
n = STATE["rng"].normal(size=v.size) * (s * np.linalg.norm(v) / math.sqrt(v.size))
return H.HRR(data=v + n)
H.SimpleCleanUp.recall = lambda self, hrr: _ORIG_MEM_RECALL(self, _noisy(hrr))
H.SimpleAssoc.recall = ... # the same, and counts theta fallbacksThe trap 3 control is one attribute, env["assoc"].theta = 5 / sqrt(D). The E1 control rebinds their inner car in the closures of vsa_env (holis_errata.py):
def car(c, ind=""):
return orig(c) if c in assoc.A else nilPaper mode, the trap 1 experiment, is two attributes on their pointer memory (holis_cells.py):
a.memorize = lambda probe, trace: (trace.unit(), trace.unit())
a.recall = lambda probe: probeFor residuelisp I also silence its debug output, stub the decode it calls inside log messages while a program runs, reset its class-level RHC state per seed, and stop a run after a budget of cleanups. holis runs stop after a budget of cons cells (300 per small program in holis_fixes.py and holis_thresholds.py, 20 000 in holis_cells.py) or, for the fizzbuzz calls, after 60 s. Under noise its tuple_to_list loops until car raises, which can be never.
D. Raw results
holis, trap 3 lookups (all rows):
| D | mode | σ | correct | θ fallbacks |
|---|---|---|---|---|
| 512 | theirs (theta=0.2) | 0 | 200 / 200 | 0 |
| 512 | theirs (theta=0.2) | 1 | 200 / 200 | 0 |
| 512 | theirs (theta=0.2) | 2 | 196 / 200 | 0 |
| 512 | theirs (theta=0.2) | 3 | 159 / 200 | 0 |
| 512 | theirs (theta=0.2) | 4 | 103 / 200 | 26 |
| 512 | theirs (theta=0.2) | 4.5 | 48 / 200 | 75 |
| 512 | theirs (theta=0.2) | 5 | 26 / 200 | 104 |
| 512 | theirs (theta=0.2) | 5.5 | 21 / 200 | 141 |
| 512 | theirs (theta=0.2) | 6 | 9 / 200 | 160 |
| 512 | theirs (theta=0.2) | 7 | 3 / 200 | 183 |
| 512 | theirs (theta=0.2) | 8 | 5 / 200 | 191 |
| 512 | theirs (theta=0.2) | 10 | 1 / 200 | 198 |
| 512 | theirs (theta=0.2) | 12 | 1 / 200 | 200 |
| 512 | theirs (theta=0.2) | 16 | 2 / 200 | 200 |
| 512 | chance floor (theta=5/sqrt(D)) | 0 | 200 / 200 | 0 |
| 512 | chance floor (theta=5/sqrt(D)) | 1 | 200 / 200 | 0 |
| 512 | chance floor (theta=5/sqrt(D)) | 2 | 196 / 200 | 0 |
| 512 | chance floor (theta=5/sqrt(D)) | 3 | 159 / 200 | 1 |
| 512 | chance floor (theta=5/sqrt(D)) | 4 | 84 / 200 | 54 |
| 512 | chance floor (theta=5/sqrt(D)) | 4.5 | 38 / 200 | 101 |
| 512 | chance floor (theta=5/sqrt(D)) | 5 | 15 / 200 | 147 |
| 512 | chance floor (theta=5/sqrt(D)) | 5.5 | 12 / 200 | 165 |
| 512 | chance floor (theta=5/sqrt(D)) | 6 | 7 / 200 | 180 |
| 512 | chance floor (theta=5/sqrt(D)) | 7 | 2 / 200 | 194 |
| 512 | chance floor (theta=5/sqrt(D)) | 8 | 4 / 200 | 197 |
| 512 | chance floor (theta=5/sqrt(D)) | 10 | 1 / 200 | 200 |
| 512 | chance floor (theta=5/sqrt(D)) | 12 | 1 / 200 | 200 |
| 512 | chance floor (theta=5/sqrt(D)) | 16 | 2 / 200 | 200 |
| 2048 | theirs (theta=0.2) | 0 | 200 / 200 | 0 |
| 2048 | theirs (theta=0.2) | 1 | 200 / 200 | 0 |
| 2048 | theirs (theta=0.2) | 2 | 200 / 200 | 0 |
| 2048 | theirs (theta=0.2) | 3 | 200 / 200 | 0 |
| 2048 | theirs (theta=0.2) | 4 | 195 / 200 | 4 |
| 2048 | theirs (theta=0.2) | 4.5 | 164 / 200 | 37 |
| 2048 | theirs (theta=0.2) | 5 | 83 / 200 | 118 |
| 2048 | theirs (theta=0.2) | 5.5 | 31 / 200 | 165 |
| 2048 | theirs (theta=0.2) | 6 | 8 / 200 | 194 |
| 2048 | theirs (theta=0.2) | 7 | 2 / 200 | 199 |
| 2048 | theirs (theta=0.2) | 8 | 1 / 200 | 200 |
| 2048 | theirs (theta=0.2) | 10 | 0 / 200 | 200 |
| 2048 | theirs (theta=0.2) | 12 | 2 / 200 | 200 |
| 2048 | theirs (theta=0.2) | 16 | 2 / 200 | 200 |
| 2048 | chance floor (theta=5/sqrt(D)) | 0 | 200 / 200 | 0 |
| 2048 | chance floor (theta=5/sqrt(D)) | 1 | 200 / 200 | 0 |
| 2048 | chance floor (theta=5/sqrt(D)) | 2 | 200 / 200 | 0 |
| 2048 | chance floor (theta=5/sqrt(D)) | 3 | 200 / 200 | 0 |
| 2048 | chance floor (theta=5/sqrt(D)) | 4 | 199 / 200 | 0 |
| 2048 | chance floor (theta=5/sqrt(D)) | 4.5 | 199 / 200 | 0 |
| 2048 | chance floor (theta=5/sqrt(D)) | 5 | 194 / 200 | 0 |
| 2048 | chance floor (theta=5/sqrt(D)) | 5.5 | 178 / 200 | 0 |
| 2048 | chance floor (theta=5/sqrt(D)) | 6 | 165 / 200 | 0 |
| 2048 | chance floor (theta=5/sqrt(D)) | 7 | 119 / 200 | 15 |
| 2048 | chance floor (theta=5/sqrt(D)) | 8 | 91 / 200 | 46 |
| 2048 | chance floor (theta=5/sqrt(D)) | 10 | 21 / 200 | 147 |
| 2048 | chance floor (theta=5/sqrt(D)) | 12 | 8 / 200 | 179 |
| 2048 | chance floor (theta=5/sqrt(D)) | 16 | 2 / 200 | 200 |
| 8192 | theirs (theta=0.2) | 0 | 200 / 200 | 0 |
| 8192 | theirs (theta=0.2) | 1 | 200 / 200 | 0 |
| 8192 | theirs (theta=0.2) | 2 | 200 / 200 | 0 |
| 8192 | theirs (theta=0.2) | 3 | 200 / 200 | 0 |
| 8192 | theirs (theta=0.2) | 4 | 200 / 200 | 0 |
| 8192 | theirs (theta=0.2) | 4.5 | 190 / 200 | 10 |
| 8192 | theirs (theta=0.2) | 5 | 75 / 200 | 126 |
| 8192 | theirs (theta=0.2) | 5.5 | 6 / 200 | 197 |
| 8192 | theirs (theta=0.2) | 6 | 1 / 200 | 200 |
| 8192 | theirs (theta=0.2) | 7 | 1 / 200 | 200 |
| 8192 | theirs (theta=0.2) | 8 | 0 / 200 | 200 |
| 8192 | theirs (theta=0.2) | 10 | 1 / 200 | 200 |
| 8192 | theirs (theta=0.2) | 12 | 2 / 200 | 200 |
| 8192 | theirs (theta=0.2) | 16 | 2 / 200 | 200 |
| 8192 | chance floor (theta=5/sqrt(D)) | 0 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 1 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 2 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 3 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 4 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 4.5 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 5 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 5.5 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 6 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 7 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 8 | 200 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 10 | 188 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 12 | 166 / 200 | 0 |
| 8192 | chance floor (theta=5/sqrt(D)) | 16 | 83 / 200 | 46 |
holis, trap 3 program runs, with what went wrong:
| D | mode | σ | correct | errors | wrong values |
|---|---|---|---|---|---|
| 512 | theirs (theta=0.2) | 0 | 9 / 10 | ["a", "b", "LAMBDA", "x", ["CONS", "a", ["b", "c"]]] ×1 | |
| 512 | theirs (theta=0.2) | 2 | 6 / 10 | ["x", "b", "c"] ×1, ["lhs", "b", "c"] ×1, ["c", "a", ["b", "c"]] ×1, ["a", "LAMBDA", ["x", ["b", "c"]], "c"] ×1 | |
| 512 | theirs (theta=0.2) | 4 | 0 / 10 | rhs ×1, [["x"], ["rhs", "lhs"]] ×1, [["rhs", ["LAMBDA", "x"]], ["rhs", ["x", 1]]] ×1, ["LAMBDA", "CONS", [["a"], [[["LAMBDA", "T"], ["x", "F"]]]]] ×1, [[[[[["F", ["T", ["CONS", "lhs"]], "x"], "LAMBDA"], ["NIL", ×1, ["LAMBDA", "rhs"] ×1, ["lhs", ["a", "LAMBDA"]] ×1, ["LAMBDA", 1, ["NIL", "lhs"]] ×1, [[["b", ["x"], "F"], "rhs"], "lhs"] ×1, ["F", "a"] ×1 | |
| 512 | theirs (theta=0.2) | 5 | 0 / 10 | [[["CONS", "rhs"], "ATOM"], "lhs"] ×1, ["lhs", "\u03c6"] ×1, LAMBDA ×1, a ×1, ["ATOM", "EQ"] ×1, ["F", ["NIL", "x"]] ×1, ["x", "\u03c6"] ×1, ["rhs", ["a", ["b", "lhs"]]] ×1, ["LAMBDA", ["rhs", "rhs"]] ×1, ["a", 1] ×1 | |
| 512 | theirs (theta=0.2) | 6 | 0 / 10 | ["ATOM", "T"] ×1, ["CONS", "a"] ×1, ["F", "EQ"] ×1, φ ×1, ["CDR", "CONS"] ×1, LAMBDA ×2, a ×1, ["x", "\u03c6"] ×1, c ×1 | |
| 512 | theirs (theta=0.2) | 8 | 0 / 10 | a ×1, c ×3, F ×1, ["NIL", "T"] ×1, [[1], ["NIL", "x"]] ×1, LAMBDA ×1, EQ ×1, x ×1 | |
| 512 | theirs (theta=0.2) | 10 | 0 / 10 | budget ×1 | a ×2, c ×1, ["LAMBDA", "b"] ×1, lhs ×1, [["lhs", ["a", ["EQ", "T"]], "CONS"], [[[["ATOM", "a"], "LAM ×1, [[1], ["NIL", "x"]] ×1, LAMBDA ×1, x ×1 |
| 512 | chance floor (theta=5/sqrt(D)) | 0 | 9 / 10 | ["a", "b", "LAMBDA", "x", ["CONS", "a", ["b", "c"]]] ×1 | |
| 512 | chance floor (theta=5/sqrt(D)) | 2 | 6 / 10 | ["x", "b", "c"] ×1, ["lhs", "b", "c"] ×1, ["c", "a", ["b", "c"]] ×1, ["a", "LAMBDA", ["x", ["b", "c"]], "c"] ×1 | |
| 512 | chance floor (theta=5/sqrt(D)) | 4 | 0 / 10 | [["CAR", "b", "F", "CONS", "F", "lhs", [["lhs", "rhs"], ["F" ×1, ["F", "EQ"] ×1, x ×1, ["lhs", "\u03c6"] ×1, ["a", ["LAMBDA", "x"]] ×1, ["LAMBDA", "c"] ×1, a ×1, ["LAMBDA", "LAMBDA"] ×1, ["lhs", [["x"], "ATOM"]] ×1, c ×1 | |
| 512 | chance floor (theta=5/sqrt(D)) | 5 | 0 / 10 | ["lhs", ["NIL", "x"]] ×1, φ ×1, [[["CONS", "rhs"], "ATOM"], "lhs"] ×1, ["lhs", "\u03c6"] ×1, F ×1, LAMBDA ×2, a ×1, ["x", "\u03c6"] ×1, c ×1 | |
| 512 | chance floor (theta=5/sqrt(D)) | 6 | 0 / 10 | a ×1, c ×2, b ×1, LAMBDA ×2, ["ATOM", "T"] ×1, φ ×1, ["CONS", "a"] ×1, x ×1 | |
| 512 | chance floor (theta=5/sqrt(D)) | 8 | 0 / 10 | a ×2, c ×3, F ×1, ["NIL", "T"] ×1, [[1], ["NIL", "x"]] ×1, LAMBDA ×1, x ×1 | |
| 512 | chance floor (theta=5/sqrt(D)) | 10 | 0 / 10 | budget ×1 | a ×2, c ×1, ["LAMBDA", "b"] ×1, lhs ×1, EQ ×1, [[1], ["NIL", "x"]] ×1, LAMBDA ×1, x ×1 |
| 2048 | theirs (theta=0.2) | 0 | 9 / 10 | ["a", "LAMBDA", ["c"], "LAMBDA"] ×1 | |
| 2048 | theirs (theta=0.2) | 2 | 10 / 10 | ||
| 2048 | theirs (theta=0.2) | 4 | 3 / 10 | rhs ×1, ["a", ["b", "LAMBDA"]] ×1, ["T", "b", "x"] ×1, [["x", "a", ["b", "c"]], "a", ["b", "c"]] ×1, ["a", "b", 1] ×1, c ×1, [["LAMBDA", ["x"], ["CONS", "x", ["b", "c"]]], "a"] ×1 | |
| 2048 | theirs (theta=0.2) | 5 | 0 / 10 | [1, "b"] ×1, ["LAMBDA", "CONS"] ×1, CONS ×2, DEFINE ×2, ["LAMBDA", "b"] ×1, NIL ×1, φ ×1, ["T", 1] ×1 | |
| 2048 | theirs (theta=0.2) | 6 | 0 / 10 | LAMBDA ×1, rhs ×1, DEFINE ×3, b ×1, x ×2, φ ×1, a ×1 | |
| 2048 | theirs (theta=0.2) | 8 | 0 / 10 | LAMBDA ×1, rhs ×1, DEFINE ×3, b ×1, x ×2, φ ×1, a ×1 | |
| 2048 | theirs (theta=0.2) | 10 | 0 / 10 | LAMBDA ×1, rhs ×1, DEFINE ×3, b ×1, x ×2, φ ×1, a ×1 | |
| 2048 | chance floor (theta=5/sqrt(D)) | 0 | 9 / 10 | ["a", "LAMBDA", ["c"], "LAMBDA"] ×1 | |
| 2048 | chance floor (theta=5/sqrt(D)) | 2 | 10 / 10 | ||
| 2048 | chance floor (theta=5/sqrt(D)) | 4 | 10 / 10 | ||
| 2048 | chance floor (theta=5/sqrt(D)) | 5 | 7 / 10 | ["x", "b", ["x", "b", "c"]] ×1, ["c"] ×1, ["rhs", "lhs"] ×1 | |
| 2048 | chance floor (theta=5/sqrt(D)) | 6 | 0 / 10 | ["a", "x"] ×1, ["a", "b"] ×1, [["x", ["a"]], "x", ["b", "c", "c"]] ×1, ["a", "b", "c", [["a"], "a"]] ×1, [["c"], [["b", "c"]]] ×1, ["x", "a"] ×1, a ×1, ["LAMBDA", "CONS", ["CONS", ["x", [["b", [[[["x"], ["CONS", ×1, ["a", "LAMBDA"] ×1, ["LAMBDA", ["x", ["b", "c"], "b", "c"], ["c"]] ×1 | |
| 2048 | chance floor (theta=5/sqrt(D)) | 8 | 0 / 10 | T ×1, ["LAMBDA", "a"] ×1, [["DEFINE", ["CONS", [["CAR"], "CONS"]]], [["b", "F"], [["NI ×1, x ×1, [1, "DEFINE"] ×1, a ×1, ["LAMBDA", "LABEL"] ×1, [["LAMBDA", "lhs"], ["a"]] ×1, ["LAMBDA", ["rhs", ["rhs", "x"]], "c"] ×1, [[["x"], "DEFINE", "x"], ["c", [["CONS", [[[1, "T"], "a"], [ ×1 | |
| 2048 | chance floor (theta=5/sqrt(D)) | 10 | 0 / 10 | rhs ×1, [["x"], "c"] ×1, φ ×1, x ×1, CONS ×1, DEFINE ×2, LAMBDA ×1, a ×1, 1 ×1 | |
| 8192 | theirs (theta=0.2) | 0 | 7 / 10 | ["a", "LAMBDA", ["NIL", ["CONS", "a", ["b", "c"]]], [["b", " ×1, ["a", "b", "LAMBDA", "a", "lhs"] ×1, ["a", "b", "LAMBDA", "x", ["b", "c"]] ×1 | |
| 8192 | theirs (theta=0.2) | 2 | 7 / 10 | ["a", ["a", "b", "c"]] ×1, ["a", ["b", "c"]] ×1, ["LAMBDA", "b", "c"] ×1 | |
| 8192 | theirs (theta=0.2) | 4 | 8 / 10 | ["a", "rhs"] ×1, ["a", "LAMBDA", [[["b", "c"]], "a"], 1] ×1 | |
| 8192 | theirs (theta=0.2) | 5 | 0 / 10 | T ×1, ["rhs", "T"] ×1, CONS ×1, ["NIL", "F"] ×1, ["T", "CONS"] ×1, LAMBDA ×2, a ×1, NIL ×1, [1, ["F", "a"]] ×1 | |
| 8192 | theirs (theta=0.2) | 6 | 0 / 10 | rhs ×1, φ ×1, CONS ×1, lhs ×1, LAMBDA ×2, a ×1, 1 ×1, NIL ×1, c ×1 | |
| 8192 | theirs (theta=0.2) | 8 | 0 / 10 | rhs ×1, φ ×1, CONS ×1, lhs ×1, LAMBDA ×2, a ×1, 1 ×1, NIL ×1, c ×1 | |
| 8192 | theirs (theta=0.2) | 10 | 0 / 10 | rhs ×1, LAMBDA ×2, lhs ×1, c ×1, 1 ×2, CONS ×1, a ×1, φ ×1 | |
| 8192 | chance floor (theta=5/sqrt(D)) | 0 | 7 / 10 | ["a", "LAMBDA", ["NIL", ["CONS", "a", ["b", "c"]]], [["b", " ×1, ["a", "b", "LAMBDA", "a", "lhs"] ×1, ["a", "b", "LAMBDA", "x", ["b", "c"]] ×1 | |
| 8192 | chance floor (theta=5/sqrt(D)) | 2 | 7 / 10 | ["a", ["a", "b", "c"]] ×1, ["a", ["b", "c"]] ×1, ["LAMBDA", "b", "c"] ×1 | |
| 8192 | chance floor (theta=5/sqrt(D)) | 4 | 8 / 10 | ["a", "rhs"] ×1, ["a", "LAMBDA", [[["b", "c"]], "a"], 1] ×1 | |
| 8192 | chance floor (theta=5/sqrt(D)) | 5 | 8 / 10 | ["a", "c"] ×1, ["a", "LAMBDA", [[["b", "c"]], "a"], 1] ×1 | |
| 8192 | chance floor (theta=5/sqrt(D)) | 6 | 8 / 10 | ["a", "a", "b", "c"] ×1, ["a", "LAMBDA", "\u03c6", 1] ×1 | |
| 8192 | chance floor (theta=5/sqrt(D)) | 8 | 7 / 10 | ["a", "a", "b", "c"] ×1, ["a", "LAMBDA", "\u03c6", 1] ×1, ["a", ["b", "c"]] ×1 | |
| 8192 | chance floor (theta=5/sqrt(D)) | 10 | 3 / 10 | ["NIL", "a", "b", "LAMBDA", "a", [["CONS", "x", ["b", "c"]]] ×1, ["a", "LAMBDA", "\u03c6", 1] ×1, ["a", ["b", "c"]] ×1, ["b", "a"] ×1, [["a", ["b", "c"]], "b", "c"] ×1, ["a", ["c"], "c"] ×1, ["LAMBDA", "lhs", ["CONS", "a", ["b", "c"]]] ×1 |
residuelisp, trap 3 runs, with what went wrong:
| D | σ | correct | errors | wrong values |
|---|---|---|---|---|
| 500 | 0 | 10 / 10 | ||
| 500 | 1 | 10 / 10 | ||
| 500 | 2 | 7 / 10 | InterpreterError: Segmentation fault in car hehe ×3 | |
| 500 | 3 | 0 / 10 | InterpreterError: Segmentation fault in car hehe ×6, InterpreterError: Segmentation fault in cdr hehe ×2, InterpreterError: ERROR: argument number mismatch in `associate`. ×2 | |
| 500 | 4 | 0 / 10 | InterpreterError: Segmentation fault in car hehe ×7, InterpreterError: Segmentation fault in cdr hehe ×2, InterpreterError: ERROR: Tuple is not a list. ×1 | |
| 500 | 6 | 0 / 10 | InterpreterError: Segmentation fault in cdr hehe ×4, InterpreterError: Segmentation fault in car hehe ×4, Exception: TODO ×1, InterpreterError: ERROR: Expected function in `get_args`. ×1 | |
| 500 | 8 | 0 / 10 | InterpreterError: ERROR: Tuple is not a list. ×2, InterpreterError: ERROR: Expected function in `get_args`. ×1, Exception: TODO ×1, InterpreterError: Segmentation fault in car hehe ×2, InterpreterError: Segmentation fault in cdr hehe ×3, InterpreterError: ERROR: Conditional expression requires `CONSEQUENT` and `ALTERNATE`, see documen ×1 | |
| 500 | 12 | 0 / 10 | budget ×4, InterpreterError: ERROR: Expected function in `get_args`. ×2, InterpreterError: Segmentation fault in car hehe ×2, InterpreterError: ERROR: Expected function in `get_body`. ×1, InterpreterError: ERROR: Conditional expression requires `CONSEQUENT` and `ALTERNATE`, see documen ×1 | |
| 500 | 16 | 0 / 10 | budget ×7, InterpreterError: ERROR: Expected function in `get_args`. ×1, Exception: TODO ×1, InterpreterError: ERROR: Expected function in `get_body`. ×1 | |
| 500 | 24 | 0 / 10 | InterpreterError: ERROR: Conditional expression requires `CONSEQUENT` and `ALTERNATE`, see documen ×1, Exception: TODO ×4, InterpreterError: ERROR: Expected function in `get_body`. ×1, budget ×3, InterpreterError: ERROR: Expected function in `get_args`. ×1 | |
| 500 | 32 | 0 / 10 | Exception: TODO ×3, RecursionError ×2, budget ×3, InterpreterError: ERROR: Tuple is not a list. ×1, InterpreterError: ERROR: Expected function in `get_args`. ×1 | |
| 2000 | 0 | 10 / 10 | ||
| 2000 | 1 | 10 / 10 | ||
| 2000 | 2 | 10 / 10 | ||
| 2000 | 3 | 10 / 10 | ||
| 2000 | 4 | 8 / 10 | InterpreterError: ERROR: argument number mismatch in `associate`. ×1, InterpreterError: Segmentation fault in car hehe ×1 | |
| 2000 | 6 | 0 / 10 | InterpreterError: Segmentation fault in car hehe ×3, InterpreterError: ERROR: argument number mismatch in `associate`. ×5, InterpreterError: Segmentation fault in cdr hehe ×2 | |
| 2000 | 8 | 0 / 10 | InterpreterError: Segmentation fault in car hehe ×9, InterpreterError: Segmentation fault in cdr hehe ×1 | |
| 2000 | 12 | 0 / 10 | InterpreterError: ERROR: Tuple is not a list. ×3, InterpreterError: Segmentation fault in cdr hehe ×3, InterpreterError: Segmentation fault in car hehe ×2, InterpreterError: ERROR: Expected function in `get_args`. ×1, Exception: TODO ×1 | |
| 2000 | 16 | 0 / 10 | InterpreterError: ERROR: Expected function in `get_args`. ×3, InterpreterError: ERROR: Tuple is not a list. ×2, InterpreterError: Segmentation fault in cdr hehe ×2, Exception: TODO ×3 | |
| 2000 | 24 | 0 / 10 | InterpreterError: ERROR: Expected function in `get_body`. ×2, budget ×6, InterpreterError: Segmentation fault in car hehe ×1, InterpreterError: ERROR: Expected function in `get_args`. ×1 | |
| 2000 | 32 | 0 / 10 | InterpreterError: ERROR: Expected function in `get_args`. ×1, InterpreterError: Segmentation fault in car hehe ×1, InterpreterError: ERROR: Expected function in `get_body`. ×2, budget ×6 | |
| 8000 | 0 | 10 / 10 | ||
| 8000 | 1 | 10 / 10 | ||
| 8000 | 2 | 10 / 10 | ||
| 8000 | 3 | 10 / 10 | ||
| 8000 | 4 | 10 / 10 | ||
| 8000 | 6 | 10 / 10 | ||
| 8000 | 8 | 9 / 10 | InterpreterError: Segmentation fault in car hehe ×1 | |
| 8000 | 12 | 1 / 10 | InterpreterError: Segmentation fault in car hehe ×6, InterpreterError: ERROR: argument number mismatch in `associate`. ×2, InterpreterError: Segmentation fault in cdr hehe ×1 | |
| 8000 | 16 | 0 / 10 | InterpreterError: Segmentation fault in car hehe ×7, InterpreterError: ERROR: argument number mismatch in `associate`. ×1, InterpreterError: Segmentation fault in cdr hehe ×2 | |
| 8000 | 24 | 0 / 10 | InterpreterError: Segmentation fault in cdr hehe ×4, InterpreterError: Segmentation fault in car hehe ×6 | |
| 8000 | 32 | 0 / 10 | InterpreterError: Segmentation fault in cdr hehe ×2, InterpreterError: Segmentation fault in car hehe ×3, budget ×2, InterpreterError: ERROR: Tuple is not a list. ×2, InterpreterError: ERROR: Expected function in `get_args`. ×1 |
Generated by Claude on Benjamin Schwerdtner’s behalf.
source: notebooks/holis_reproduction.clj