fc2ブログ

数学メモ 鏡面証明法と濃度についての考察

 この記事は自分用のメモです。実数における0から1の間の濃度は、自然数を超えるのかを考えるとき、カントールの対角線論法を使用するのが一般的だ。しかし、こんなことを考える必要があるのだろうか?もっと、簡単に判断できる方法があると私は思う。それで、等式を使用した、鏡面証明法を考えてみた。
 実数の0から1の間の数値が、自然数(ここでは0を含む)の濃度と等しいと仮定する。これを等式であらわすと、ℵ0 = 0.ℵ0となる。小数点以下の数値が、0~∞ならば、自然数との対応が見出されるのは自明である。しかしながら、実数には0.001のように、任意の数の0を付けた数値が存在する。従って、実数と自然数の濃度が等しいという仮定を満たすには、0を付加した値が自然数と等しくならねばならない。0は任意の数並べられるから、その数をxとする。すると、0xℵ0 = 0.0xℵ0となる。これが等しくなる条件は、0~1の間の実数と、自然数が1対1対応する事であるから、自然数が0xℵ0の数値を表現できるのか調べればよいことになる。
 先ずはxが0個の場合を考えてみる。0個の場合は、通常の自然数なので対応が存在するのは自明である。次にN個ある場合を考える。実数が1対1対応になるには、自然数がN個の0が区別できなければならない。従って、Nxℵ0 ≠ (N - 1)xℵ0でなければならい。しかしながら、自然数は先頭の値に零をいくつ付加しても値としては同値である。従って、1対1対応を満たさない。それ故に、0~1の間の実数の濃度と自然数の濃度が等しいとした仮定が誤りであることがわかる。

 以上のように、等式を基に鏡面のように比べる証明法を鏡面証明法と命名する。試しに自然数と整数についても鏡面証明法を行ってみる。

 0を含む自然数の濃度と整数の濃度が等しいと仮定する。すると、ℵ0 = ±ℵ0となる。±はプラスの場合とマイナスの場合があるので場合分けして考える。まずはプラスの場合、ℵ0 = +ℵ0となる。整数の全ての正の数は、自然数で表現できるのでこれは正しい。次にマイナスの場合を考えると、ℵ0 = -ℵ0となる。ここで問題となるは、1対1対応である。整数の場合 +ℵ0 ≠ -ℵ0は成り立つ。しかしながら、自然数の場合、符号がないので、ℵ0 ≠ ℵ0とはならない。従って、負数の対応先が存在しない。従って、整数の濃度と自然数の濃度が等しいという仮定が間違っていることがわかる。

 カントールが考えた濃度の定義では、自然数と整数は等しくなる。彼の方法は、無限の性質を利用したもので、0 →0、1 → 1、-1 → 2...というものである。これは確かに正しいのだが、方法そのものが有限であるという矛盾が存在する。何故ならば、先ほど鏡面証明法で確認したように、自然数の全てを附番した場合、マイナス値の分だけはみ出てしまうからである。人間では無限を最後まで並べることができないから、カントールの方法が間違っているとは言えないが、その発想自体が有限のものである。ならば、記号を無限個並べたらどうなるのかを考えばならないと、私は考えるからである。有限の存在である人間の思考で、無限個並べた事を考えるのは無理があるし、限りがないので無限だとも言える。しかしながら、考え方を変えれば無限をとらえることができる。
 そもそも、無限個の記号を並べるとはどんな操作なのだろうか?そして、無限に個性があるのだろうか?その2つを考えたとき、極限操作とεーδ論法が思い浮かぶ。極限操作では、無限回数演算することを認めている。また、εーδ論法では、無限を式であらわしている。という事は、無限回数処理することに抵抗を感じる必要はなく、無限も式によって定義できることがわかる。この考えを発展させると、無限回数の処理を終わりがあるかのごとく扱い、無限を式により個性付けできるという事になる。
 すなわち、鏡面証明法で考えたように、無限個の記号を並べ、それが自然数と対応するのかを考えることに正当性があると私は考える。そう考えた方が、より数学は自由となり、無限を代数式などで自由に操れるようになる。無限に対して恐れを抱いたり、何かの行為ができないなどと考えたりしなくともよい。数学は自由であり、カントールによって、無限にも種類があることが見出されたのだから、無限を代数的に扱ってもよいだろう。
 ただし、無限個の記号を並べることにより、何かできることが増えなければ美しくない。そのような数学の拡張は無駄な贅肉であり醜い。むろん、無限個の記号を並べることによりできることが増える。
 先ほどの例でいうと、0~1の実数は、自然数の濃度よりも、0の個数x分だけ濃度が高いことが判明した。これは何を意味するのだろうか?それは、実数を考えると分かる。
 実数の0.0001などといった数値は、1 × 10の-x乗の別紀法ある。という事は、自然数が足りないのは、桁数であることがわかる。従って、自然数に桁数を付加し、桁数(精度と考えるとよい)が違えば別の値を示す新しい数N++(C++のジョーク)を考えれば、実数と1対応1することが可能となる。つまり、012と0012が違う数の体系を考えればよいのである。この例からも明らかなように、鏡面証明法を使用すれば新しい数学の要素を生み出す可能性がある。それ故に私は、鏡面証明法を数学の新しいツールとして使用しようと思う。
