スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

情報集合論(仮名) 基本イメージ

 素朴集合論を拡張し、情報技術に生かすためにメモを取ることにしました。情報集合プログラミングは、大体こんな風になります。

type Set<'a, 'b, 'c>
  (
    name,
    f : 'a -> bool, 
    m : 'a -> 'b,
    parentGetDataFunc : ( List<'c> -> List<'a> ) option 
  ) =
  //フィールド
  let _name = name
  let _filter = f
  let _map = m
  let mutable parentFunc = parentGetDataFunc
  //プロパティ
  member this.Name with get() = _name
  member private this.Filter with get() = _filter
  member private this.Map with get() = _map
  member private this.PrentFunc with get() = parentFunc
  //親を考慮してデータを取得する
  member this.GetData( data : List<'c> ) : List<'b> =
    let newData = this.PrentFunc.Value( data )
    this.GetData( newData )
  //親を考慮しないでデータを取得する
  member this.GetData( data : List<'a> ) : List<'b> =
    data
    |> List.filter this.Filter
    |> List.map this.Map

[<EntryPoint>]
let main argv = 

    //テストデータを準備
    let source =
     [ 
      yield "実験データ" 
      for i in 0..10 -> i.ToString()
      for i in -10..-1 -> i.ToString()
      yield "終了"
     ]
    printfn "元のデータ"
    List.iter <| printf "%A " <| source
    printfn "\n"

    //数値
    let numberFilter = 
        fun x -> 
          let a = ref 0
          System.Int32.TryParse( x, a )
    let numberMap = fun x -> System.Int32.Parse( x )
    let numberSet = 
      new Set<string, int, obj>( 
        "数値", numberFilter, numberMap, None )
    let numberFunc = 
      ( fun ( x : List<string> ) -> numberSet.GetData( x ) ) 
    let data = numberFunc source
    printfn "%s" numberSet.Name
    List.iter <| printf "%A " <| data
    printfn "\n"
    
    //自然数
    let naturalSet = 
      new Set<int, int, string>( 
        "自然数", ( fun x -> x > 0 ), 
        ( fun x -> x ), Some( numberFunc ) )
    let naturalFunc =
      fun ( x : List<string> ) -> naturalSet.GetData( x )
    printfn "%s" naturalSet.Name 
    List.iter <| printf "%A " <| naturalSet.GetData( source )
    printfn "\n"

    //偶数を取得
    let evensSet = 
      new Set<int, int, string>( 
        "偶数", 
        ( fun x -> x % 2 = 0 ), 
        ( fun x -> x ), Some( naturalFunc ) )
    let evensFunc = 
      ( fun ( x : List<string> ) -> evensSet.GetData( x ) )
    printfn "%s" evensSet.Name
    List.iter <| printf "%A " <| evensSet.GetData( source )
    printfn "\n"

    //終了
    0

勿論これは基本中の基本であり、論理プログラミングのように規則や事実を記述していく形をとります。ただし、論理プログラミングと同じではないので、型や関数プログラミングの機能をフル活用して、より簡潔に公理や定理を記述していく形になります。
 私が持つ集合の基本イメージは性質と対応です。無限の要素をすべて分析することは人間には不可能ですが、要素をある視点で集め性質をとらえると分析できます。素朴集合論のパラドックスは、いきなり言葉の全体像をとらえようとしたのが原因だと思います。私がサンプルで示したように、薄皮一枚を重ねるように、ルールを動的に重ねていけば矛盾が生じません。
 例えば、ラッセルのパラドックスは、R ∊ { x | x ∉ x } の集合における要素の所属を問題としています。しかしこのパラドックスは、集合に要素があると要素の視点で見るから真偽どちらをとっても矛盾が生じるのです。集合=規則だと考えると、全てにおいて偽を返す対応に他なりません。要素云々ではなく、何も通さないフィルターだと考えれば合点がいきます。
 つまり、私が考える集合とは、何かの物質や概念を直接含むものではなく、規則そのものであり、フィルターのような存在なのです。ただし、ただのフィルターではなく、一定規則で対象を変換するものでもあります。何故ならば、集合を性質の境界線ともいえるからです。境界線を越えた要素(性質を満たす要素)は、その性質を持つオブジェクトだと考えると分析しやすいです。
 ちなみに、「所属する」云々も一つの集合だと考えています。一般でいうところの所属は、元となる集合の量と、ある集合を通した後の量が同一(割合が100%)ならばtrueという空集合を返すとみなします。こうしておけば、ファジイ集合論にも対応できます。あと、私の考えでは濃度も集合に他なりません。濃度集合は、集合と範囲を表わす集合を渡すと、ある区間における個数が返される集合です。全てを集合とみなすのです。
 今回紹介したサンプルは、素朴集合論における集合ではありません。素朴集合論ではいきなり集合が登場していますが、情報技術としてとらえたとき定義が不足しています。素朴集合論の集合といえるオブジェクトを定義するには、段階を踏まなければなりません。何故ならば、集合演算や「属する」などといった概念がいきなり登場しているからです。飛躍するとパラドックスが生じます。
 プログラミングでたとえると、関数をひとつずつ追加していく感じです。関数の集合が型なので、この考え方のほうが情報技術的には都合がよいのです。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

インドリ

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カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。