原です。

>さかいです。

>私も普段Haskellをほとんど使っていないので、あまりHaskellっぽくないかも
>しれませんが、試しにちょっと書いてみました。とりあえずX(3)までの要素数
>を表示するだけです。

初心者にとってはこんなふうに main のある動くプログラムはありが
たいです。勉強になります。

むむ。以外に簡潔に書けるものですねえ。しかも速い。やっぱり Haskell 
はリストの計算は大得意なんだなあ。

内包表現と fold 系を使うと Hakell っぽいという(俗?)説に従って
少し書き換え、graphviz への dot 出力も加えてみました。


data Poset a = Poset [a] (a -> a -> Bool)
instance Show a => Show (Poset a) where
    show (Poset x _) = concat [(show v) ++ "\n" | v <- x]
type MonotonicFunction a b = [(a,b)]

power :: (Poset b) -> (Poset a) -> (Poset (MonotonicFunction a b))
power (Poset bx le_b) (Poset ax le_a) = Poset set le where
    set = foldr extend [[]] ax
    extend a funcs = [(a,b):func | func <- funcs, b <- bx, check a b func]
    check a b func = and [not(le_a a c) || (le_b b d) | (c, d) <- func ]
    le f1 f2 = and [le_b b d | ((_, b), (_, d)) <- zip f1 f2]

omega :: Poset Int
omega = Poset [0,1,2] (<=)

f :: Poset a -> Poset (MonotonicFunction a Int)
f x = power omega x

x0 = Poset [0] (<=)
x1 = f x0
x2 = f x1
x3 = f x2
x4 = f x3

main :: IO ()
main = do
    printGraph x3
    where 
    printGraph x = putStrLn ("digraph G {\nrankdir=TB;\n" ++
                     pointshow x ++ graphshow x ++ "}")
    pointshow (Poset v _) = concat ["x" ++ show i ++ ";\n" |
                              (_, i) <- zip v [0..]]
    graphshow (Poset u le) = concat ["x"++show i++" -> "++"x"++show j++";\n"
                           | pairs <- graph le (zip u [0..]), (i, j) <- pairs]
    graph le ui = [[(snd fi, snd gj) | gj <- foldr (extend_graph le fi) [] ui]
                                     | fi <- ui]
    extend_graph le (f, i) (g, j) fs
      | i == j = fs
      | (or [le g h | (h, _) <- fs]) = fs
      | (le g f) = (filter (\(h, _) -> not (le h g)) fs) ++ [(g, j)]
      | True = fs

やはり x4 は無理みたいです。


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/