ライフゲーム #1

人生でなくConwayの方のゲーム。
グラフ的見方からすると次のように表現できる。
時間とともに変化する真偽値を属性として持つノードから成るグラフを考える。
何らかの規則で標本化された各時点の真偽値のみで、その変化を完全に記述できるとする。
ある標本時点を現世代と呼ぶことにし、その次の標本時点を次世代と呼ぶことにする。
現世代の各ノードの真偽値から次世代の各ノードの真偽値が決定される。
真偽値を決定する規則は以下の通り。
現世代の偽値ノードの隣接ノードのうち真値ノードが特定数あるなら、偽値ノードは次世代で真値ノードになる。
現世代の真値ノードの隣接ノードのうち偽値ノードが特定数あるなら、真値ノードは次世代で偽値ノードになる。
現世代でどちらの条件も満たさないノードは次世代も同じ真偽値を維持する。
つまり、有限状態機械である各ノードが隣接ノードの現在の状態によって相互作用して同期的に状態遷移する。
オリジナルのライフゲームの規則を使うなら、

digraph {
  rankdir=LR;
  compound=true;
  subgraph cluster_node {
    label="a node"
    true [label="true\n---------------\nE: reproduce"];
    false [label="false\n---------------\nE: extinguish"];
    extinguish [label="# of adjoined \"false\" nodes\nis neither 2 nor 3", shape=plaintext];
    reproduce [label="# of adjoined \"true\" nodes is 3", shape=plaintext];
    { rank=same; extinguish; reproduce }
    true -> extinguish [arrowhead=none, headport=w];
    extinguish -> false [tailport=e];
    false -> reproduce [arrowhead=none, headport=e];
    reproduce -> true [tailport=w];
  }
  subgraph cluster_adjoined {
    label="8 adjoined nodes";
    adjoined [shape=record, label="{nw|n|ne}|{w||e}|{sw|s|se}"];
  }
  false -> adjoined [ltail=cluster_node, lhead=cluster_adjoined, arrowhead=none]
}