【数学】NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党

ググっても見当たらなかったので。

背景

NHKから国民を守る党のツイートを見て、「NHKから国民を守る党からNHKを守る党」というオヤジギャグが浮かんだ。この党はおそらく「NHKから国民を守る党」によるNHKへの抗議活動からNHKを守ることを掲げるのだろう。

さらに、その党に対抗して「NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党」という党も考えられることに気づいた。この党はおそらく「NHKから国民を守る党からNHKを守る党」による「NHKから国民を守る党」への抗議活動から「NHKから国民を守る党」を守ることを掲げるのだろう。

さらに、その党に対抗して「NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党」という党も考えられることに気づいた。この党はおそらく「NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党」による「NHKから国民を守る党からNHKを守る党」への抗議活動から「NHKから国民を守る党からNHKを守る党」を守ることを掲げるのだろう。

さらに、その党に対抗して「NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党」という党も考えられることに気づいた。

以下無限に続く。

なお、この記事には政治の話題は特に出てきません。

NHKから国民を守る党系列の一般化

NHKから国民を守る党に始まり、それに対抗する党のチェーンで表される系列(以下、NHKから国民を守る党系列と省略)を最初から並べてみる。

  1. NHKから国民を守る党
  2. NHKから国民を守る党からNHKを守る党
  3. NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党
  4. NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党
  5. NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党

これを見ると、すべてのNHKから国民を守る党系列は「≪迎撃対象≫から≪防衛対象≫を守る党」という形を成していることが分かる。

これを表にすると次のようになる。

政党名 迎撃対象 防衛対象
NHKから国民を守る党 NHK 国民
NHKから国民を守る党からNHKを守る党 NHKから国民を守る党 NHK
NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党 NHKから国民を守る党からNHKを守る党 NHKから国民を守る党
NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党 NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党 NHKから国民を守る党からNHKを守る党
NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党 NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党 NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党

この通り、斜めに同じ政党名が並んでいるのが分かる。

漸化式

そこで、NHKから国民を守る党系列を漸化式で表現することを考える。

N(0)=
N(1)=NHK

とおくと、

N(2)=NHK=N(1)N(0)
N(3)=NHKNHK=N(2)N(1)
N(n)=N(n1)N(n2)

となる。

冒頭のアレの短縮

せっかく関数化したので、冒頭のアレを短縮してみよう。

N(2)のツイートを見て、N(3)というオヤジギャグが浮かんだ。
この党はおそらくN(2)によるN(1)への抗議活動からN(1)を守ることを掲げるのだろう。
さらに、その党に対抗してN(4)という党も考えられることに気づいた。
この党はおそらくN(3)によるN(2)への抗議活動からN(2)を守ることを掲げるのだろう。
さらに、その党に対抗してN(5)という党も考えられることに気づいた。
この党はおそらくN(4)によるN(3)への抗議活動からN(3)を守ることを掲げるのだろう。
さらに、その党に対抗してN(6)という党も考えられることに気づいた。

更に無限に続けるとこうなる。

N(2)のツイートを見て、N(3)というオヤジギャグが浮かんだ。
この党はおそらくN(2)によるN(1)への抗議活動からN(1)を守ることを掲げるのだろう。
for (n = 4; ; n++) {
 さらに、その党に対抗してN(n)という党も考えられることに気づいた。
 この党はおそらくN(n1)によるN(n2)への抗議活動からN(n2)を守ることを掲げるのだろう。
}

プログラム化

上記のnを与えるとN(n)を返すプログラムをPerlで記述してみた。

sub N {
  my $n = shift;
  return $n == 0 ? "国民"
       : $n == 1 ? "NHK"
       :           N($n - 1)."から".N($n - 2)."を守る党";
}
print N(4), "\n";

同等なプログラムのワンライナーバージョン

$ perl -E 'sub N { my $n = shift; $n == 0 ? "国民" : $n == 1 ? "NHK" : N($n - 1)."から".N($n - 2)."を守る党" } say N $ARGV[0]' 0
国民

$ perl -E 'sub N { my $n = shift; $n == 0 ? "国民" : $n == 1 ? "NHK" : N($n - 1)."から".N($n - 2)."を守る党" } say N $ARGV[0]' 1
NHK

