不動点コンビネータ

不動点コンビネータ(ふどうてんコンビネータ、: fixed point combinator不動点結合子、ふどうてんけつごうし)とは、与えられた関数不動点(のひとつ)を求める高階関数である。不動点演算子(ふどうてんえんざんし、: fixed-point operator)、パラドキシカル結合子: paradoxical combinator)などとも呼ばれる。ここで関数 不動点とは、 を満たすような のことをいう。

すなわち高階関数 が不動点コンビネータであるとは、

任意の関数 に対し、 とすると, が成立する

事を指す。

あるいは全く同じことだが、不動点コンビネータの定義は、任意の関数 に対し、

が成立する事であるとも言い換えられる。


第一級関数をサポートしているプログラミング言語では、不動点コンビネータを用いて識別子束縛されない関数の再帰を定義することができる。そういったテクニックは、しばしば無名再帰と呼ばれる。[1][2]

不動点コンビネータは高階関数であるため、その歴史はラムダ計算の発達と深く関係している。型無しラムダ計算: untyped lambda calculus)においては、ハスケル・カリーY = λf·(λx·f (x x)) (λx·f (x x)) という不動点コンビネータがよく知られている。型無しラムダ計算には無数の不動点コンビネータが存在するが、一方で単純型付きラムダ計算などのより限定的な計算モデルでは、不動点コンビネータは必ずしも存在するとは限らない。

不動点コンビネータによる再帰の実現

不動点コンビネータにより、第一級関数をサポートしているプログラミング言語において、明示的に再帰を書かずに再帰を実現する為に用いる事ができる。なお、一般にそういった言語では普通に再帰が使えるので、プログラミングにおいてはパズル的なテクニック以上の意味は無い。一方、循環なく関数の意味を定義する(できる)、ということは、計算理論の上では重要である。

まず、再帰関数の性質を簡単に振り返り、記号をいくつか定義する。関数 が再帰的に定義されているとき、 の定義式は何らかの高階関数 を用いて、

(Eq. 1)

と書ける。たとえば 階乗を計算する関数である場合、 として

を取る事ができる。上述のように定義された が(Eq. 1)を満たすのは明らかであろう。

を用いて高階関数

(Eq. 2)

と定義する。 (すなわち は関数 を入力として受け取ると 関数「」を出力する高階関数である。 ラムダ計算の用語で言えば、 カリー化にあたる。) の定義より、はそれ自身関数であり、任意の に対し、

(Eq. 3)

が成り立つ。ここで は関数 を入力したときの値。


さて、g を不動点コンビネータとするとき、不動点コンビネータの定義より特に、 の定義域の元である事が分かる。 の定義域は関数の集合だったので、これはすなわち はそれ自身関数である事を意味する。 この関数 が式で定義された再帰関数 と一致する事を示す事ができる(後述)。

よって以下のようにすれば不動点コンビネータg で再帰関数 を実現できる事になる:

  1. U のプログラムを書く。
  2. VEq. 2式のように定義し、とする。

の証明

最後にEq. 1 で定義された再帰関数 と一致する事を示す。 不動点コンビネータの定義より、

(Eq. 4)

を満たす。

前述したようにはそれ自身関数なので、値xに対しを考える事ができる。 は以下を満たす:

(Eq. 4より)
(Eq. 3より)

すなわち

(Eq. 5)

Eq. 1Eq. 5 を見比べると、Eq. 5Eq. 1 に置き換えたものに等しい事が分かる。 Eq. 1 の(再帰的な)定義式であったので、これはすなわち の定義式を満たす事を意味する。 よって

が成立する事が分かった。

不動点コンビネータの例

型無しラムダ計算や組合せ論理などの特定の数学的な計算形式化においては、すべての式は高階関数とみなすことができる。これらの形式化では、不動点コンビネータが存在することはすなわち、すべての関数が少なくとも1つの不動点を持つことを意味する。さらに、関数は複数の異なる不動点を持つことができる。

単純型付きラムダ計算などの他のいくつかの体系では、十分に型付けされた不動点コンビネータを書くことはできない。それらの体系で再帰をサポートするには、明示的に言語体系に組み込む必要がある。それでも再帰データ型によって拡張された単純型付きラムダ計算などでは不動点演算子を書くことができるが、ある種の「実用的な」不動点演算子(常にいずれかの適用を返すもの)は制限される。多相ラムダ計算: polymorphic lambda calculusシステムF: System F)では多相不動点コンビネータは型 を持つ(ただし は型変数である)。

Yコンビネータ

型無しラムダ計算においてよく知られた(そしておそらく最もシンプルな)不動点コンビネータはYコンビネータと呼ばれる。これはハスケル・カリーによって発見されたもので、次のように定義される。

