13 The anchor: stasis and growth
(ns meme-constructor.posts.post-04-anchor-stasis-growth
(:require [scicloj.kindly.v4.kind :as kind]
[meme-constructor.population :as pop]
[meme-constructor.figures :as fig]))Post 4 of the series Memes as Abstract Constructors.
Whether error correction keeps a tradition as it is or lets it grow is decided by the anchor of the ranking by which variants are kept. If the ranking depends on the meme or its hosts, the content is blind to reality: it would change in exactly the same way in any other world. If the ranking is the same for every meme and every host, the content follows reality. Fidelity is a separate axis, and so is transport: a faithful tradition can learn nothing, and a rational criterion can be undone by who gets copied.
- the ranking depends on the meme or its hosts
- the content is blind to reality
- it would change the same way in any world
- the ranking is the same for every meme and host
- the content follows reality
- fidelity: a faithful tradition can learn nothing
- transport: who gets copied can undo a rational criterion
Rational and anti-rational memes (Deutsch). The two terms come from chapter 15 of The Beginning of Infinity, “The Evolution of Culture”. Deutsch starts from memes that arose after the Enlightenment through criticism:
“Thus, memes of this new kind, which are created by rational and critical thought, subsequently also depend on such thought to get themselves replicated faithfully. So I shall call them rational memes. Memes of the older, static-society kind, which survive by disabling their holders’ critical faculties, I shall call anti-rational memes.” (Deutsch 2011, ch. 15)
A static society is, in his words, a society “changing on a timescale unnoticed by the inhabitants”. He argues that the two kinds of meme differ as much from each other as from genes: “Rational and anti-rational memes have sharply differing properties, originating in their fundamentally different replication strategies.” And they move in opposite directions: “just as rational memes evolve towards deep truths, anti-rational memes evolve away from them.”
“Disabling critical faculties” cannot be literally right, because copying the function of a culture meme needs the host’s creativity: the receiver rebuilds the function from reasons, and no alphabet of concepts carries it (see the introduction). Both kinds of culture meme use creativity and both correct errors. Ape memes, whose repertoire a string on the closed level fixes, are not in question here: they are copied digitally and need no anchor to be copied accurately. We propose that they differ in the anchor, make this precise as criterion and anchor (F8) and fitness and stasis (F9), and test it in a toy population model, the stasis experiment (E10). The distinction is Deutsch’s. The framing by the anchor, and the model, are ours.
13.1 1. Criterion and anchor
When a host reconstructs a meme m, it produces candidate variants and keeps or discards them. Marletto (2015, §3.1) notes that a recipe must contain information that informs “the criterion for error detection and correction”. Write V for the set of variants of a meme and H for the hosts that carry m.
Definition 4.1 (Criterion). A criterion for copying m in hosts H is a map \(c_{m,H} : V \to \{\text{keep}, \text{discard}\}\). We consider comparison criteria: there is a ranking \(\succeq_{m,H}\) on V (a total preorder, so ties are allowed), and a candidate x is kept iff \(x \succeq_{m,H} m\).
A scientist keeps a new theory if it does better than the old one, and the old one is m.
- internal if c depends on m
- but every copying criterion compares a candidate with m
- does the ranking change when m or H change?
- used by the criterion: which candidate a host keeps
- used by transmission: which host gets copied
Definition 4.2 (Anchor). A ranking used in keeping variants, by the criterion or by transmission, has an internal anchor if it depends counterfactually on m or on its hosts: for some m′ or H′, \(\succeq_{m',H} \ne \succeq_{m,H}\) or \(\succeq_{m,H'} \ne \succeq_{m,H}\). It has an external anchor if it is the same for every m and every H. If the ranking is lexicographic, \((f_1, f_2)\), and only \(f_1\) is independent of m and H, the anchor is primarily external.
Three criteria, which the model below implements, and two ways of picking parents:
\(c_\text{anti}\) works like “Doubt is sin”: any deviation from the received version is an error. \(F_\text{psy}\) is how well a variant uses the hosts’ psychology (section 2). Parents picked by \(F_\text{psy}\) are studied in section 5. Parents picked by \(F_\text{real}\) are what the reflexive-criterion experiment (X5) of post I.6 uses.
Criticism by other ideas. De la Guardia (2020) locates the power of thought in the fact that ideas constrain one another: “the need for logical consistency subjects each of our ideas to tremendous selection pressure from other ideas.” That is selection inside the mind, and read naively our account would call it internal. It is not internal relative to the meme under test, and that is the notion it needs. It is weaker than Definition 4.2: Q differs from host to host, so the ranking may depend on H.
Definition 4.3 (Criticism by other ideas). Let a host hold a set of ideas Q and keep x iff x is consistent with Q. This criticism is externally anchored relative to m if Q is counterfactually independent of m: each idea in Q would be held, and has been tested, whether or not m is held. It is externally anchored in the sense of Definition 4.2 if in addition the ranking by consistency with Q is the same for every host H′.
- in the host's mind
- held because of a test, not because of m
- in the host's mind
- held because the tradition is held
“External” does not mean “outside the head”. Relative to m it means independent of the meme under test.
Criteria are ideas too. In people the criterion is not fixed. It is an idea like the others, copied with errors and criticised. Post I.6 calls this reflexivity (C8) and studies it on this post’s model: what a criterion in the medium does to keeping (Proposition I.6.2), what happens without an anchor, and how it compares with a fixed criterion that has the right tests (Observations I.6.8 and I.6.9). The model of this post keeps the criterion fixed. That hides a cost. A fixed criterion knows which facts bear on a candidate. An open one must conjecture it, which is the frame problem in the broad sense philosophers gave to McCarthy and Hayes’s (1969) narrower problem.
13.2 2. Two fitness components
Definition 4.5 (Fitness components). \(F_\text{psy}(m)\) measures how well m uses the psychology of its hosts for the copy task \(C_m\): memorability, emotional charge, the levers of fear, shame and belonging. \(F_\text{real}(m)\) measures how well m survives criticism that refers to what it is about. Rational selection ranks \(F_\text{real}\) first and breaks ties by \(F_\text{psy}\), optionally with a transport threshold \(F_\text{psy}(x) \ge \tau\) below which a variant cannot be passed on at all.
A mind virus, in our structural sense, is a meme selected on \(F_\text{psy}\) alone, so that its selection is decoupled from what it is about. The name is Dawkins’ (1993). The structural reading is ours.
- memorability, emotional charge
- the levers of fear, shame and belonging
- survival of criticism that refers to what m is about
- rank by F_real
- break ties by F_psy
- optional threshold F_psy ≥ τ
- rank by F_psy alone
- selection decoupled from content
13.3 3. The toy model
The model lives in meme-constructor.population, which posts 5 and 6 reuse. Its namespace docstring documents the API.
It models the open level of culture memes, the function. A child shares no alphabet of concepts with its parent. It rebuilds the parent’s variant from evidence, with error, and the criterion decides which reconstruction it keeps. The model sees both variants, so it can count the copies that are exact. A real host cannot confirm that a copy is exact. The closed level is outside the model: parsing into a digital alphabet makes copies on it arbitrarily accurate, so an ape meme has no reconstruction error for a criterion to act on.
Definition 4.6 (Toy world).
- Variants. A variant is a set of tasks from a universe of 50, stored as a bitmask and cut into 10 blocks of 5 tasks.
- Reality. Four blocks are small points. Each has a hidden pattern and scores 4 only if the block matches it exactly, so every single-task change of the right pattern scores 0. This is “hard to vary” (Deutsch 2011, ch. 1) and the small points of De la Guardia (2020, 2025c). Two blocks are clouds, rules of thumb, scoring \(2\min(1, k/3)\) for k of their tasks present, so most patterns sit on a plateau. \(F_\text{real}\) is the sum, at most 20. Hosts never see it directly.
- Psychology. Two blocks are lever tasks, and \(F_\text{psy}(m) = (\text{levers in } m)/10 - 0.3\,|m|/50\). The second term is a memorability cost of size. The last two blocks are neutral.
- Copying. A child reconstructs its parent’s variant from noisy evidence. Per block, with probability 0.05 it conjectures the whole block afresh, a uniform jump that needs no ridge of intermediate steps. Otherwise each task of the parent is missed with probability 0.02 (source of \(\varepsilon^-\)) and each other task is added with probability 0.01 (source of \(\varepsilon^+\)). We chose blocks of 5 and jumps of 0.05 after a first choice (blocks of 6, jumps of 0.02) grew too slowly to see, so growth rates below are set by these parameters, not predicted.
- Criterion. The child makes up to 50 reconstructions and keeps the first one the criterion keeps, else the best-ranked one. This fallback never fired in the runs reported.
- Transmission. Each of N = 60 children picks a parent from the previous generation, uniformly unless stated otherwise. With psy-bias β > 0 the parent is picked with weight \(e^{\beta F_\text{psy}}\).
\(c_\text{anti}\) has a lever strength d: each deviating task is noticed with probability d, and the candidate is kept only if nothing is noticed. \(c_\text{rat}\) tests \(F_\text{real}\), optionally with Gaussian test noise σ. \(c_\text{none}\) keeps everything: pure copying noise.
(def landscape (pop/make-landscape {:block-size 5 :seed 1}))(def tradition
;; one small point found, both clouds on their plateau, half the levers
(pop/tradition landscape {:n-points 1 :n-clouds 2 :psy-bits 5}))(def copy-noise {:p-loss 0.02 :p-gain 0.01 :p-jump 0.05})(def base-params
{:landscape landscape :init tradition :copy copy-noise
:n-agents 60 :generations 400 :max-attempts 50})(mapv (juxt :index :type) (:blocks landscape))[[0 :neutral]
[1 :point]
[2 :cloud]
[3 :point]
[4 :psy]
[5 :neutral]
[6 :cloud]
[7 :point]
[8 :point]
[9 :psy]]The tradition everyone starts with:
{:tasks (pop/variant->tasks tradition)
:f-real (pop/f-real landscape tradition)
:f-psy (pop/f-psy landscape tradition)}{:tasks #{6 7 9 10 11 12 20 21 22 23 24 30 31 32},
:f-real 8.0,
:f-psy 0.416}A helper runs one condition for several seeds and keeps only the summaries.
(defn digest [params]
(let [h (pop/run params)]
{:summary (pop/summary h) :copy (pop/copy-stats h)}))(defn run-seeds [params seeds]
(mapv #(digest (assoc params :seed %)) seeds))(def seeds [1 2 3 4 5])13.4 4. What can be proved in the toy
For the proofs, a host retries until the criterion keeps a reconstruction. This ends with probability 1 whenever an exact copy is acceptable, since an exact copy has positive probability in every attempt. With d = 1, \(c_\text{anti}\) keeps a candidate iff it equals the parent, so every copy is exact and nothing new ever appears. Improvements are lost not because they are bad but because they are deviations.
The central fact is the next one.
Proposition 4.2 (Reality blindness). Suppose neither the criterion nor the parent weights refer to \(F_\text{real}\). This holds for \(c_\text{anti}\) with any d, for \(c_\text{psy}\) and for \(c_\text{none}\), with any β. Then the law of the whole variant process is the same for every reality. Replacing the hidden patterns of the small points by other patterns leaves every trajectory unchanged, seed for seed.
Proof. The transition from one generation to the next is built from the copy noise, the criterion and the parent weights. None of them contains \(F_\text{real}\). With the same seed the same random numbers are drawn and the same variants result. ∎
The test suite checks this seed for seed. Under an internal anchor \(F_\text{real}\) may rise or fall, but it would do the same in any other world, so its changes carry no information about the world. This is what makes the counterfactual tests below and in post 5 sharp.
Proposition 4.3 (Ergodic drift). Under \(c_\text{anti}\) with d < 1, under \(c_\text{psy}\) and under \(c_\text{none}\), the population is a finite Markov chain in which every state can follow every state. So the long-run distribution of \(\bar F_\text{real}\) does not depend on the starting tradition.
Proof. Every child can pick any parent, every variant has positive probability as a reconstruction, and with d < 1 every candidate is kept with probability at least \((1-d)^{50} > 0\). A finite chain with all transitions positive has a unique stationary distribution and converges to it from any start. ∎
So stasis is not stationarity. With imperfect levers the tradition is forgotten in the long run. Only d = 1 gives strict stasis.
Proposition 4.4 (Growth under an external anchor). Assume \(c_\text{rat}\) and
- the exact-test assumption (G1): no test noise, σ = 0;
- the transport assumption (G2): a transport threshold τ at or below \(F_\text{psy}\) of the initial tradition;
- the unbounded-attempts assumption (G3): unbounded attempts;
- the non-degeneracy assumption (G4): loss, gain and jump probabilities strictly between 0 and 1.
Then (1) along every line of descent \(F_\text{real}\) never decreases; (2) with uniform parent choice (β = 0) the mean rises in expectation,
\[E[\bar F_\text{real}(t+1) \mid \text{state at } t] \ge \bar F_\text{real}(t),\]
strictly unless every host has the maximum over the transportable variants; (3) every line of descent reaches that maximum in finite time with probability 1.
Proof. (1) The exact test keeps only candidates that rank at least as high as the parent. The exact copy is transportable, so the retry loop ends. (2) Each child’s expected \(F_\text{real}\) is at least its parent’s, and under uniform choice the expected parent is the mean host. Below the maximum, full support gives a strictly better first acceptable reconstruction positive probability. (3) Finitely many variants give a uniform δ > 0 of strict improvement per step. ∎
The proposition is cheap. Part 3 follows from full support and gives no time bound; the jumps are what make the points reachable in practice. Part 2 needs β = 0, and section 5 shows it fail without. Parts 1 and 3 use no population at all: growth under \(c_\text{rat}\) comes from the criterion in each copy, not from competition among hosts. Nor does a population find isolated points faster than a single climber on this kind of model (post I.5, Observation I.5.8).
13.5 5. The stasis experiment (E10)
Prediction: stasis or reality-blind drift under an internal anchor, growth under an external one. We first set the refutation condition as “growth under \(c_\text{anti}\)”. After the run we reformulated it, because reality-blind drift from an empty start met it literally (see Observation 4.8): the condition now is that \(F_\text{real}\) under \(c_\text{anti}\) tracks reality. By Proposition 4.2 that cannot occur in this model.
(def e10-conditions
[["c_anti, d = 1" {:kind :anti :detect 1.0} "#1f77b4"]
["c_anti, d = 0.9" {:kind :anti :detect 0.9} "#17becf"]
["c_rat" {:kind :rat} "#d62728"]
["c_none (noise only)" {:kind :none} "#7f7f7f"]])(def e10
(into {}
(for [[nm crit _] e10-conditions]
[nm (run-seeds (assoc base-params :criterion crit) seeds)])))(defn series [summary k]
{:x (mapv :gen summary) :y (mapv k summary)})(kind/plotly
{:data (vec (for [[nm _ colour] e10-conditions
[i d] (map-indexed vector (e10 nm))]
(merge (series (:summary d) :mean-f-real)
{:type "scatter" :mode "lines" :name nm
:legendgroup nm :showlegend (zero? i)
:line {:color colour :width 1.5}
:opacity 0.75})))
:layout {:title "Mean F_real per generation, five seeds per criterion"
:xaxis {:title "generation"}
:yaxis {:title "mean F_real" :range [0 21]}
:height 450}})(defn final-means [digests k]
(let [xs (map #(k (peek (:summary %))) digests)]
{:mean (/ (reduce + xs) (count xs)) :min (apply min xs) :max (apply max xs)}))(into {} (for [[nm _ _] e10-conditions]
[nm (final-means (e10 nm) :mean-f-real)])){"c_anti, d = 1" {:mean 8.0, :min 8.0, :max 8.0},
"c_anti, d = 0.9"
{:mean 4.308888888888889,
:min 2.655555555555556,
:max 7.011111111111109},
"c_rat"
{:mean 17.866666666666667, :min 14.266666666666667, :max 20.0},
"c_none (noise only)"
{:mean 3.2422222222222223,
:min 3.1333333333333337,
:max 3.38888888888889}}Observation 4.5. Seeds 1 to 5, generation 400, from a start of 8:
Part 1 of Proposition 4.4 holds on the records: no \(c_\text{rat}\) copy has lower \(F_\text{real}\) than its parent. The realised mean can still dip when a lucky lineage dies out by drift; the proposition bounds the expectation.
(into {} (for [[nm _ _] e10-conditions]
[nm {:lineage-decreases (reduce + (map #(get-in % [:copy :lineage-decreases]) (e10 nm)))
:fallback-rate (reduce max (map #(get-in % [:copy :fallback-rate]) (e10 nm)))}])){"c_anti, d = 1" {:lineage-decreases 0, :fallback-rate 0.0},
"c_anti, d = 0.9" {:lineage-decreases 1450, :fallback-rate 0.0},
"c_rat" {:lineage-decreases 0, :fallback-rate 0.0},
"c_none (noise only)" {:lineage-decreases 11920, :fallback-rate 0.0}}13.5.1 Fidelity is not growth
Sperber (1996) objects that cultural transmission changes content at almost every step, so there is reconstruction towards attractors rather than replication, and without high fidelity there can be no cumulative selection. On the closed level, and for ape memes, the attractors are, by the conjecture of post 1, the symbols of the fixed alphabet, and copying is digital and accurate (post 1). For the function of culture memes, which is rebuilt from reasons, the copy is a reconstruction, which converges only where the content is hard to vary. Here the model separates the two things this objection runs together. Fidelity is the share of copies that are exact, \(\varepsilon^- = \varepsilon^+ = \emptyset\). Growth is the change of \(\bar F_\text{real}\). The sweep varies the lever strength d of \(c_\text{anti}\) and the test noise σ of \(c_\text{rat}\); seeds 1 to 3, 300 generations.
(def sweep-conditions
(concat
(for [d [0.5 0.8 0.9 0.95 0.99 1.0]]
[(str "c_anti d=" d) {:kind :anti :detect d} "c_anti"])
(for [s [0.0 1.0 2.0 3.0]]
[(str "c_rat σ=" s) {:kind :rat :test-noise s} "c_rat"])
[["c_psy" {:kind :psy} "c_psy"]
["c_none" {:kind :none} "c_none"]]))(def sweep
(vec (for [[nm crit group] sweep-conditions
:let [ds (run-seeds (assoc base-params :criterion crit :generations 300) [1 2 3])]]
{:name nm :group group
:fidelity (/ (reduce + (map #(get-in % [:copy :exact-rate]) ds)) 3.0)
:max-fallback-rate (reduce max (map #(get-in % [:copy :fallback-rate]) ds))
:mean-eps (/ (reduce + (map #(+ (get-in % [:copy :mean-loss])
(get-in % [:copy :mean-gain])) ds)) 3.0)
:growth (/ (reduce + (map #(- (:mean-f-real (peek (:summary %)))
(:mean-f-real (first (:summary %)))) ds)) 3.0)})))(kind/plotly
{:data (vec (for [[group colour] [["c_anti" "#1f77b4"] ["c_rat" "#d62728"]
["c_psy" "#9467bd"] ["c_none" "#7f7f7f"]]
:let [pts (filter #(= group (:group %)) sweep)]]
{:type "scatter" :mode "markers+text" :name group
:x (mapv :fidelity pts) :y (mapv :growth pts)
:text (mapv #(let [n (:name %)] (if (> (count n) (count group)) (subs n (inc (count group))) "")) pts)
:textposition "top center"
:marker {:size 10 :color colour}}))
:layout {:title "Fidelity against growth (seeds 1-3, 300 generations)"
:xaxis {:title "fidelity: fraction of exact copies" :range [0.2 1.05]}
:yaxis {:title "change of mean F_real"}
:height 450}})(mapv #(update-vals % (fn [v] (if (double? v) (/ (Math/round (* 1000 v)) 1000.0) v))) sweep)[{:name "c_anti d=0.5",
:group "c_anti",
:fidelity 0.633,
:max-fallback-rate 0.0,
:mean-eps 0.554,
:growth -4.996}
{:name "c_anti d=0.8",
:group "c_anti",
:fidelity 0.853,
:max-fallback-rate 0.0,
:mean-eps 0.168,
:growth -4.952}
{:name "c_anti d=0.9",
:group "c_anti",
:fidelity 0.925,
:max-fallback-rate 0.0,
:mean-eps 0.081,
:growth -4.448}
{:name "c_anti d=0.95",
:group "c_anti",
:fidelity 0.962,
:max-fallback-rate 0.0,
:mean-eps 0.039,
:growth -3.059}
{:name "c_anti d=0.99",
:group "c_anti",
:fidelity 0.993,
:max-fallback-rate 0.0,
:mean-eps 0.007,
:growth -0.681}
{:name "c_anti d=1.0",
:group "c_anti",
:fidelity 1.0,
:max-fallback-rate 0.0,
:mean-eps 0.0,
:growth 0.0}
{:name "c_rat σ=0.0",
:group "c_rat",
:fidelity 0.924,
:max-fallback-rate 0.0,
:mean-eps 0.187,
:growth 9.841}
{:name "c_rat σ=1.0",
:group "c_rat",
:fidelity 0.403,
:max-fallback-rate 0.0,
:mean-eps 1.452,
:growth 7.715}
{:name "c_rat σ=2.0",
:group "c_rat",
:fidelity 0.325,
:max-fallback-rate 0.0,
:mean-eps 1.783,
:growth 1.0}
{:name "c_rat σ=3.0",
:group "c_rat",
:fidelity 0.306,
:max-fallback-rate 0.0,
:mean-eps 1.877,
:growth -2.841}
{:name "c_psy",
:group "c_psy",
:fidelity 0.913,
:max-fallback-rate 0.0,
:mean-eps 0.174,
:growth -8.0}
{:name "c_none",
:group "c_none",
:fidelity 0.296,
:max-fallback-rate 0.0,
:mean-eps 1.931,
:growth -4.452}]Observation 4.6. Seeds 1 to 3, in the figure below. No \(c_\text{anti}\) setting grows, though d = 0.9 copies about as faithfully as noise-free \(c_\text{rat}\). Test noise σ = 1 is a quarter of the value of one point.
- transmission changes content at almost every step
- so without high fidelity, no cumulative selection
- right: reconstruction is pulled somewhere
- growth is decided by where the pull is anchored
- and by whether the test resolves the differences that matter
13.5.2 The mind virus
Now the criterion is \(c_\text{psy}\). Same start, seeds 1 to 5.
(def e10-psy (run-seeds (assoc base-params :criterion {:kind :psy}) seeds))(defn mean-series [digests k]
(let [n (count digests)
ss (map :summary digests)]
{:x (mapv :gen (first ss))
:y (apply mapv (fn [& xs] (/ (reduce + xs) n)) (map #(map k %) ss))}))(kind/plotly
{:data [(merge (mean-series e10-psy :mean-f-real)
{:type "scatter" :mode "lines" :name "c_psy: F_real"
:line {:color "#9467bd"}})
(merge (mean-series e10-psy :mean-f-psy)
{:type "scatter" :mode "lines" :name "c_psy: F_psy" :yaxis "y2"
:line {:color "#9467bd" :dash "dot"}})
(merge (mean-series (e10 "c_rat") :mean-f-real)
{:type "scatter" :mode "lines" :name "c_rat: F_real"
:line {:color "#d62728"}})
(merge (mean-series (e10 "c_rat") :mean-f-psy)
{:type "scatter" :mode "lines" :name "c_rat: F_psy" :yaxis "y2"
:line {:color "#d62728" :dash "dot"}})]
:layout {:title "Mind virus: selection on F_psy alone (mean of seeds 1-5)"
:xaxis {:title "generation"}
:yaxis {:title "mean F_real (solid)" :range [0 21]}
:yaxis2 {:title "mean F_psy (dotted)" :overlaying "y" :side "right"
:range [0 1.05]}
:legend {:x 0.02 :y 0.55}
:height 450}}){:c-psy {:f-real (final-means e10-psy :mean-f-real)
:f-psy (final-means e10-psy :mean-f-psy)
:fidelity (/ (reduce + (map #(get-in % [:copy :exact-rate]) e10-psy)) 5.0)}
:c-rat {:f-real (final-means (e10 "c_rat") :mean-f-real)
:f-psy (final-means (e10 "c_rat") :mean-f-psy)}}{:c-psy
{:f-real {:mean 0.0, :min 0.0, :max 0.0},
:f-psy
{:mean 0.9399999999999993,
:min 0.9399999999999993,
:max 0.9399999999999993},
:fidelity 0.933225},
:c-rat
{:f-real
{:mean 17.866666666666667, :min 14.266666666666667, :max 20.0},
:f-psy
{:mean 0.8392800000000007,
:min 0.8210666666666673,
:max 0.8500000000000009}}}Observation 4.7. Seeds 1 to 5, generation 400:
- F_psy climbs to about 0.94: ten levers and nothing else
- F_real falls to 0 in every seed
- fidelity above 0.9
- F_real rises to about 17.9
- F_psy rises to about 0.84, because it breaks ties
- and stays lower, because content costs memorability
The meme under \(c_\text{psy}\) becomes a pure lever: easy to pass on, about nothing. That \(c_\text{psy}\) deletes content rather than letting it drift comes from the size cost in our \(F_\text{psy}\). It is not a general result.
13.5.3 Does the content track reality?
By Proposition 4.2, under an internal anchor the content would be the same in any world. Under an external anchor it should follow whatever world the criterion tests against. We build a counterfactual reality, the same blocks and psychology with new hidden patterns for the four points, let \(c_\text{rat}\) test against it, and score the result against both.
(def alt-landscape (pop/counterfactual-reality landscape 99))(def counterfactual
(let [runs (fn [land crit init]
(mapv #(pop/run (assoc base-params :landscape land :criterion crit
:init init :seed %))
seeds))
score (fn [hs land]
(/ (reduce + (for [h hs]
(let [g (peek (:generations h))]
(/ (reduce + (map #(pop/f-real land (:variant %)) g))
(count g)))))
(count hs)))
row (fn [label land crit init]
(let [hs (runs land crit init)]
{:condition label
:scored-against-true (score hs landscape)
:scored-against-counterfactual (score hs alt-landscape)}))]
[(row "c_rat tested against true reality" landscape {:kind :rat} tradition)
(row "c_rat tested against counterfactual" alt-landscape {:kind :rat} tradition)
(row "c_anti d=0.9 from empty meme" landscape {:kind :anti :detect 0.9} 0)]))(kind/plotly
{:data [{:type "bar" :name "scored against true reality"
:x (mapv :condition counterfactual)
:y (mapv :scored-against-true counterfactual)
:marker {:color "#d62728"}}
{:type "bar" :name "scored against counterfactual reality"
:x (mapv :condition counterfactual)
:y (mapv :scored-against-counterfactual counterfactual)
:marker {:color "#ff9896"}}]
:layout {:title "Mean F_real at generation 400 (seeds 1-5)"
:barmode "group" :yaxis {:title "mean F_real" :range [0 21]}
:height 420}})counterfactual[{:condition "c_rat tested against true reality",
:scored-against-true 17.866666666666667,
:scored-against-counterfactual 4.0}
{:condition "c_rat tested against counterfactual",
:scored-against-true 3.9844444444444447,
:scored-against-counterfactual 18.797777777777778}
{:condition "c_anti d=0.9 from empty meme",
:scored-against-true 1.8977777777777778,
:scored-against-counterfactual 1.6844444444444449}]Observation 4.8. Seeds 1 to 5, generation 400:
A rational meme is partly stored in the world. \(c_\text{anti}\) with d = 0.9, started from the empty meme, rises from 0 to about 2 and scores about the same on both realities. That is the literal “growth under \(c_\text{anti}\)” of the first refutation condition, and it is drift towards the stationary level of Proposition 4.3, the same in any world.
13.5.4 Transport is not neutral
So far parents were picked uniformly. Now they are picked with weight \(e^{\beta F_\text{psy}}\), under noise-free \(c_\text{rat}\). The criterion still ranks \(F_\text{real}\) first. Only transmission changes, and its anchor is internal.
(def transport
(vec (for [b [0.0 1.0 3.0 10.0]
:let [ds (run-seeds (assoc base-params :criterion {:kind :rat} :psy-bias b) seeds)]]
{:psy-bias b
:f-real (:mean (final-means ds :mean-f-real))
:f-psy (:mean (final-means ds :mean-f-psy))
:size (:mean (final-means ds :mean-size))
:lineage-decreases (reduce + (map #(get-in % [:copy :lineage-decreases]) ds))})))(kind/plotly
{:data [{:type "scatter" :mode "lines+markers" :name "mean F_real at generation 400"
:x (mapv :psy-bias transport) :y (mapv :f-real transport)
:line {:color "#d62728"}}]
:layout {:title "c_rat with parents picked by F_psy (seeds 1-5)"
:xaxis {:title "psy-bias β" :type "log"}
:yaxis {:title "mean F_real" :range [0 21]}
:height 380}})transport[{:psy-bias 0.0,
:f-real 17.866666666666667,
:f-psy 0.8392800000000007,
:size 23.78666666666667,
:lineage-decreases 0}
{:psy-bias 1.0,
:f-real 12.988888888888889,
:f-psy 0.8698533333333339,
:size 21.580000000000002,
:lineage-decreases 0}
{:psy-bias 3.0,
:f-real 9.606666666666667,
:f-psy 0.8787666666666674,
:size 19.81666666666667,
:lineage-decreases 0}
{:psy-bias 10.0,
:f-real 8.635555555555554,
:f-psy 0.8823333333333341,
:size 19.333333333333336,
:lineage-decreases 0}]Observation 4.9. Seeds 1 to 5, 400 generations, from a start of 8:
No line of descent ever loses \(F_\text{real}\): the criterion works in every single copy. What changes is who gets copied.
- ranks F_real first
- copies do not get worse
- Price: positive transmission term
- ranks F_psy first
- the population need not improve
- Price: negative covariance term
One might think that for rational memes psychology is only the transport. It is not neutral: a primarily external criterion guarantees that copies do not get worse, not that the population improves. The Price terms are Price’s (1970), and post 6 measures both.
13.6 6. Static and dynamic society
Deutsch (2011, ch. 15) contrasts static and dynamic societies. In the model they are the two kinds of anchor.
- strong levers: nothing new survives
- weaker levers: drift, blind to reality
- either way no growth tracks reality
- a sharp test
- transport that does not work against content
- gains kept, losses rejected: the content climbs to the points
In a static society the task “improve the meme” is not physically impossible but made impossible, because no criterion tells an improvement from an error. In the model this is literal: the copy noise produces improvements, and \(c_\text{anti}\) throws them away.
Popper’s (1945) open society, read in this frame, anchors error correction externally and keeps its criteria open to criticism. The second half is reflexivity (C8), and post I.6 found on this model that it needs the first: a criterion in the medium without an external anchor lost the content.
The stasis results are true by construction once the criterion is fixed. Their empirical content lies in the claim that anti-rational traditions work with criteria like \(c_\text{anti}\) or \(c_\text{psy}\), and that claim is not tested here.
13.7 Summary
- The anchor is a property of a ranking, not of the keep/discard map. It applies to the criterion and to transmission alike. External means independent of the meme and its carriers; criticism by other ideas is external relative to the meme if those ideas were tested independently of it, and external in the full sense if it is also the same for every host.
- Under an internal anchor the content is blind to reality: every trajectory would be the same in any other world (Proposition 4.2). With imperfect levers it also forgets where it started.
- Under \(c_\text{rat}\) with an exact test no line of descent loses \(F_\text{real}\). In the stasis experiment (E10) the mean rose from 8 to about 18 of 20, and against a counterfactual reality the content followed that reality.
- Fidelity and growth are separate axes: an anti-rational population copies as faithfully as a rational one and does not grow.
- Transport is not neutral: parent choice by psychology stalls growth although every copy obeys the rational criterion.
13.8 Open problems
A test of the first would compare what the independent branches of a tradition keep constant (post 5, post 7).
13.9 References
- Dawkins, R. (1993). Viruses of the mind. In B. Dahlbom (ed.), Dennett and His Critics, 13–27. Blackwell. (not re-checked)
- De la Guardia, C. (2020). Conflicting ideas are the engines of thought. Making Minds and Making Progress (Substack), 13 February 2020. https://carlosd.substack.com/p/true-vs-useful (verified; the quotation checked against the page)
- De la Guardia, C. (2025c). Are good ideas rare? Making Minds and Making Progress (Substack), 2 June 2025. https://carlosd.substack.com/p/rare (not re-checked)
- Deutsch, D. (2011). The Beginning of Infinity. Allen Lane. Ch. 1, 15. (the ch. 15 quotations verified against the chapter text; otherwise not re-checked)
- Marletto, C. (2015). Constructor theory of life. J. R. Soc. Interface 12: 20141226. §3.1. (not re-checked)
- McCarthy, J. & Hayes, P. J. (1969). Some philosophical problems from the standpoint of artificial intelligence. In B. Meltzer & D. Michie (eds.), Machine Intelligence 4. Edinburgh University Press. (verified)
- Popper, K. R. (1945). The Open Society and Its Enemies, 2 vols. Routledge. (verified)
- Price, G. R. (1970). Selection and covariance. Nature 227, 520–521. (verified)
- Sperber, D. (1996). Explaining Culture: A Naturalistic Approach. Blackwell. (not re-checked)
source: book2/notebooks/meme_constructor/posts/post_04_anchor_stasis_growth.clj