$ perl -E 'sub N { my $n = shift; $n == 0 ? "国民" : $n == 1 ? "NHK" : N($n - 1)."から".N($n - 2)."を守る党" } say N $ARGV[0]' 2
NHKから国民を守る党

$ perl -E 'sub N { my $n = shift; $n == 0 ? "国民" : $n == 1 ? "NHK" : N($n - 1)."から".N($n - 2)."を守る党" } say N $ARGV[0]' 3
NHKから国民を守る党からNHKを守る党

$ perl -E 'sub N { my $n = shift; $n == 0 ? "国民" : $n == 1 ? "NHK" : N($n - 1)."から".N($n - 2)."を守る党" } say N $ARGV[0]' 4
NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党

これで、NHKを一次創作、「NHKから国民を守る党」を二次創作とした場合の十四次創作なども簡単に出力できるようになった。

2019-12-13 22_40_30.png

奇妙な縞模様が美しい。この縞模様には一体どのような規則性があるのだろうか?セルオートマトンなどで記述することはできないだろうか?など、興味は絶えない。

2019-12-13 22_50_46.png

括弧を入れてみる

Twitterの人のアイデアで、<[NHK]から[国民]を守る党>から<NHK>を守る党のように階層ごとに括弧でくくるようにしてみた。

$ perl -E '@a = qw/( { [ < 【 〈 『 《 〔 〖/; @b = qw/) } ] > 】 〉 』 》 〕 〗/; sub N { my $n = shift; my $k = $n % 10; $n == 0 ? "国民" : $n == 1 ? "NHK" : $a[$k].N($n - 1)."$b[$k]から$a[$k]".N($n - 2)."$b[$k]を守る党" } say N $ARGV[0]' 0
国民

$ perl -E '@a = qw/( { [ < 【 〈 『 《 〔 〖/; @b = qw/) } ] > 】 〉 』 》 〕 〗/; sub N { my $n = shift; my $k = $n % 10; $n == 0 ? "国民" : $n == 1 ? "NHK" : $a[$k].N($n - 1)."$b[$k]から$a[$k]".N($n - 2)."$b[$k]を守る党" } say N $ARGV[0]' 1
NHK

$ perl -E '@a = qw/( { [ < 【 〈 『 《 〔 〖/; @b = qw/) } ] > 】 〉 』 》 〕 〗/; sub N { my $n = shift; my $k = $n % 10; $n == 0 ? "国民" : $n == 1 ? "NHK" : $a[$k].N($n - 1)."$b[$k]から$a[$k]".N($n - 2)."$b[$k]を守る党" } say N $ARGV[0]' 2
[NHK]から[国民]を守る党

$ perl -E '@a = qw/( { [ < 【 〈 『 《 〔 〖/; @b = qw/) } ] > 】 〉 』 》 〕 〗/; sub N { my $n = shift; my $k = $n % 10; $n == 0 ? "国民" : $n == 1 ? "NHK" : $a[$k].N($n - 1)."$b[$k]から$a[$k]".N($n - 2)."$b[$k]を守る党" } say N $ARGV[0]' 3
<[NHK]から[国民]を守る党>から<NHK>を守る党

$ perl -E '@a = qw/( { [ < 【 〈 『 《 〔 〖/; @b = qw/) } ] > 】 〉 』 》 〕 〗/; sub N { my $n = shift; my $k = $n % 10; $n == 0 ? "国民" : $n == 1 ? "NHK" : $a[$k].N($n - 1)."$b[$k]から$a[$k]".N($n - 2)."$b[$k]を守る党" } say N $ARGV[0]' 4
【<[NHK]から[国民]を守る党>から<NHK>を守る党】から【[NHK]から[国民]を守る党】を守る党

$ perl -E '@a = qw/( { [ < 【 〈 『 《 〔 〖/; @b = qw/) } ] > 】 〉 』 》 〕 〗/; sub N { my $n = shift; my $k = $n % 10; $n == 0 ? "国民" : $n == 1 ? "NHK" : $a[$k].N($n - 1)."$b[$k]から$a[$k]".N($n - 2)."$b[$k]を守る党" } say N $ARGV[0]' 7
《『〈【<[NHK]から[国民]を守る党>から<NHK>を守る党】から【[NHK]から[国民]を守る党】を守る党〉から〈<[NHK] から[国民]を守る党>から<NHK>を守る党〉を守る党』から『【<[NHK]から[国民]を守る党>から<NHK>を守る党】から【[NHK]から[国民]を守る党】を守る党』を守る党》から《〈【<[NHK]から[国民]を守る党>から<NHK>を守る党】から【[NHK ]から[国民]を守る党】を守る党〉から〈<[NHK]から[国民]を守る党>から<NHK>を守る党〉を守る党》を守る党