Y = (λf . (λx . f (x x)) (λx . f (x x)))

実際に関数gを適用することによって、この関数が不動点コンビネータとして動作するのが分かる。

Y g = (λf . (λx . f (x x)) (λx . f (x x))) g (Yの定義より)
= (λx . g (x x)) (λx . g (x x)) (λfのβ簡約、主関数をgに適用)
= (λy . g (y y)) (λx . g (x x)) (α変換、束縛変数の名前を変える)
= g ((λx . g (x x)) (λx . g (x x))) (λyのβ簡約、左の関数を右の関数に適用)
= g (Y g) (第2式より)

これをそのままラムダ計算で使うと、評価戦略が値渡しだった場合には (Y g) が (g (Y g)) と展開された後も、引数の値を先に求めようとして (g (g (Y g))) →...→ (g ... (g (Y g))...) のように無限に展開され続けて止まらなくなってしまうので、次節で示すZコンビネータのように修正する。評価戦略が名前渡しの場合はこのまま使える。

このカリーによるコンビネータのみをYコンビネータとすることもあるが、実装などでは不動点コンビネータを指す名前として他の形であってもYという名前を使っていることもある(#グラフ簡約の節の注を参照せよ)。

SKIコンビネータ計算では次のようになる。

Y = S (K (S I I)) (S (S (K S) K) (K (S I I)))

Zコンビネータ

値渡し評価(適用順序)でも使用可能なバージョンのYコンビネータは、通常のYコンビネータの一部をη変換することで与えられる。

Z = λf. (λx. f (λy. x x y)) (λx. f (λy. x x y))

Python での実装。その他のプログラミング言語での実装は無名再帰を参照。

Z = lambda f: (lambda x: f(lambda *y: x(x)(*y)))(lambda x: f(lambda *y: x(x)(*y)))
# 利用方法(5の階乗の計算)
Z(lambda f: lambda n: 1 if n == 0 else n * f(n - 1))(5)

チューリング不動点コンビネータ

もう一つの一般的な不動点コンビネータは、チューリング不動点コンビネータである(発見者であるアラン・チューリングの名にちなむ)。

Θ = (λx. λy. (y (x x y))) (λx. λy. (y (x x y)))

これはシンプルな値渡し形式も持つ。

Θv = (λx. λy. (y (λz. x x y z))) (λx. λy. (y (λz. x x y z)))

SとKによる最もシンプルな不動点コンビネータ

SKIコンビネータ計算のSとKによる最もシンプルな不動点コンビネータは、ジョン・トロンプによって発見された以下であり、

Y' = S S K (S (K (S S (S (S S K)))) K)

これは次のラムダ式と対応する。

Y' = (λx. λy. x y x) (λy. λx. y (x y x))

その他の不動点コンビネータ

型無しラムダ計算における不動点コンビネータは無数に存在するので、特に珍しいわけではない。2005年、メイヤー・ゴールドバーグ (Mayer Goldberg) は型無しラムダ計算の不動点コンビネータの集合が帰納的可算集合であることを示した。[3]

次のようないくつかの不動点コンビネータ(ジャン・ウィレム・クロップによって組み立てられた)は、主として遊びに使われる。

Yk = (L L L L L L L L L L L L L L L L L L L L L L L L L L)

ここで

L = λabcdefghijklmnopqstuvwxyzr. (r (t h i s i s a f i x e d p o i n t c o m b i n a t o r))

非標準不動点コンビネータ

型無しラムダ計算には不動点演算子と同じベーム木: Böhm tree)を持つラムダ式がある。すなわちそれらは λx.x(x(x ... )) と同じ無限の拡張を持つ。これは非標準不動点コンビネータ: non-standard fixed point combinators)と呼ばれる。定義より、あらゆる不動点コンビネータは非標準でもあるが、すべての非標準不動点コンビネータが不動点コンビネータであるわけではない。それらのいくつかは「標準」の定義を満たさないからである。これらの変わったコンビネータは特に strictly non-standard fixed point combinators と呼ばれる。例として、B = λx.xx かつ M = λxyz.x(yz) としたときのコンビネータ N = BM(B(BM)B) が挙げられる。非標準不動点コンビネータの集合は帰納的可算集合ではない。[3]

不動点コンビネータの実装