スポンサーサイト



テーマ : 数学
ジャンル : コンピュータ

情報集合論(仮名) 条件の設定と情報集合論の特徴

 この記事は自分用のメモです。情報集合論において、条件の設定は一番重要だといっても過言ではありません。忘れないようにメモします。
 条件の設定は、必ず1つとします。複数の条件がある場合は、個々の条件を情報集合として定義し、論理演算集合で1つに変える過程を踏みます。いわゆる論理和演算と積論理演算は、複数の条件を受け取り、1つの条件へと変換する情報集合ととらえることができます。従って、条件が1つという縛りは不合理なものではありません。必ず1つというルールを設定し、個々の条件を分析するように誘導するために必要なものです。
 情報集合論の特徴は、動的かつどこから始めてもよい柔軟な構造だという事です。情報集合論はリンクリストをもとにしており、前提条件もしくは派生条件をどの時点で考えても大丈夫です。また、いくらでもポインタを変更するように、順序を入れ替えることができます。数学は静的すぎますので、情報技術を使って動的になるようにしているのです。
 情報集合論と数学の相性を確かめるために代数学を調べたところ、群・環・体といった、構造を調べる近代数学の流れにぴったりでした。これは、代数学と幾何学も組み合わせられる近代数学において、非常に意義があります。また解析学においても、集合で記述するように情報集合論で記述しても何ら矛盾は生じません。数学基礎論で使用するのも大丈夫なようです。
 今のところ、ゲーデルの不完全性定理を満たしているのか心配です。まだ確かめていません。次の段階として、数学基礎論を学ばないといけないようです。実に面白い。結果はどうであれ、私を楽しませてくれるのだから、情報集合論を思いついてよかったです。これほど面白い題材を与えてくれた、カントールに感謝します。

テーマ : 数学
ジャンル : コンピュータ

情報集合論(仮名) 数は何故無限なのか?情報集合論は何のためにあるのか?

 この記事は自分用のメモです。数は無限にあります。しかしながら、何が無限なのかを分析しないで、ただ無限のものとして扱うと危険です。そこで、情報集合論を用いて分析を試みました。数に至る過程は次の通りになると思います。

何らかのもの { | : 存在が認識もしくは反応できるあらゆるもの, > : 情報 }
-|> 人間が認識できる情報 { | : 名前が付けられる, > : 情報集合 }
-|> 人間が記述する記号可能な情報 { | : 文字列で表現できる, > : 記号 }

記号 -|> 数字の最小単位 { | : x = "0", > : ゼロ }
記号 -|> 記号を並べたもの { | : x > 0, > : 記号列 }
記号列 -|> 記号を並べた量{ | : 記号の個数, > : 長さ } ← ここが重要
記号列 -|> 任意の場所にある記号を取り出せる記号列 { | : 要素に等価性がある, > : 記号表 }
記号表 -|> 最後まで取り出すと最初に戻る { | : x = max( x ) -> min( x ), > : 円順記号表 }
円順記号表 -|> 任意の数字で表される数 { | : 指定された記号表にある記号, < : N進数 }