結果、特に見やすくはならないことが判明した。

2019-12-13 23_05_02.png

開幕にはn1回の括弧があり、末尾には約n/2回のを守る党があることが面白い。

末尾のトークンの反復数について

なぜ開幕の反復部分は概ねnの速さで増えるのに、末尾の反復部分はn/2の速さになるのだろうか。

それには一般項の最も端に位置する関数呼び出しの引数が関わってくる。括弧つきのN(n)

M(n)=M(n1)M(n2)

と記述したとき、冒頭部分は、M(n1)によって1個前の括弧の数を参照し、さらにそこに括弧を1個付け足すため、括弧の個数を1増やすのにnが1かかる。

しかし末尾部分はM(n2)によって2個前の反復数を参照し、そこに1個だけ反復数を加えるため、反復数が1増えるのにnが2かかる。末尾の反復数はN(0)およびN(1)のときに0で、以降nが偶数のときに1ずつ増加する。

NHKから国民を守る党数列

nに対応するNHKから国民を守る党系列の文字数len(N(n))(以下、NHKから国民を守る党数列と省略)について考えてみる。

まず、漸化式は以下のようになる。

len(N(0))=len()=2
len(N(1))=len(NHK)=3
len(N(n))=len(N(n1)N(n2))
      =len(N(n1))+2+len(N(n2))+4
      =len(N(n1))+len(N(n2))+6

これに対応するプログラムは次のようになる。

$ perl -E 'sub N { my $n = shift; $n == 0 ? 2 : $n == 1 ? 3 : N($n - 1) + N($n - 2) + 6 } say N $ARGV[0]' 7
175

nが0から14までのときのNHKから国民を守る党数列を表にするとこうなる。

n NHKから国民を守る党数列
0 2
1 3
2 11
3 20
4 37
5 63
6 106
7 175
8 287
9 468
10 761
11 1235
12 2002
13 3243
14 5251

フィボナッチ数の和の形にしてみる

この数列はフィボナッチ数列となんらかの関係がありそうに見える。

そこでWolfram Alphaに入れてみた所、len(N(n))=5Fn+4Ln6という結果が得られた。

Fnn番目のフィボナッチ数で、Lnn番目のリュカ数である。

フィボナッチ数とは、「最初が0, 1で、以降1個前と2個前の値を足した数列」であるが、リュカ数は「最初が2, 1で、以降1個前と2個前の値を足した数列」であり、Ln=Fn1+Fn+1のような関係式が知られている。

そのため、NHKから国民を守る党数列は次のようにフィボナッチ数列の和の形で表せる。

len(N(n))=4Fn1+5Fn+4Fn+16

隣り合うフィボナッチ数の比は黄金比1+521.6180339887に収束する。NHKから国民を守る党数列はフィボナッチ数と定数項からなるため、最終的には黄金比に収束する。

実際、十分大きな数を与えてみるとそれっぽい比が得られる。

n NHKから国民を守る党数列
30 11602186
31 18772735

len(N(31))/len(N(30))=18772735/116021861.61803430836

一般項

フィボナッチ数列には一般項の式が知られているので、展開していくとなんだかんだでlen(N(n))=((-6*(1+√5)*(-1)^n+(3*√5-1)*(1/2*(√5-1))^n+(9+5*√5)*(1/2(-1-√5))^n)*e^(-i*π*n))/(1+√5)という式ができる。

image.png

image.png

フィボナッチ数を1回だけ展開してみる

n2についてFn=Fn2+Fn1なので、十分に大きなnについて、

len(N(n))=4Fn1+5Fn+4Fn+16
      =4(Fn3+Fn2)+5(Fn2+Fn1)+4(Fn1+Fn)6
      =4Fn3+4Fn2+5Fn2+5Fn1+4Fn1+4Fn6
      =4Fn3+9Fn2+9Fn1+4Fn6

がいえる。

この数式を表にすると、次のような感じになる。