これまでの節で実装というよりは主に理論の観点から述べてきた、評価戦略が名前渡しの場合と値渡しの場合の違いは、実装においては、非正格(non-strict)なプログラミング言語(ないし処理系)と正格(strict)な言語の場合にほぼそのまま対応する。非正格な(遅延評価の、と言い換えてもだいたい同じ。具体的にはHaskellなどがそう)言語ないし処理系においては、ほぼ不動点コンビネータの意味そのままに循環的に実装できる。正格な場合は修正が必要であり、後述する。理論的には循環が無いことに意味があったが、実装においては循環的で普通は問題が無く、そのほうが効率的でもある。以下にHaskellによる不動点コンビネータの実装を示す。この不動点コンビネータはHaskellにおいては伝統的にfixと呼ばれる。fixは多相不動点コンビネータであることに注意せよ(前述のシステムFに関する議論も参照)。なお、Haskellには型推論があるが、以下では曖昧さをなくすために型は明記する(一般に、こういった特殊な型を使う場合は型を明記したほうが良いし、推論の実装の限界のために明記が必要なこともある)。定義の後に使用例が続く。

なお、型無しラムダ計算におけるカリーのYコンビネータは、そのまま実装しようとすると、Haskellの型チェッカによって拒否される。[4]

fix :: (a -> a) -> a
fix f = f (fix f)

fix (const 9) -- constは第1引数を返し、第2引数を捨てる関数。9と評価される

factabs fact 0 = 1 -- factabsはラムダ計算の例のFから拝借
factabs fact x = x * fact (x-1)

(fix factabs) 5 -- 120と評価される

fixの適用は遅延評価されるので無限ループにはならない。たとえばfix (const 9)(const 9)(fix f)として展開されるとき、部分式fix fは評価されない。ところが、Haskellによるfixの定義を正格(strict)プログラミング言語に持ち込むと無限ループになる。なぜなら、fへ渡した引数は事前に展開され、無限の呼び出しの連続f (f ... (fix f) ... ))を生み出すからである。

MLのような正格言語においては、クロージャの使用を強制することによって無限再帰問題を回避することができる。fixの正格なバージョンは型 を持つべきである。要するに、これは関数を取って返す関数でのみ動く。例として、以下はfixの正格なバージョンのOCamlコード実装である。

let rec fix f x = f (fix f) x (* 余分なxに注目 *)

let factabs fact = function (* factabsはエクストラレベルのラムダ抽象 *)
 0 -> 1
 | x -> x * fact (x-1)

let _ = (fix factabs) 5 (* "120" と評価される *)

以下は Python での実装。

def fix(f):
    return lambda x: f(fix(f))(x)
# 利用方法(5の階乗の計算)
fix(lambda f: lambda n: 1 if n == 0 else n * f(n - 1))(5)

Java 8 や C++11 では無名関数(ラムダ式)が使えるので上記と同じ方法で実装できる。それよりも前の時代の Java や C++ では少々複雑だった[5][6]

再帰型による符号化の例

再帰データ型(システムFωを参照)をサポートしているプログラミング言語では、型レベルで再帰を適切に計算することによってYコンビネータの型付けが可能になる。変数xを自己適用する必要性は同型の (Rec a -> a) を用いて定義される型 (Rec a) によって管理することができる。

例として、以下のHaskellコードは、型とともに同型写像のInとoutの2つの方向の名前を持つ。

In :: (Rec a -> a) -> Rec a
out :: Rec a -> (Rec a -> a)

そして次のように書くことができる。

newtype Rec a = In { out :: Rec a -> a }

y :: (a -> a) -> a
y = \f -> (\x -> f (out x x)) (In (\x -> f (out x x)))

OCamlによる等価なコードは以下。

type 'a recc = In of ('a recc -> 'a)
let out (In x) = x

let y f = (fun x a -> f (out x x) a) (In (fun x a -> f (out x x) a))

グラフ簡約

グラフ簡約(en:Graph reductionを参照)による計算系では、不動点コンビネータへの適用(apply, application)は理論通り展開しても良いが、左の図のように循環のあるグラフに簡約するという一種の、のぞき穴的最適化が知られている。また、これはカリーのYコンビネータではないが(この図のように)便宜的にYという名前で呼ばれていることもある[7]

関数の自己参照による無名再帰

不動点コンビネータは識別子に束縛されていない関数が自分自身を呼び出す一般的な方法であるが、言語によっては特別な名前などで自分自身を呼び出すことができる。詳細は無名再帰を参照。

関連項目

