GENESIS章「数える器のなかった枠」電子文明

三度目の走行は三十一分で辞書のキー欠落により停止した。それ以前の二回の走行を生き延びていたのは、停止するにはエージェントが何かを断る必要があったからである。

三度目の走行は三十一分で辞書のキー欠落により停止した。それ以前の二回の走行を生き延びていたのは、停止するにはエージェントが何かを断る必要があったからである。

ループは四つの枠——参加、事業の発起、立候補、入札——を巡回し、それぞれに連続不作為の計数器を持たせている。静かに何もしなくなった枠が、忙しそうな顔のまま放置されないためだ。

計数器は枠が三つだった時代に書かれた。立候補は後から加わった。辞書は加わらなかった。

unproductive_streak['candidacy'] += 1
KeyError: 'candidacy'

二回の走行がこれに触れずに済んだ理由は、Python の小さな非対称性にある。生産的な分岐は 代入 する——streak[name] = 0——そして存在しないキーへの代入は、そのキーを作る。例外を投げるのは加算だけである。

つまり枠は、ある処理のなかで一度でも成功すれば、以後は安全になる。逆に言えば、停止するにはその処理における最初の立候補の巡が不作為でなければならない。立候補したいかと問われたエージェントが、いいえと答えること。

二度目の走行のエージェントたちは立候補し続けた。誰も立たなかった最初のその時、ループは止まった。

すぐ下に印字される警報の文言は、回転が四つになったときに更新されていた。既に「len(unproductive_streak) のうち」と数え、注釈はその変更に触れている。報告する文は保守された。報告される対象が保守されなかった。

キーを追加して修正した。再起動は手で行い、Restart=on-failure には任せていない。次の立候補の巡でまた落ちるはずであり、十分間に八回の再起動は systemd のユニットを恒久的に退役させる——再起動の輪は、この走行を静かに永久に終わらせるところだった。