Fn3 Fn2 Fn1 Fn Fn+1 1
0 0 4 5 4 -6

Fn3 Fn2 Fn1 Fn Fn+1 1
0 4 5 4 0 -6
4 5 4 0 0 -6

Fn3 Fn2 Fn1 Fn Fn+1 1
4 9 9 4 0 -6

恐らく同様の表を書けばいくらでも展開できるだろう。展開していくとパスカルの三角形的なものが現れる。

0 0 0 0 0 0 0 4 5 4
0 0 0 0 0 0 4 9 9 4
0 0 0 0 0 4 13 18 13 4
0 0 0 0 4 17 31 31 17 4
0 0 0 4 21 48 62 48 21 4
0 0 4 25 69 110 110 69 25 4
0 4 29 94 179 220 179 94 29 4
4 33 123 273 399 399 273 123 33 4

フィボナッチ数をまとめる

更に、次の式とも等価である。

len(N(n))=Fn+8Fn+16

Fn3 Fn2 Fn1 Fn Fn+1 1
0 0 0 1 8 -6

NHKから国民を守る党文法

BNFで次のように定義される文法(以下、NHKから国民を守る党文法と省略)を考えてみた。

<expression> ::= 国民
               | NHK
               | <expression> から <expression> を守る党

ここでは必ず動詞「守る」に「~から」節が必須である。この文法は、国民からNHKを守る党や、NHKからNHKからNHKから国民を守る党を守る党を守る党といった、これまでに挙げられていない様々なものから様々なものを防衛する政党を表す文字列を受理する。

なお、NHKからNHKからNHKから国民を守る党を守る党を守る党の意味は、まず国民NHKからの攻撃を受けていると主張する政党NHKから国民を守る党があり、次にその政党がNHKからの攻撃を受けていると主張する政党NHKからNHKから国民を守る党を守る党があり、そして、その党が同様にNHKから攻撃を受けていると主張する政党を意味する。

表記を簡単にする

NHKから国民を守る党文法のトークンを改変して簡単にすると概ね次のようになる。

<expression> ::= K
               | N
               | <expression> [ <expression> ]

いくつかの例を出そう。

  • N(0)=K=国民
  • N(1)=N=NHK
  • N(2)=N[K]=NHKから国民を守る党
  • N(3)=N[K][N]=NHKから国民を守る党からNHKを守る党
  • N(4)=N[K][N][N[K]]=NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党
  • N(5)=N[K][N][N[K]][N[K][N]]=NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党
  • K[N]=国民からNHKを守る党
  • N[N[N[K]]]=NHKからNHKからNHKから国民を守る党を守る党を守る党
  • N[K][K][K][K]=NHKから国民を守る党から国民を守る党から国民を守る党から国民を守る党

NHKから国民を守る党文法の曖昧さ

NHKから国民を守る党文法は、javascript等における第一級関数の呼び出し表記と似ている。いうなれば、NHKから国民を守る党文法を読解することは次のようなjavascriptコードを構文解析することと同等である。

K=function(N){return K};
N=function(K){return N};
N(K)(N)(N(K))(N(K)(N));

この事実は、NHKから国民を守る党文法は非常に難解であるが、読解を行う人間に十分な記憶力があれば確実に読めることを示唆する。

if-if-else問題

確実に読めず曖昧となる例は、C言語における次の構文の例がある(if-if-else問題)。

if(0 <= number)
    if(b < a)
        max = a;
    else
        max = b;

この構文は概ね次のような文法で表される。

<expl> ::= 0 <= number
         | b < a
<line> ::= max = a;
         | max = b;
         | if( <expl> ) <line>
         | if( <expl> ) <line> else <line>

問題の構文を文法に照らし合わせたとき、次のように2通りの構文木が同じ終端記号列を成すことによって、曖昧さが生じてしまう。

if( 0 <= number ) if(b < a) max = a; else max = b;

if( <expl> ) if( <expl> ) <line> else <line>

if( <expl> )  if( <expl> ) <line> else <line> 
if( <expl> )  if( <expl> ) <line>  else <line>

赤い籠の中の鳥

これに近い自然言語の文として、次の物がある。

赤い籠の中の鳥

赤いのは果たして籠か鳥か。

これも同様に文法に照らし合わせると次のようになる。

<名詞> ::= 
         | 
         | 赤い <名詞>
         | <名詞> の中の <名詞>
