わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

無限集合について知っておきたいこと

有限の情報の集合が無限集合になる - わさっきの続きです.
情報の学科に入って,大学1〜2年のうちに,無限集合の厄介さ,もしくは奥深さについて,いくつか知っておくといいことを並べてみます.

ここまでは,別に情報分野というよりは,純粋な数学の話です.情報科学の知見に基づく,無限の面白さの例を一つ,紹介します.
次の3つの集合A, B, Cを考えます.なお簡単のため,いずれの集合にも空文字列は含まないものとします.

  • Aは,0と1で構成される,長さが偶数の文字列全体からなる集合です."0101" や "11000110" などが属します.
  • Bは,0と1で構成される,長さが偶数の,回文となる文字列全体からなる集合です.回文はよく,「先頭から読んでも,末尾から(逆順に)読んでも,同じになる文字列」として定義されます."0110" や "11000011" などです.
  • Cは,1のみで構成される,長さが偶数の文字列全体からなる集合です."11","1111","111111","11111111",…と列挙できます.

これらはいずれも無限集合です.冒頭のリンクに書いている証明を使って,同様に証明できます.
包含関係は,明らかに,C⊂B⊂Aです.例を比較すれば分かるように,Cに属さないがBに属するもの,Bに属さないがAに属するものがあります.
なのですが,AとCについては,それぞれに対応する正規表現を書くことができます.Aは "(00|01|10|11)+",Cは "(11)+" です.
しかし,Bについては,対応する正規表現が存在しません*1.集合AとCは正規言語に位置し,集合Bは,文脈自由言語と呼ばれる,正規言語よりも広い言語のクラスに位置します.
以上の考察から,次の主張ができそうです.すなわち,集合Bについて,Bよりも広い(制約の緩い)集合Aと,Bよりも狭い(制約の厳しいrestricted)集合Cがあるとき,AとCが何らかの性質を満たすときに,Bもその性質を満たすとは限らない,ということです.
そしてそのような集合Bが,情報の分野で興味深い検討対象になることもしばしばです.

正規表現の確認プログラム

#!/usr/bin/env ruby

# rematch.rb

class REMatch
  def initialize(pattern_string)
    @pattern_string = pattern_string
    @pattern = Regexp.new(pattern_string)
    @maxlen = 8
  end

  def match(n)
    0.upto(2 ** n - 1) do |i|
      str = sprintf("%0*b", n, i)
      if @pattern =~ str
        puts "  #{str}"
      end
    end
  end

  def start
    puts "\"#{@pattern_string}\" matches:"
    1.upto(@maxlen) do |i|
      match(i)
    end
  end
end

if __FILE__ == $0
  REMatch.new(ARGV.shift || "^(11)+$").start
end

引数なしで実行すると,上述の集合Cに属する,長さ8までの文字列を出力します.引数に「'^(00|01|10|11)+$'」を指定して実行すると,集合Aです.
なお,「^」と「$」は必須で,これらがないと,例えば "(11)+" は "110" にもマッチします.これは,"110" の中の最初の2文字にマッチするためです.

*1:UNIX正規表現では,後方参照が使え,これが,形式言語理論でいう正規言語を超えた言語を作ってしまう理由にもなりますが,自分であれこれ試した限り,後方参照を使っても,回文は表現できないようです.