<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ラムダ計算 &#8211; システム開発・AI導入なら株式会社taiziii（タイジー</title>
	<atom:link href="https://taiziii.com/column_cat/lambda-calculus/feed/" rel="self" type="application/rss+xml" />
	<link>https://taiziii.com</link>
	<description>事業理解に強いITコンサルタントとフルスタックエンジニアが、Webサービス・アプリ・業務システムを戦略設計から実装・保守運用まで一気通貫で支援。AI活用や内製化支援で成果に直結する開発を実現します。</description>
	<lastBuildDate>Wed, 19 Feb 2025 16:26:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://taiziii.com/wp-content/uploads/2023/10/favicon.ico</url>
	<title>ラムダ計算 &#8211; システム開発・AI導入なら株式会社taiziii（タイジー</title>
	<link>https://taiziii.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>関数型プログラミング入門 4 （型付ラムダ計算編）</title>
		<link>https://taiziii.com/column/399/</link>
		
		<dc:creator><![CDATA[THiNGMAjiG_admin_user_kato]]></dc:creator>
		<pubDate>Thu, 10 Aug 2023 12:33:09 +0000</pubDate>
				<guid isPermaLink="false">https://taiziii.com/?post_type=column&#038;p=399</guid>

					<description><![CDATA[今回は、関数型プログラミングに関する内容だね！ 前回に引き続き、関数型プログラミングの理論的背景について一緒に学んでいきましょう！ 本記事で学べること ・型付ラムダ計算 はじめに 関数型プログラミング入門 3 でラムダ計 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="balloonWrap">
<div class="balloon2-left">
<p>今回は、関数型プログラミングに関する内容だね！</p>
</div>
<div class="balloon2-right">
<p>前回に引き続き、関数型プログラミングの理論的背景について一緒に学んでいきましょう！</p>
</div>
</div>
<h2>本記事で学べること</h2>
<p>・型付ラムダ計算</p>
<h2>はじめに</h2>
<p>関数型プログラミング入門 3 でラムダ計算の学習を終え、型付ラムダ計算について学ぶ準備ができたと思います。それでは早速、型付ラムダ計算について説明していきましょう。</p>
<p>&nbsp;</p>
<p><span style="font-size: 8pt;">(ラムダ計算に関してはこちらをチェック↓)</span></p>
<p><span style="color: #3366ff;"><a style="color: #3366ff;" href="https://taiziii.com/column/392/" target="_blank" rel="noopener">関数型プログラミング入門 3（ラムダ計算編）</a></span></p>
<h2>型付ラムダ計算</h2>
<p>型付ラムダ計算とは、ラムダ項に型をつけた形で計算を行うことをいいます。型は、基本型か、型 A, B を用いて A → B の形をした関数の型に分けられ、基本型には、例えば、整数の型 i や真偽値の型 o などが用いられます。<br />
各変数にはその型が定まっているとします。例えば、変数 z の型は o で、変数 f の型は i → i という感じです。もし、変数 f の型が i → i で変数 a の型が i だった場合、fa の型は i になります。<br />
ここで、ラムダ項は変数をもとに抽象と適用によって作られることを思い出しましょう。したがって、抽象と適用に対して型を定める規則を用意すれば、各々のラムダ項に型を定めることができます。λa.M という抽象は、a の型が A で M の型が B であれば、A → B というように定まります。また、MN という適用は、M の型が A → B で N の型が A であれば、B という型が定まります。<br />
適用 MN に関しては、M の型が A → B という形をしていないか、もししていても N の型が A でない場合は型が定まらず、間違ったラムダ項になります。</p>
<h2>型と簡約</h2>
<p>ラムダ計算編のところで、β 簡約について学びました。ここで問題なのが、 β 簡約をしても型が保存されるのか、ということです。例えば、x, y, w の型を i として、(λx.λy.x)w というラムダ項を考えてみましょう。このとき、λx.λy.x の型は i → i → i で、w の型は i であるので、適用によって、(λx.λy.x)w の型は i → i となります。一方、(λx.λy.x)w を β 簡約した形が λy.w となります。このラムダ項の型も、同様に、i → i となり、 β 簡約前の型と一致します。一般に、ラムダ項の型は、β 簡約後も保存されます。これは、先の節で紹介した抽象と適用に対して型を定める規則が上手くできているためです。<br />
余談ですが、正規化定理によって、β 簡約の停止性が証明されています。つまり、β 簡約は必ず有限ステップで停止します。</p>
<h2>まとめ</h2>
<p>本記事では型付ラムダ計算について解説をしました。ぜひ、本記事の内容をもとにして、より良い関数型プログラムを書いて欲しいところです。また、型付ラムダ計算には、証明とプログラムを対応づけるカリー・ハワード対応という非常に面白い考え方があります。これは、プログラムの高品質化に関わっている、最近ホットな話題といえます。こちらも機会があれば紹介したいと思います。では、さようなら〜。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>関数型プログラミング入門 3（ラムダ計算編）</title>
		<link>https://taiziii.com/column/392/</link>
		
		<dc:creator><![CDATA[THiNGMAjiG_admin_user_kato]]></dc:creator>
		<pubDate>Wed, 09 Aug 2023 09:41:54 +0000</pubDate>
				<guid isPermaLink="false">https://taiziii.com/?post_type=column&#038;p=392</guid>

					<description><![CDATA[今回は、関数型プログラミングに関する内容だね！ 関数型プログラミングの理論的背景について一緒に学んでいきましょう！ 本記事で学べること ・ラムダ計算 はじめに 関数型プログラミング入門 2 では、関数型プログラミングの機 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="balloonWrap">
<div class="balloon2-left">
<p>今回は、関数型プログラミングに関する内容だね！</p>
</div>
<div class="balloon2-right">
<p>関数型プログラミングの理論的背景について一緒に学んでいきましょう！</p>
</div>
</div>
<h2>本記事で学べること</h2>
<p>・ラムダ計算</p>
<h2>はじめに</h2>
<p>関数型プログラミング入門 2 では、関数型プログラミングの機能面について見ていきました。そこで今回から、関数型プログラミングの理論的背景を学んでいこうと思います。目標は、型付ラムダ計算を理解することですが、その前にラムダ計算について学習することから始めましょう。型付ラムダ計算は、関数型プログラム言語の基盤であるため、これを理解することができれば、関数型プログラムの扱いが格段に上達すると思います。</p>
<h2>ラムダ計算</h2>
<h3>基本</h3>
<p>変数 a, b, c, … が与えられたとき、次のような表現をラムダ項といいます。</p>
<p style="text-align: center;">a (λa.M) (MN)</p>
<p>ただし、M, N もそれ自体ラムダ項とします。 (λa.M) の形のラムダ項を抽象、(MN) の形のラムダ項を適用といいます。(MN) は、関数 M を入力 N に対して使うことに相当します。また、λ の横にある変数は束縛変数といい、それ以外の変数を自由変数といいます。例えば、(λa.ab) の中で a は束縛変数、b は自由変数です。λa は述語論理の ∃x や ∀x と同じようなものだと理解して構いません。<br />
ラムダ項で使われるカッコは適宜省略することにしましょう。例えば、MNK は (MN)K を意味します。また、λa.λb は λab と表記することにします。<br />
&nbsp;</p>
<h3>計算のルール</h3>
<p>計算は次のように行われます。</p>
<p style="text-align: center;">(λa.M(a))N →β M(N)</p>
<p>λa から始まるラムダ抽象に値 N が適用されたら、変数 a に N を代入します。ここで、左側の項を β 基といい、これを右側に書き換えることを β 簡約といい、→β　で表します。 β 基をどんどん簡約していくことが、ラムダ項の計算法です。</p>
<p>&nbsp;</p>
<h3>具体例</h3>
<p>ここからは、色々な計算の具体例を見ていって、ラムダ計算に慣れていきましょう。<br />
まず、ラムダ計算における真偽の表し方を紹介します。</p>
<p style="text-align: center;">T := λab.a F : = λab.b</p>
<p>最初の引数である a を返すのが T で、後の引数である b を返すのが F です。具体的には、</p>
<p style="text-align: center;">T M N ≡ (λab.a) M N →β (λb.M) N →β M<br />
F M N ≡ (λab.b) M N →β (λb.b) N →β N</p>
<p>(λb.M) N →β M では、変数 b が M に含まれないとして、単に N を消去しています。<br />
次に、関数の合成を見ていきましょう。M と N を関数として見ると、N の出力を M に渡せばいいから、</p>
<p style="text-align: center;">M ○ N := λa.M(Na)</p>
<p>と表せます。3つの関数の合成ならば、</p>
<p style="text-align: center;">M ○ N ○ K := λa.M(N(Ka))</p>
<p>となります。<br />
次に、自然数の表現について説明します。ラムダ計算では、自然数 0, 1, 2, 3, … を</p>
<p style="text-align: center;">λfa.a, λfa.fa, λfa.f(fa), λfa.f(f(fa)), …</p>
<p>を表します。これらをチャーチ数項といいます。省略表現として、</p>
<p style="text-align: center;">0, 1, 2, 3, …</p>
<p>として表すこともあります。チャーチ数項 n を用いれば、「P から出発して Q を n 回繰り返すこと」を n P Q で表すことができます。例えば n が 3 の場合は、次のようになります。</p>
<p style="text-align: center;">3 Q P ≡ λfa.f(f(fa)) Q P →β λa.Q(Q(Qa)) →β Q(Q(Q P))</p>
<p>合成の記号 ○ を用いれば、チャーチ数項 n は</p>
<p style="text-align: center;">λf. f ○ ・・・ ○f (n回)</p>
<p>と書くこともできます。つまり、「与えられた関数を n 回合成すること」として 自然数 n を表しています。<br />
また、足し算や掛け算は次のように定義できます。</p>
<p style="text-align: center;">M + N := λg.Mg ○Ng<br />
M・N := λg.M Ng</p>
<p>足し算では、M と N がチャーチ数項の場合、「g を M 回繰り返した関数」と 「g を N 回繰り返した関数」の合成であるため、全体は「g を M + N 回繰り返した関数」となっています。掛け算では、掛け算では 関数が M・N 回出てくることがわかります。一応、具体例を見ておきましょう。</p>
<p style="text-align: center;">2 + 3 ≡ λg.(λf.f ○ f)g ○ (λf.f ○ f ○ f)g →β λg.(g ○ g) ○ (g ○ g ○ g) →β λg. g ○ g ○ g ○ g ○ g ≡ 5</p>
<p style="text-align: center;">2・3 ≡ λg.(λf.f ○ f)((λf.f ○ f ○ f)g) →β λg.(λf.f ○ f)(g ○ g ○ g ) →β λg.(g ○ g ○ g ) ○ (g ○ g ○ g ) →β λg.g ○ g ○ g ○ g ○ g ○ g ≡ 6</p>
<h2>まとめ</h2>
<p>本記事では、ラムダ計算について解説しました。これで型付ラムダ計算の説明に入る準備ができたと思います。ということで、次回は型付ラムダ計算の仕組みについて書いていきます。お楽しみに！</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