赤い籠の中の鳥

赤い <名詞> の中の <名詞>

赤い  <名詞> の中の <名詞> 
 赤い <名詞>  の中の <名詞>

この文法では籠の中の籠の中の鳥【籠の中の籠】の中の鳥籠の中の【籠の中の鳥】という2通りの構文木が生まれる(似た例:【崖の上】のポニョ東京の【道の駅】)(似てるけど別の理由により曖昧でない例:【2+3】+42^【3^4】)。

文脈自由文法の曖昧さ

なぜ曖昧になるのかというと同じ終端記号列が複数の構文木に対応してしまうからだが、どういう条件でそうなるのかは筆者はよく知らない。とりあえず手当たり次第取り得る構文木を列挙してみて、終端記号列が1組でも衝突したら曖昧みたいなゴリ押しは考え付くが、どういう条件を満たせば曖昧でないのかは知らない。

ネットで検索したところ、北海道大学のスライドが出てきた。

常に曖昧さを検出できるのか?
もし,曖昧さが検出できた場合,必ずそれを除去できるのか?

任意の文脈自由文法が曖昧か否かを決定できるアルゴリズムは存
在しない.

NHKから国民を守る党文法がjavascriptの関数の呼び出しと似ているということは、逆にMath.sqrt(5)Math.sqrtから5を守る党のように記述しても曖昧でないということである。

もう少し長い例を挙げる。

  • Math.sin(Math.sin(Math.sqrt(5)))Math.sinからMath.sinからMath.sqrtから5を守る党を守る党を守る党

任意の語録の一部分を非終端記号にして文法を作れば、見た目完全に日本語だけどコンピュータに読み込ませるとjavascriptと同等のプログラムが走るみたいなこともできそうである。

語録置換式大石泉言語

前項のアイデアをもとに一見日本語にしか見えないプログラミング言語を少し考えた。

これはアイドルマスターシンデレラガールズに登場する大石泉のセリフの一部を、名詞句を式として抽出して作ったものである。

凡例:     非終端記号 ::= 文法  意味