脚注

  1. ^ This terminology appear to be largely folklore, but it does appear in the following:
    • Trey Nash, Accelerated C# 2008, Apress, 2007, ISBN 1590598733, p. 462--463. Derived substantially from Wes Dyer's blog (see next item).
    • Wes Dyer Anonymous Recursion in C#, February 02, 2007, contains a substantially similar example found in the book above, but accompanied by more discussion.
  2. ^ The If Works Deriving the Y combinator, January 10th, 2008
  3. ^ a b Goldberg, 2005
  4. ^ Haskell mailing list thread on How to define Y combinator in Haskell, 15 Sep 2006
  5. ^ The Y Combinator in Arc and Java - Javaコード
  6. ^ bind - Fixed point combinators in C++ - Stack Overflow - C++コード
  7. ^ たとえば、Turnerの"A New Implementation Technique for Applicative Languages"(doi:10.1002/spe.4380090105)の Figure. 3 と、その直前の説明を見よ。

参考文献

Read other articles:

Panel pilot otomatis pesawat terbang Boeing 747 yang lama Pilot otomatis (dari bahasa Inggris: autopilot) adalah sebuah sistem mekanikal, elektrikal, atau hidraulis yang memandu sebuah kendaraan tanpa campur tangan dari manusia. Umumnya pilot otomatis dihubungkan dengan pesawat, tetapi pilot otomatis juga digunakan di kapal dengan istilah yang sama. Deskripsi Instrumen sistem pilot otomatis Instrumen sistem pilot otomatis Dalam masa-masa awal transportasi udara, pesawat udara membutuhkan perh...

 

Iraqi - Kurdish Politician Hoshyar ZebariDeputy Prime Minister of IraqIn office8 September 2014 – 18 October 2014Serving with Saleh al-Mutlaq and Baha Araji[1]Prime MinisterHaider al-AbadiPreceded byHussain al-ShahristaniRowsch ShawaysSucceeded byRowsch ShawaysMinister of FinanceIn office18 October 2014 – 21 September 2016Prime MinisterHaider al-AbadiPreceded byNajeeba Najeeb (acting)Succeeded byAbdul Razzaq al-Issa (acting)Minister of Foreign AffairsIn o...

 

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (مارس 2019) روجر ديكنسون (بالإنجليزية: Roger Dickinson)‏    معلومات شخصية الميلاد 22 سبتمبر 1950 (73 سنة)  نيو هيفن، كونيتيكت  مواطنة الولايات المتحدة  الحياة العملية المد

У Вікіпедії є статті про інші значення цього терміна: Норрботтен (значення). Норрботтен (ландскап) Landskap Norrbotten Герб Норрботтену   Країна  Швеція Регіон: Норрланд Лени: Норрботтен Площа 26 671 км² Норрботтен (швед. Landskap Norrbotten) — історична провінція (ландскап) у північ...

 

第三十一届夏季奧林匹克運動會女子單人愛斯基摩艇輕艇激流比賽比賽場館奧運白水體育場日期8月8日、11日参赛选手21位選手,來自21個國家和地區奖牌获得者01 ! 玛亚伦·乔劳特  西班牙02 ! 盧卡·瓊斯(英语:Luuka Jones)  新西兰03 ! 傑茜卡·福克斯  澳大利亚← 20122020 → 2016年夏季奧林匹克運動會輕艇比賽 輕艇靜水 愛斯基摩艇 200公尺單人 ...

 

Al2(SO4)3كبريتات الألومنيوم لها الصيغة الكيميائية Al 2 (SO 4 ) 3 . شكل سداسي هيدرات كبريتات الألومنيوم هو Al 2 (SO 4 ) 3 · 16 H 2 O. الصيغة الكيميائية هي طريقة موجزة للتعبير عن عدد الذرات ونوعها التي يتكون منها مركب كيميائي معين.[1][2][3] وهي تعبر عن كل عنصر برمزه الكيميائي، وتكتب بجوا

العلاقات الموريتانية المالية مالي موريتانيا يُشير مصطلح العلاقات الموريتانية المالية إلى العلاقات التي تربط بين دولتي مالي وموريتانيا. التاريخ منذ انتهاء خلاف موريتانيا مع مالي على الحدود عام 1963 والعلاقات بين البلدين كانت في الغالب ودية.[1] تعاونت مالي وموريتانيا على

 

  víbora de Orsini Vipera ursinii var. macrops.Estado de conservaciónVulnerable (UICN 3.1)[1]​TaxonomíaReino: AnimaliaFilo: ChordataClase: SauropsidaSubclase: DiapsidaOrden: SquamataSuborden: SerpentesFamilia: ViperidaeSubfamilia: ViperinaeGénero: ViperaEspecie: V. ursiniiBonaparte, 1832Distribución [editar datos en Wikidata] La víbora de Orsini (Vipera ursinii) es una víbora de Europa poco agresiva, de la familia de Viperidae, descrita por primera vez en la I...

 