※{}内の「 | 」記号は条件(フィルター)、「 > 」は変換を表わす。
※関数の定義は省略

 これからわかることは、数が無限なのは「長さ」に条件による限りがないからです。記号表が予め用意されており(対応がある)、その記号表を取り出す円順関数があれば、数という情報は成り立ちます。むろん、分配法則などといったものや算術演算は必要ですが、それを言い出すと長くなるので今回は省略します。
 この分析結果から数の本質は1進数にあると私は思いました。つまり・・・
φ -|> 0
0 -|> 1
0 0 -|> 2
0 0 0 -|> 3
...以下省略
です。この記号の対応関係を見れば、小数点表示の
1.001 ← これの情報量は何?
という問題が代数的に解けます。要するに実数の濃度が決まらないのは、これが原因だと思います。しかしながら情報集合論では、この0の記号列を、割り切れるか否かを表わすフラグ=1進数と考え情報量を算出できるのです。
 また、自然数の濃度ℵ0を細分化し、長さ * N進数 = 数の情報無限量と情報量を算出できます。この情報量を何に使うのかというと、必要なビット数の算出ができます。これは、有限区間内に収めるために必要な空間を計測できることを意味します。
 もちろん情報集合論は、情報量だけに意義があるのではありません。この様に情報が成り立つ条件および、その順序を分析することにより、あらゆる学問の構造を分析することが可能となります。私が思うに、人間が考える学問や娯楽といったあらゆるものは「情報」であり、その情報の構造を分析することは可能だと思います。一見、各々の学問につながりはありませんが、「人間の脳が情報を処理する」という点では同じです。従って、そこに注目して分析する学問を作れば、人類が持つ全知識のOSが作れるという事になります。
 集合論が数学を変えたのは、数学のOSと呼べる概念だからです。という事は、抽象度をさらに高めて詳細化すれば、数学に限らず全ての知識を分析できるようになります。分析できれば、知識はさらに発展します。
 こういった発想は情報技術者特有のものだと思います。お客様が何を職業としていても、それは知らないからできないでは仕事になりません。そういったことから、情報技術者は常に他の専門分野(知らない事)を対象領域にします。知らない事をシステム化するには、情報の構造を速やかに分析し、その分析結果を踏まえて改善しなくてはなりません。そういった知らない事から価値を生み出す仕事を10年以上していると、自ずと全知識を処理する方法が身につきます。それを表現したのが情報集合論だといえます。情報集合論を作ってみて、自分の思考過程が少しわかりました。私はお客様と会話するだけでシステムを作れるので(全開発行程の答えが瞬時にわかる)、自分を分析したいと常々考えていました。情報集合論はまだまだ未熟なものの、その一部が分かっただけでもうれしいです。おそらく私の脳内は、こういう具合に情報処理をしているのでしょう。

テーマ : 数学
ジャンル : コンピュータ

情報集合論(仮名) インクリメントの条件を分析

 この記事は自分用のメモです。前回の分析はまだ抽象度が足りません。もっと抽象度を高める必要があります。

open System
open System.Collections.Generic