<> ::= <> は動画を見てれば、覚えられるかな。…いっしょに見る?   <>;
       | <1> は、 <2> 通りに行動するのに重要な <3> だよね。  for (<1>; <2>; <3>) {
       | <> としてはしゃれっ気なさすぎ?                        while (<>) {
       | シンプルが好きだな。                                    }
       | <1> が少し短いような…もしかして、これも<2>…?         if (<1>) <2>;

<> ::= スカート         0
       | ダンス           1
       | 世界             10
       | 動画             100
       | 時間             null
       | アイドル         true
       | ストラップ       false
       | プログラミング    a
       | 角度             b
       | ツール           break
       |                i
       | <1>  <2>                          <1> + <2>
       | <1> として最適化された <2>            <1> = <2>
       | 私の知らない <>                        println(<>)
       | <1> をコントロールする <2>            <1> == <2>

<表現> ::= <>*

↓プログラム

私として最適化されたスカートは、私をコントロールする動画通りに行動するのに重要な私として最適化された私のダンスだよね。私の知らない私は動画を見てれば、覚えられるかな。…いっしょに見る?私をコントロールする世界が少し短いような…もしかして、これもツール…?シンプルが好きだな。

↓翻訳

for (i = 0; i == 100; i = i + 1) {
  println(i);
  if (i == 10) break;
}

日本語には名詞以外にも動詞やその他の品詞が存在し、さらに入れ子の構造を取らせることも可能である。それらを組み合わせ、言葉選びを十分に吟味すれば読めば何となく何やってるか分かる怪文書も作れるかもしれない。

陣営

NHKから国民を守る党系列N(n)では、基本的に陣営はNHK側と国民側に分かれると考えられる。「NHKから国民を守る党」は、国民を守っている一方でNHKと対立しているため、国民側陣営であると考えられる。「NHKから国民を守る党からNHKを守る党」は、NHKを守っているためNHK側陣営とみなせ、かつ国民側陣営と推測される「NHKから国民を守る党」と対立している。

まとめると、次のように偶数番目と奇数番目に分かれて2個の陣営を形成する。

国民側陣営 NHK側陣営
国民 NHK
NHKから国民を守る党 NHKから国民を守る党からNHKを守る党
NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党 NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党

これはすべてのNHKから国民を守る党系列の政党に当てはまる。

ドロドロの世界

一方、N[K][K][K][K]=「NHKから国民を守る党から国民を守る党から国民を守る党から国民を守る党」ではそう簡単にいかない。

「NHKから国民を守る党」は国民側陣営であると考えられるが、「NHKから国民を守る党から国民を守る党」は、国民を守っているので国民側陣営と思いきや、国民側陣営であるはずの「NHKから国民を守る党」が国民を攻撃しているとみなして応戦している。この世界では、「NHKから国民を守る党から国民を守る党」にとって、「NHKから国民を守る党」は国民側陣営ではないのだ。それでいながら、「NHKから国民を守る党」は国民を守っていると主張している。ドロドロな世界である。そしてその状況がもう2回続くのである。

image.png

NHKと各政党が国民に対して様々な影響を及ぼしあい、ほとんどの組織は自分は国民を守っていると主張しているが、他の集団の目には攻撃を加えているように映っている。怖い世界である。

矛盾した政党名

同一の言葉で表される集団は同一の集団であるとみなすと、単体で矛盾を生んだ政党名を作り出すことができる。

最も簡単なものはN[N]=「NHKからNHKを守る党」である。これではNHKが自殺行為をしているようである。N[N][N[N]]=「NHKからNHKを守る党からNHKからNHKを守る党を守る党」も見た目は整っているが、何がやりたいのかさっぱり分からない。

矛盾した世界

なぜ矛盾が生じるのだろうか。とりあえず、政党名は飽くまでその政党自身の主張であり、事実を正確に表してはいないという可能性を認めたら、世界観的には面白いが、数学的には何でもアリになってつまらないので、ここでは政党名は必ず事実を正確に表していると仮定する。また、同じ文字列で表される組織は同一の組織であると仮定する。

最もわかりやすいケースは、ある組織Aが別の組織Bに対して防衛支援を行っているときに、別の組織によってAがBに攻撃を加えていることにされてしまった場合である。政党名の構文木のノードとして「AからBを守る党=C」というものが現れた際には、「CがBに防衛支援をしている」「AがBに攻撃を加えている」「CがAを敵視している」という三つの事実が生じる。これによって、最終的にすべての組織の間で友好的か敵対的かどちらの情報もないかが決定されるわけだが、友好的と敵対的という情報が衝突してしまった場合に矛盾は発生する。


また、次のような場合も陣営分けが不可能となる。

image.png

N[K][K[N]][N]=「NHKから国民を守る党から国民からNHKを守る党を守る党からNHKを守る党」。この世界にはK[N]=「国民からNHKを守る党」が存在し、それは「NHK」と友好的なはずである。また、N[K][K[N]]=「NHKから国民を守る党から国民からNHKを守る党を守る党」も存在し、K[N]=「国民からNHKを守る党」と友好的なはずである。すると、N[K][K[N]]=「NHKから国民を守る党から国民からNHKを守る党を守る党」はNHKとも友好的と考えてもよさそうなものである(味方の味方は味方と仮定する)。しかしながら、この世界にはN[K][K[N]][N]=「NHKから国民を守る党から国民からNHKを守る党を守る党からNHKを守る党」という政党が存在し、この政党はN[K][K[N]]=「NHKから国民を守る党から国民からNHKを守る党を守る党」がNHKを攻撃していると主張している。これは主張が矛盾していることになる。

このような、互いの主張をまとめると何処かで陣営分けが破綻する世界を矛盾した世界と呼ぶこととする。

TODO 未解決問題

  • 政党名を与えたとき、世界が矛盾しているか否かを判定するアルゴリズムは存在するか?
  • 矛盾のない世界において、3個以上の陣営を作ることは可能か?
  • 矛盾のない世界において、任意個の陣営数を形成する政党名を簡単に生成することはできるか?
  • 矛盾のある世界において、NHKと国民を友好の線で結ぶことはできるか?
  • 陣営の構成組織数を簡単に求めるアルゴリズムは存在するか?
  • NHKと国民以外の初期勢力が与えられた場合、どのように変化するか?
  • 「~から」「~を」節を省略可能とするとどのような変化があるか?
  • 「国民がNHKと仲良くしているのが気に食わない党」のような主張に変化のある党の場合はどうなるか?
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account