----Next_Part(Sat_Dec_20_02_02_38_2003_726)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

さかいです。

From: Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp>
Date: Fri, 19 Dec 2003 18:57:30 +0900

> 原です。
> 
> >  豊福です。

> >これのレポート問題
> >http://www.kurims.kyoto-u.ac.jp/~hassei/questions.pdf
> >の問題2の答えの X3 がわからない(手作業でやると手に負え
> >にないような気がする)のですが解いた人いませんか。
> 
> 確かにこれはややこしい。きれいな答は覆い鵑任靴腓Α
ここでリストアップする関数を Hakell で披露するとかっこいい
> んだけど、、、力及ばず。(^^;

試しに、ちょー手抜きプログラムをRubyでい瞳彁擦靴討澆泙靴拭
原さんの finite-set を使っています。
http://blade.nagaokaut.ac.jp/~sinara/ruby/math/

また、有限上の関数は単調ならば連続になることが知られているので、
単調性しかチェックしてません。

じゃ、Haskell版は誰か他の人よろしく :-P

--
酒井 政裕 / Masahiro Sakai


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/
----Next_Part(Sat_Dec_20_02_02_38_2003_726)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="poset.rb"

require 'finite-set'
require 'finite-map'

class Poset
  def initialize(underlying_set, &lt_eq)
    lt_eq  ambda{|a,b| a <  } unless lt_eq
    @underlying_set  nderlying_set
    @lt_eq  t_eq
  end
  attr_reader :underlying_set

  def lt_eq(a,b)
    @lt_eq.call(a,b)
  end

  def **(other)
    ary  ther.underlying_set.to_a

    s  et[]

    f  ap.phi(self.underlying_set)
    func  ambda{|i|
      if i < ary.size
        c  ry[i]
        @underlying_set.each{|d|
          f[c]  
          func.call(i+1)
        }
      else
        if other.underlying_set.all?{|a|
            other.underlying_set.all?{|b|
              lt_eq(f[a],f[b]) or not other.lt_eq(a,b)
            }
          }
          s.push(MonotonicFunction.new(f.dup, other, self))
        end
      end
    }
    func.call(0)

セgin
    s  @underlying_set ** other.underlying_set).select_s{|f|
      other.underlying_set.all?{|a|
        other.underlying_set.all?{|b|
          lt_eq(f[a],f[b]) or not other.lt_eq(a,b)
        }
      }
    }.map_s{|f|
      MonotonicFunction.new(f, other, self)
    }
濺

セgin
    Poset.new(s)
濺
    elem_to_upper_closure  ash.new
    s.each{|f|
       elem_to_upper_closure[f]  .select_s{|g| f <  }
    }
    Poset.new(s){|f,g|  elem_to_upper_closure[f].member?(g) }
  end
end


class MonotonicFunction
  def initialize(underlying_map, dom, cod)
    @underlying_map  nderlying_map
    @dom  om
    @cod  od 
  end
  attr_reader :underlying_map
  attr_reader :dom
  attr_reader :cod

  def [](e)
    @underlying_map[e]
  end

  def <ther)
    @dom.underlying_set.all?{|a| @cod.lt_eq(self[a], other[a]) }
  end
end


A  oset.new(Set[0,1,2])
def F(x)
  A**x
end

X0  oset.new(Set[0])
p X0.underlying_set.size #1
X1  (X0)
p X1.underlying_set.size #3
X2  (X1)
p X2.underlying_set.size #10
X3  (X2)
p X3.underlying_set.size #126

----Next_Part(Sat_Dec_20_02_02_38_2003_726)----