[<EntryPoint>]
let main argv = 
  //記号表
  let table = [ for i in 0..9 -> i.ToString() ]
  //検索
  let search( data : IEnumerable<'T> ) ( target : 'T when 'T : equality ) =
    let enumerator = data.GetEnumerator()
    enumerator.Reset() |> ignore
    let rec sub( enumerator : IEnumerator<'T> ) ( v : 'T when 'T : equality ) = 
      if enumerator.MoveNext() = true 
      then
        if target = enumerator.Current 
        then Some( enumerator ) 
        else sub enumerator v
      else
        None
    sub enumerator target
  let target = "9"
  let x = search table target
  printfn "%sの検索結果:%b"  
    <| target
    <| ( target :> IEquatable<string> ).Equals x.Value.Current
  //次数
  let next( data : IEnumerable<'T> ) ( target : 'T when 'T : equality ) = 
    match search data target with
    | Some result ->
      if result.MoveNext() = true 
      then 
        ( false, result.Current )
      else 
        result.Reset() |> ignore
        result.MoveNext() |> ignore
        ( true, result.Current )
    | None -> 
      raise 
      <| new ArgumentOutOfRangeException(
       target.ToString() + "は存在しません。" )
  let y = next table target
  printfn "%sの次の数%O、桁上がり%b。"  
    <| target 
    <| snd y
    <| fst y
  //終了
  0

F#プログラミングをすることにより考えが整理できます。記号表はIEnumerableに相当する情報集合でなければなりません。この情報集合に命名するならば記号列空間かな?すなわち、1個以上の記号を持ち、位置を確認しながら「次の要素」と「はじめの要素」がわかる情報集合です。上限がないと円順しないから、有限集合になると思われます。といっても理論的には、1億進数のようにほぼ無限の要素数を考えられるから、有限集合でも困らない気がします。

テーマ : 数学
ジャンル : コンピュータ

情報集合論(仮名) 数の条件をさらに分析

 この記事は自分用のメモです。先ほどの結果から、以下の条件が必要だという事が分かりました。
  1. 記号には等価性が必要
  2. 数に対応する文字列表が必要
  3. 桁上がり関数が必要
  4. インクリメント関数が必要
  5. 加算数に対するチェック関数が必要

文字列表についての条件
  1. 次を示す関数が必要
  2. 現在位置を表わす関数が必要
  3. 最後まで達したら戻る円順関数が必要
  4. 桁上がりに関する情報が必要

インクリメントと加算という単純な演算さえも、必要な情報は多々あることがわかります。
 しかしながら、必要な情報さえそろえば記号とは関係がない事も同時に示しています。

//不思議な記号演算
let table1 = [ "○"; "△"; "□";  "!(^^)!" ]
printfn "△ + □ = %O" <| add table1 "△" "□"

これは暗号の基礎でもあります。さらに考えを進めれば、交換法則が満たされない情報集合なども考えられます。不可逆性を持つ暗号なども考えられるかもしれない。

テーマ : 数学
ジャンル : コンピュータ

情報集合論(仮名) 加算演算をもとに数を分析

 これは自分用のメモです。数の構造を調べるために、ひとまず加算演算をF#で実装してみます。

[<EntryPoint>]
let main argv = 
  //数字1桁
  let next ( data : List<'a> ) v = 
    match List.tryFindIndex ( fun x -> v = x ) data with
    | Some r ->
      if r = data.Length - 1 
        then ( true, data.[ 0 ] ) 
        else ( false, data.[ r + 1] )
    | None -> 
      raise 
      <| new System.ArgumentOutOfRangeException(
       v.ToString() + "は存在しません。" )
  //1桁の数字を加算
  let bridging ( data : List<'a> ) flag v =
    if flag = true then [ data.[ 1 ]; v ] else [ v ]
  let incrementCheck ( data : List<'a> ) v index =
    if data.[ index ] = v then true else false
  let add ( data : List<'a> ) value addValue =
    let rec sub ( data : List<'a> ) upFlag value add index = 
      let flag = incrementCheck data add index
      if flag = false
      then
        let newUpFlag, newValue = next data value
        let newIndex = index + 1 
        if upFlag = true 
        then 
          sub data true newValue add newIndex
        else 
          sub data newUpFlag newValue add newIndex 
      else ( upFlag, value )
    let x, y = sub data false value addValue 0
    bridging data x y
  //10進数の漢数字でチェック
  let table = [ 
    "〇"; "一"; "二"; "三"; "四"; "五"; 
    "六"; "七"; "八"; "九" ]
  printfn "0 + 3 = %O" <| add table "〇" "三"
  printfn "3 + 0 = %O" <| add table "三" "〇" 
  printfn "2 + 4 = %O" <| add table "二" "四"
  printfn "4 + 2 = %O" <| add table "四" "二" 
  printfn "9 + 3 = %O" <| add table "九" "三"
  printfn "3 + 9 = %O" <| add table "三" "九" 
  //終了
  0

自分で演算を実装してみると、多くの物事が見えてきます。加算演算を実現するには様々な関数が必要であり、その1つである、次の値を探す円順関数もいくつかの要素により成り立っています。面白いのは、それら関数さえ用意すれば、数の記号は何でもよいことです。情報そのものと情報の表記は密接な関係がありますが、ある程度独立もしています。その境界を調べる必要があります。情報集合論の目的は、そういった細かな情報の成り立ちを調べる事も含まれています。

テーマ : 数学
ジャンル : コンピュータ

情報集合論(仮名) 数の分子を考える

 この記事は自分用のメモです。情報集合論で数を分析します。数の条件は、数を表わす記号で表現可能であり、なおかつ各種法則(交換法則や結合法則など)を持つ情報となると思われます。ならば、数を表わす記号を分析せねばなりません。
 分かりやすいようにF#で表現してみると次のようになります。

open System

[<EntryPoint>]
let main argv = 
  //数字1桁
  let next ( data : List<'a> ) v = 
    match List.tryFindIndex ( fun x -> v = x ) data with
    | Some r ->
      if r = data.Length - 1 
        then ( true, data.[ 0 ] ) 
        else ( false, data.[ r + 1] )
    | None -> 
      raise 
      <| new ArgumentOutOfRangeException(
       v.ToString() + "は存在しません。" )
  //2進数
  printfn "2進数の場合"
  let binary = [ 0; 1 ]
  let a, b = next binary 0
  printfn "0より次の数値 : %d, 桁上がり : %b" b a
  let c, d = next binary b
  printfn "1より次の数値 : %d, 桁上がり : %b" d c
  let error = 2
  try
    let e0, e1 = next binary error
    printfn "1より次の数値 : %d, 桁上がり : %b" e1 e0
  with 
    | :? ArgumentOutOfRangeException 
      -> printfn "%dは2進数の範囲外です。" error
    | _ as ex -> printfn "%s" ex.Message
  printfn ""
  //10進数
  printfn "10進数の場合"
  let decimal = [ for x in 0 .. 9 -> x ]
  let e, f = next decimal 1
  printfn "1より次の数値 : %d, 桁上がり : %b" f e
  let g, h = next decimal 9
  printfn "9より次の数値 : %d, 桁上がり : %b"  h g
  printfn ""
  //終了
  0

 これを情報集合論で表現すると・・・

//情報
type InfoSet<'a, 'b, 'c>
  (
    f : 'a -> bool, //フィルター関数
    m : 'a -> 'b,  //マッピング関数
    parentGetDataFunc : ( List<'c> -> List<'a> ) option //親の関数
  ) =
  //フィールド
  let _filter = f
  let _map = m
  let mutable parentFunc = parentGetDataFunc
  member private this.Filter with get() = _filter
  member private this.Map with get() = _map
  member private this.PrentFunc with get() = parentFunc
  //親を考慮してデータを取得する
  static member ( -|> )( data : List<'c>, x : InfoSet<'a, 'b, 'c> ) : List<'b> =
    let newData = x.PrentFunc.Value( data )
    newData -|> x
  //親を考慮しないでデータを取得する
  static member ( -|> )( data : List<'a>, x : InfoSet<'a, 'b, 'c> ) : List<'b> =
    data
    |> List.filter x.Filter
    |> List.map x.Map

[<EntryPoint>]
let main argv = 
    //テストデータを準備
    let source = [ for i in 0..10 -> i]
    printfn "元のデータ"
    List.iter <| printf "%A " <| source
    printfn "\n"
    //数集合の構成要素
    let data = [ for i in 0..9 -> i ]
    let filter x =
      match List.tryFindIndex ( fun v -> v = x ) data with
        | Some r -> true
        | None ->false
    let map x = 
      let result = List.tryFindIndex ( fun v -> v = x ) data
      let index = result.Value
      if index = data.Length - 1 
        then ( true, data.[ 0 ] )  
        else ( false, data.[ index + 1] )
    let set = new InfoSet< int, bool * int, Unit > ( filter, map, None )
    printfn "数の要素"
    List.iter <| printf "%A " <| source -|> set
    printfn "\n"
    //終了
    0

すなわち、数字1桁で表現できる数は円順するもしくは円を描くと言えます。これは、計算機の原理にもマッチしており、情報技術の一種らしいと思います。
 1桁の数がわかれば、後はこの関数を入れ子にして、再帰関数を作ればいいだけです。

テーマ : 数学
ジャンル : コンピュータ

情報集合論(仮名) 情報集合の情報量

 これは自分用のメモです。集合論の濃度と、情報集合論の濃度の定義が違うのにもかかわらず、同じ名前では不都合があります。そこれで、新しい名前を考えました。名前は情報量がふさわしいと思います。意味はその名の通りその情報集合が表現できるインスタンスの数量です。名前だけでは後で読んでもわからないので、濃度の定義と情報量の定義を纏めます。
 集合論における濃度の定義は・・・

集合Aからみて集合Bと1対1の対応がある
  1. 同じものを二度数えない( Aのどの元もBの二つの異なった元と対応している )
  2. 数え漏れをしない( Aのどの元をとっても、それに対応しているBの元がある )

この定義によると、自然数集合と奇数集合の濃度は同じです。これが情報技術としては論理的整合性がなく不便です。確かに有限区間内では関数を一つ用意すると、同じビット数で表現できますが、それだと無限と有限に距離がありすぎますし、変換関数が必要であるという情報が反映されていません。変換関数を用意しないと、整数と自然数では1ビットの差が生じます。たかが1ビットですが、情報技術者としては見逃せません。それで、既存の濃度の定義を拡張します。

集合Aと集合B双方の視点から見て1対1の対応がある
  1. 集合Aと集合Bの対応方法はフィルターである点に注意し、
    双方の集合を追加する要素で構成される区間を考える。
  2. 通常の濃度の定義から集合Aから集合Bの1対1対応を考える。
    ※片方の対応が成り立つ場合、適切な変換関数があれば無理やり有限区間内に押し込められる。
  3. 集合Bから集合Aの1対1対応を考える。
  4. フィルターを通った要素の数をもとに、代数的に情報量を決定する。

例、自然数集合Nと整数集合Zの情報量を計算する。
Nは0以外の数値を通す。従って、0から∞の数を生成する関数ΓをもとにΓ - 1 の情報量を持つ。
Zはマイナス符号を持つ。マイナス符号は2個のパターンを生み出すから 2Γとなる。ただし、-0を認めない場合 2Γ - 1となる。
妥当性を確かめるために、区間 -10 から +10 の要素を通してみる。
Nは10個の要素を通し、Zは21個の要素を通す。従って、情報量が妥当だとわかる。

このΓ関数の名前はどうしようかな?名前がないと不自然だから、源数情報集合(げんすう)としておこう。もしかすると、「数え数」(かぞえすう)とした方がいいかもしれない。源数集合をGとすると、自然数集合Nの定義は{ x | x ∊ G ただし x <> 0 }となる。ただし、情報集合論では属するという概念がちょっと違うから、N{ x : x -|> G | x ≠ 0 }( 情報量I = G - 1 )という具合にしておこう。-|> 記号はフィルターを通す(条件を満たす)という感じがしていいと思う。その逆は、x -<| ( フィルターの壁を越えられなかった )としておきます。紙上でも思考内でも表現できる理論が好ましいから、わかりやすい情報集合論の記号も考えておく必要があります。

テーマ : 数学
ジャンル : コンピュータ

情報集合論(仮名) 理論を使って数を分析

 この記事は自分用のメモです。0~∞を表わす新しい濃度関数Γを定義し、他の数も分析することにより、理論の使い勝手を試します。
 分数は2つの数を組みとする情報ととらえることができます。分子は自然数、分母は整数なので濃度は、( Γ - 1 ) * ( 2Γ - 1 ) です。なお、情報集合論では既約分数に拘りません。何故ならば、2/4と4/8は約分するとともに1/2ですが、情報としては別物だからです。無暗に約分すると情報が喪失します。ここで気付くのは、有理数の分数と実数の分数とは違う点です。実数の範囲で分数を考えると、分子と分母ともに浮動小数点数を使用できます。その点から分数の濃度は、抽象オブジェクトの濃度によると考えられます。また、複数の分数があるとわかります。
 実数は自然数に1対1対応できないという事は有名です。その要因は、小数点以下の数値にあると思われます。自然数とは違い、0.01, 0.001というふうに幾らでも数値の頭に先頭に0をつけられます。という事は、情報集合論の濃度で表すと、小数点以下の数値は( Γ / 10 ) + ( Γ )であり、小数点でない部分を考慮すると、実数の濃度は( 2Γ- 1 ) * { ( Γ / 10 ) + ( Γ ) }となります。ただしこの濃度は、部分集合に過ぎないので、無理数の濃度を加算する必要があります。また、表現形式もまだあるのでまだ濃度を確定できません。
 こうやって考えてみると、数は多様な表現形式があることがわかります。数という情報は奥が深い。良い分析対象となります。

テーマ : 数学
ジャンル : コンピュータ

情報集合論(仮名) 無限の構造を考える

 この記事は自分用のメモです。情報集合論(仮名) 無限の正体と新しい濃度から引き続き考察します。前の覚書をもとに無限の構造を考えると、F#で以下のように表現できます。

//無限
type Infinity( name, seed, next ) =
  member this.Name with get() = name
  member this.Seed with get() = seed
  member this.Next with get() = next
  override this.ToString() =
    this.Name + "の" +
    "開始値は" + this.Seed.ToString() + 
    "、次の数は" + this.Next( this.Seed ).ToString()  

[<EntryPoint>]
let main argv = 
    //数
    let seed = 0
    let next x = x + 1
    let number = Infinity( "数", seed, next )
    printfn "%s" <| number.ToString()
    //自然数
    let seedN = next 0
    let n = Infinity( "自然数", seedN, next )
    printfn "%s" <| n.ToString()
    //終了
    0

無限構造には無限に要素を生成するための根源(種)と、要素を生成する関数が必要となります。無限構造はこの2つを分析すればその性質がわかります。
 さて、既存の濃度の定義「1対1で対応」は何がいけなかったのでしょうか?この点について考察しておかないと同じ罠にはまるおそれがあります。その結果に違和感がありますが、定義そのものは至極まっとうです。私が思うに、自然数目線だけで対応を考えていた点が不便さの元だと思います。自然数から整数を見ると1対1対応にできます。しかしながら、整数から自然数を見た場合、全射ですが単車ではありません。すなわち、負数と正数の2つが自然数の1つの要素に対応付けられてしまいます。これにより、情報の喪失が発生します。数学では問題がないのかもしれませんが、情報技術的には大問題です。
 次に偶数と自然数の関係について考察します。数学の濃度の定義によると、これもまた同じ濃度となりますが、同種の問題が生じます。自然数から見た場合、半分の要素に対応がありません。無理やり対応付けすることができますが、そうすると全単射でなくなります。この件もまた情報の喪失が生じるのです。この件に関する教訓は、親集合からの対応も考えようだと思います。
 これらの問題で厄介なのは、有限区間内では変換関数で誤魔化せることです。誤魔化せるならば同じ濃度で問題がないと考える人も居るでしょうが、変換関数を定義できるのと、その情報の性質そのものを同一視すると問題です。何故ならば、変換関数を通すという1プロセスが余分に付加されているからです。1プロセス余分に必要な情報と、余分なプロセスがない情報を同一視するのは危険です。また、変換された時点でその情報の変質が変わってしまいます。性質が変わってしまった情報を分析すると間違いが生じます。
 変換関数はそれ単独で分析するのに値するものです。決して無限構造内に埋もれさせてはなりません。何故ならば、変換関数はいくらでも考えられるからです。その中から1つを、無限構造の一部として特別視するのは無理があります。変換関数を独立して考える方が有意義な理論体系となります。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター