RealityModels

Censimento delle macchine di Turing

Censimento interattivo di tutte le piccole macchine di Turing: ogni macchina parte dal nastro vuoto e si contano gli output di quelle che si fermano. Le frequenze approssimano la probabilità algoritmica, la distribuzione universale di Solomonoff e Levin. Non ha dipendenze e funziona offline.

Si apre con un doppio clic su simulations/foundations/turing-census/index.html (o da qualsiasi server statico), senza installare nulla. Teoria e bibliografia: algorithmic-probability-theory.it.md; versione inglese: algorithmic-probability-simulation-guide.en.md.

Idea

Si prendono tutte le macchine di Turing con n stati e 2 simboli, si esegue ciascuna su un nastro di zeri e, quando si ferma, si registra la stringa delle celle visitate. Nessuna stringa è privilegiata in partenza: ogni macchina conta esattamente una volta. Il risultato però è fortemente ordinato. Le stringhe corte escono da molte più macchine di quelle lunghe e, a parità di lunghezza, le stringhe regolari battono quelle irregolari. La quota di macchine che produce una stringa x approssima la sua probabilità algoritmica m(x), e −log₂(quota) approssima la sua complessità di Kolmogorov in bit. La simulazione mostra questa gerarchia mentre si costruisce, con il solo contare.

Le macchine

Stati nMacchineModalitàLimite di passi S(n)
220.736enumerazione completa6
316.777.216enumerazione completa21
425.600.000.000campione casuale con seme107

Il censimento procede a piccole fette, così la pagina resta reattiva: 2 stati finiscono subito, 3 stati richiedono qualche secondo, con 4 stati la durata dipende dalla dimensione del campione. Il pulsante Esecuzione mette in pausa e riprende.

Parametri e query string

ParametroQueryIntervalloDefault
Stati nn2–42
Seme casuale (solo 4 stati)seed0–999991
Macchine campionate (solo 4 stati)samples100000–100000001000000
Scalascalelin, loglin
Lingualangit, enbrowser

Esempio: index.html?n=3&scale=log.

Lingua e tema (Sistema, Chiaro, Scuro) si impostano con il pulsante a ingranaggio in alto a destra. Restano salvati nel browser e valgono anche per le altre simulazioni.

Letture

Legenda del grafico

Risultati di riferimento

Numeri prodotti da js/model.js, lo stesso codice che esegue la pagina.

2 stati, censimento completo

20.736 macchine, 9.784 si fermano (47,18%), 17 stringhe distinte, corsa più lunga 6 = S(2). Il censimento completo:

OutputMacchineQuota
03.45635,32%
13.45635,32%
007287,44%
017047,20%
107047,20%
116806,95%
011, 110, 1118 ciascuna0,08% ciascuna
001, 010, 100, 1014 ciascuna0,04% ciascuna
1001, 1011, 1101, 11114 ciascuna0,04% ciascuna

Da notare: 000 non compare mai, e ogni output di 4 celle inizia e finisce con 1. Sei passi sono troppo pochi per percorrere quattro celle e lasciare vuoti gli estremi.

3 stati, censimento completo

16.777.216 macchine, 7.571.840 si fermano (45,13%), 95 stringhe distinte, corsa più lunga 21 = S(3). Testa della classifica:

OutputMacchineQuota
02.097.15227,70%
12.097.15227,70%
00722.7529,55%
01704.9129,31%
10704.9129,31%
11687.0729,07%
11166.8400,88%
00064.2000,85%
01163.9200,84%
11063.9200,84%
00162.3920,82%
10062.3920,82%
01058.9920,78%
10158.5760,77%

Quota per lunghezza dell'output:

LunghezzaMacchineQuota
14.194.30455,39%
22.819.64837,24%
3501.2326,62%
450.0640,66%
56.2240,08%
63360,004%
7320,0004%

Oltre le due celle, ogni cella in più costa circa un ordine di grandezza. Le coppie speculari coincidono esattamente (01 = 10, 011 = 110, 001 = 100), mentre il complemento 0↔1 no (010 ≠ 101, 000 < 111): il nastro vuoto è fatto di zeri e rompe quella simmetria. Il documento di teoria spiega entrambi i fatti.

4 stati, campione

Seme 1, 200.000 macchine: 87.161 si fermano (43,58%), 88 stringhe distinte, corsa più lunga 24. Testa della classifica:

OutputMacchineQuota
119.95622,90%
019.86122,79%
018.82110,12%
008.75510,04%
108.6469,92%
118.4229,66%
0001.4111,62%
1111.4091,62%

In un campione le parità esatte sopravvivono solo a meno del rumore: 0 e 1 differiscono per errore di campionamento, non per struttura. La pagina parte con 1.000.000 di campioni; questa tabella ne usa 200.000 per coincidere con il terzo comando di verifica qui sotto.

Semplificazioni

Struttura

simulations/foundations/turing-census/
├── index.html      pagina e pannello dei controlli
├── css/style.css   token del tema (chiaro, scuro, sistema) e layout responsivo
├── js/i18n.js      dizionari it/en e funzioni di traduzione
├── js/model.js     motore del censimento: enumerazione, campionamento, conteggi (usabile anche da Node)
├── js/graph.js     renderer Canvas: barre in classifica, striscia per lunghezza, tooltip
└── js/app.js       controlli, query string, animazione

Il pulsante delle impostazioni (lingua e tema) è condiviso da tutte le simulazioni e vive in simulations/shared/ (js/settings.js, css/settings.css).

Verifica

cd simulations/foundations/turing-census && node -e 'const M=require("./js/model.js"); const I=require("./js/i18n.js").I18n; const c=M.create({states:2}); M.run(c,c.total); const s=M.summary(c); console.log(c.halting, s.entries.length, c.maxUsed, I.check().length)'

Atteso: 9784 17 6 0 (9.784 macchine si fermano su 20.736, 17 stringhe distinte, corsa più lunga 6 = S(2), nessuna chiave mancante nei dizionari).

cd simulations/foundations/turing-census && node -e 'const M=require("./js/model.js"); const c=M.create({states:3}); M.run(c,c.total); const s=M.summary(c); console.log(c.halting, s.entries.length, c.maxUsed)'

Atteso: 7571840 95 21 (richiede qualche secondo; corsa più lunga 21 = S(3)).

cd simulations/foundations/turing-census && node -e 'const M=require("./js/model.js"); const c=M.create({states:4,seed:1,samples:200000}); M.run(c,c.target); const s=M.summary(c); console.log(c.halting, s.entries.length, c.maxUsed)'

Atteso: 87161 88 24 (il campione ha un seme, quindi i numeri si riproducono esattamente).