1970 studio album by Charlie DanielsCharlie DanielsStudio album by Charlie DanielsReleased1970StudioWoodland Studios, East Nashville, TennesseeGenre Southern rock[1] hard rock[1] blues[2] country rock[2] Length37:13LabelCapitol[3]ProducerJerry Corbitt, Dave NivesCharlie Daniels chronology Charlie Daniels(1970) Te John, Grease, & Wolfman(1972) Charlie Daniels is the debut album of American musician Charlie Daniels. It was released in 1970 cou...

Ukrainian medical doctor and public figure Marian Panchyshyn in the middle Marian Panchyshyn, Ukrainian: Мар'я́н Панчи́шин (1882 in Lviv, Austria-Hungary - October 9, 1943 in Munich, Germany) was a Ukrainian medical doctor and public figure. He was both member of a healing organization, and vice-president of the Ukrainian Republic proclaimed on June 30, 1941. Medical career Markian Panchyshyn was a member of the social network Narodna Lichnytsia ({lang-ua:Народна Ліч...

 

يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (فبراير 2016) العقرمي تقسيم إداري البلد  اليمن مديرية مديرية مذيخره المسؤولون محافظة محافظة إب السكان التعداد السك...

 

モト98 橿原神宮前 近鉄モト2720形電車(きんてつモト2720がたでんしゃ)は近畿日本鉄道が製造した事業用電車の1形式である。 改番・改造を経て2両全車がモト90形として現存する。 概要 大阪線の保線作業の近代化および迅速化のため、定尺レールなどの保線用資材輸送用としてモト2721・2722の2両が1960年11月2日竣工として近畿日本鉄道の子会社である近畿車輛で製造さ...

1961 film by Michael Anderson This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: The Naked Edge – news · newspapers · books · scholar · JSTOR (June 2012) (Learn how and when to remove this template message) The Naked EdgeDirected byMichael AndersonScreenplay byJoseph StefanoBased onFirst Train to Babylon1955 no...

 

Television and radio series This article is about the drama anthology series. For other uses, see Ford Theatre (disambiguation). This article uses bare URLs, which are uninformative and vulnerable to link rot. Please consider converting them to full citations to ensure the article remains verifiable and maintains a consistent citation style. Several templates and tools are available to assist in formatting, such as reFill (documentation) and Citation bot (documentation). (September 2022) (Lea...

 

The cove, seen from the church ruins. Church Ope Cove is a small secluded beach on the sheltered eastern side of the Isle of Portland in Dorset, southern England, and is part of the Jurassic Coast.[1][2] It is found close to the village of Wakeham. The beach has many unusual features for the Isle of Portland. The beach used to be sandy, but quarry debris now covers the sand, and has been worn into rounded pebbles. The pebbles cover a small stream which runs to the sea, which i...

Russian journalist and propagandist (born 1963) In this name that follows Eastern Slavic naming conventions, the patronymic is Rudolfovich and the family name is Solovyov. Vladimir SolovyovSolovyov in 2020Владимир Соловьёв Born20 October 1963 Moscow EducationCandidate of Economic Sciences Alma materNational University of Science and Technology MISiS OccupationTelevision presenter Partner(s)Svetlana Abrosimova AwardsTEFI (2005, 2017)O...

 

Budget smartphone This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Samsung Wave 525 – news · newspapers · books · scholar · JSTOR (November 2020) (Learn how and when to remove this template message) The Samsung Wave 525, also known as the Samsung S5250 or the Samsung Wave 2,[1] is a smartphone which w...

 

American artist and internet celebrity (born 1976) For the Stanford professor, see Mark Horowitz. This article uses bare URLs, which are uninformative and vulnerable to link rot. Please consider converting them to full citations to ensure the article remains verifiable and maintains a consistent citation style. Several templates and tools are available to assist in formatting, such as reFill (documentation) and Citation bot (documentation). (September 2022) (Learn how and when to remove this ...

James Clay James Clay (20 December 1804, London – 26 September 1873, Brighton)[1] was an English politician and a leading whist authority.[2] Early life and education Clay was born in Bloomsbury, London, son of merchant James Clay (1764–1828) and Mary (1766/7–1840). He was educated at Winchester College, then went up to Balliol College, Oxford, where he took a gentleman's third in classics.[3][4] Career Clay was MP for Kingston upon Hull from July 1847 un...

 

Не следует путать с Университетом штата Огайо. Университет Огайоангл. Ohio University Девиз лат. Religio Doctrina Civilitas, Prae Omnibus Virtusангл. Religion, Learning, Civility; Above All, Virtue Основан 1804 Тип государственный Целевой фонд $580,7 млн Президент Родерик Джи Мак-Дэвис Место расположения Атенс, Огайо...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!