Solutions · Part 6
第6部 依存型と型システム
第31–41章 · 33問
第31章
型族・依存関数型・依存対型
問題本文問題1定数族から通常の関数と対を復元する
Problem
問題
章本文の位置で見る型族 B : A → Type が定数関数 fun _ => C である場合、依存関数型と依存対型がそれぞれ
通常の A → C と A × C に対応することを、Π型・Σ型の数式とLeanの型の双方で示せ。
対応が定義的等しさなのか、同値による同一視なのかも確かめること。
defaultPayload false と defaultPayload true の型と値を計算し、同じ関数の結果型が入力値に
応じて変わることを確認せよ。通常の関数型だけではこの型をどう近似することになるかも述べる。
ヒント
型族 B : A→Type を B a=C という定数族にします。
解答
依存関数型 (a:A)→B a でBが定数Cなら、返り値型は入力に依存せず通常の A→C です。依存対型
(a:A)×B a も通常の積 A×C になります。従ってΠ型とΣ型は関数型と積型を含む一般化です。ただし構文上の
定数族と定義的に同じか、同値を介して定数かは区別します。後者では明示的な輸送が必要な場合があります。
論理ではΠを全称量化、Σを証人を保持する存在として読み、非依存の場合との連続性を確認します。
問題2依存対を作り、添字に沿って除去する
Problem
問題
章本文の位置で見るpack の第二引数の型を明示し、第一引数を false と true に特殊化した型を別々に書け。
次に Payload の任意のファイバーの値を Sigma Payload に包む関数を定義し、その結果を
showPayload と同じ仕方で場合分けして利用せよ。
各分岐で第二成分の型がどのように精密化されるかを説明する。単にタグと値を格納するのではなく、 タグが値の型を決定し、除去時にもその関係が保存されることを示せれば完了である。
ヒント
Σn:Nat, Vector A n の第一射影で長さ、第二射影でその長さのベクトルを得ます。
解答
三要素ベクトル v : Vector A 3 から ⟨3,v⟩ : Σn,Vector A n を作れます。入力pを場合分けして
⟨n,xs⟩ とすれば、結果型の中でもnとxsの対応を保ったまま利用できます。例えば xs の長さを再び添える関数は
fun ⟨n,xs⟩ => ⟨n,xs⟩ です。第一射影だけを先に忘れると第二成分の型を記述できないため、依存消去は対を
一緒に開きます。
パーサが「長さとその長さの配列」を返すAPIでは、Σ型により整合性を返り値へ保存できます。
問題3論理的存在と計算データを比較する
Problem
問題
章本文の位置で見る∃ x, p x と Sigma fun x => p x を、形成・導入・除去・宇宙の四点から比較せよ。証人を使って
新たなデータを計算する関数を一つ作り、命題の証明消去に課される制限と対照する。
両者をどちらも「証人と証拠の組」と説明できる一方、Leanで交換可能とは限らない。情報を消去して よい命題と、実行時にも保持したいデータの違いを具体例に即して述べること。
ヒント
Leanの Exists はProp、Sigma はTypeに属することから消去先の違いを見ます。
解答
∃x:A,P x は証明の存在を主張し、証明無関連性とPropからの消去制限の下で扱われます。Σx:A,B x は第一成分と
第二成分を計算データとして保持し、任意のTypeを返す関数で分解できます。存在証明から一般のプログラムとして証人を
抽出できるとは限りません。構成的証明が具体的な証人を作っていても、公開するインターフェースをPropにするかTypeに
するかで利用可能性が変わります。
仕様の充足だけが必要なら命題、後続計算が証人を使うなら依存対というAPI設計基準にします。
def witnessFromSigma (value : Sigma fun n : Nat => Fin (n + 1)) : Nat :=
value.1
def payloadFromSigma (value : Sigma fun n : Nat => Fin (n + 1)) : Fin (value.1 + 1) :=
value.2
example : witnessFromSigma ⟨2, 1⟩ = 2 := rfl第32章
同一性型・輸送・外延性原理
問題本文問題1`J` から対称性と推移性を再構成する
Problem
問題
章本文の位置で見るinverse と concatenate を直接のパターンマッチを使わず、J だけから定義してください。motiveの
各引数がどの端点と経路に依存するかを通常の型理論記法で書きます。反射の場合の計算結果を rfl で検査し、
導入規則一つから群oid的操作二つが導かれる依存を説明できれば完了です。
ヒント
等式証明を refl の場合へ帰着し、その場合の返り値を指定します。
解答
対称性は p:x=y を消去し、目標 y=x を x=x へ帰着して refl x を返します。推移性は
p:x=y を消去した後、q:y=z が q:x=z となるのでqを返せます。どちらも等式の唯一の導入子reflに対する
場合を与えたJの特殊化です。等式連鎖の法則も等式証明へ帰納すればreflの場合の計算へ還元されます。
輸送、合同性、置換原理をすべてJから導き、どれをライブラリの基本APIにするか比較します。
問題2ベクトルの長さ等式に沿って輸送する
Problem
問題
章本文の位置で見るVector α n と等式 p : n = m から Vector α n → Vector α m を transport で定義してください。
p が反射の場合の計算を確認し、連結した等式に沿う二回の輸送と、連結後の一回の輸送が命題的に等しい
ことを証明します。どの等式が判断的に成立し、どこで経路帰納法が必要か分類してください。
ヒント
型族 P(k)=Vector A k に等式 p:n=m を使います。
解答
v:Vector A n と p:n=m から transport P p v : Vector A m を得ます。pがreflなら輸送結果は定義的にvです。
一般のpではデータの要素を変更せず、型が参照する添字だけを同一視に沿って替えます。n+0=n の証明で
Vector A (n+0) を Vector A n へ直す例では、等式の向きに応じてpまたは対称性pを選びます。
圏の対象等式に沿う射の型変更など、依存する構造を添字同一視に沿って移す操作へ一般化します。
問題3四つの外延性原理を比較する
Problem
問題
章本文の位置で見る関数外延性、命題外延性、等式反映、一価性について、仮定と結論を型判断で書いてください。Leanで
利用できる形、追加原理が必要な形、Leanの Prop による証明無関連性と緊張する形を区別します。
一つを仮定しただけで別の原理まで得たとする誤った推論を作り、不足する前提を指摘すれば完了です。
ヒント
命題外延性、関数外延性、商健全性、一価性がどの種類の同値を等式へ送るかを書きます。
解答
命題外延性は P↔Q から P=Q、関数外延性は ∀x,f x=g x から f=g を与えます。商健全性は基礎関係
r a b を商内の等式へ送ります。一価性は型同値 A≃B を宇宙内の等式 A=B と対応させます。対象の層は
命題、関数、商の代表、型と異なり、互いを名前だけで代用できません。Leanでどれが定理・公理・商構成の規則かも
区別します。
外延的な数学を形式化するときは必要な等式原理を最小限にし、計算可能性への影響を記録します。
#check funext
#check propext
#check Subsingleton.elim第33章
純粋型システム・ラムダ・キューブ・構成計算
問題本文問題1PTSの規則から依存の許可範囲を読む
Problem
問題
章本文の位置で見るヒント
積形成規則 (s₁,s₂,s₃) が、どのソートの項へ依存する型をどのソートに作るかを表します。
解答
PTSはソート、基礎公理 s₁:s₂、積形成三つ組で指定されます。規則 (s₁,s₂,s₃) があれば、
Γ⊢A:s₁ と Γ,x:A⊢B:s₂ から Γ⊢Πx:A.B:s₃ を作れます。したがって依存の可否はΠの見た目ではなく
この三つ組により決まります。項から項、型から項、項から型、型から型という二軸を分類すると、ラムダ・キューブの
各頂点を復元できます。
新しい型理論を比較するときは表面構文ではなく、宇宙公理とΠ形成規則の差として整理します。
問題2ラムダ・キューブを暗記せず復元する
Problem
問題
章本文の位置で見るラムダ・キューブの三軸を「何が何に依存するか」という文で表し、各軸を追加したときに初めて
書ける代表的な型を一つずつ挙げよ。その記述から λP2、λPω、λω の機能を表を見ずに復元し、
八頂点を包含関係に従って配置する。
ポリモーフィック恒等関数と、型構成子を引数に取る高階演算を別々の軸へ分類せよ。両者を単に 「ジェネリック」と呼ぶと失われる区別を、束縛変数のsortから説明すること。
ヒント
単純型付きラムダ計算から、三種類の依存を独立なスイッチとして加えます。
解答
三軸は項に依存する型、型に依存する項である多相性、型に依存する型である型演算子です。スイッチなしが 単純型付きラムダ計算、各一軸を加えた体系、その組合せ四つで八頂点になります。全軸を許す頂点が構成計算であり、 依存型とインプレディカティブな命題を統合する基礎になります。頂点名を暗記するより、許されるΠ型の例を一つずつ 作れば位置を再構成できます。
宇宙階層や帰納型は元の三軸に含まれないため、現代の証明支援系をキューブだけで分類し尽くさないようにします。
問題3体系の規則とメタ定理を切り分ける
Problem
問題
章本文の位置で見る型形成規則を列挙することと、その体系について保存、合流性、強正規化を証明することを区別せよ。 各メタ定理が何を量化し、どの簡約関係に依存するかを書き、ある規則集合から自動的に全てが従う わけではない理由を述べる。
CoC、CIC、Lean 4の差を比較する。少なくとも帰納型、宇宙、計算・再帰の扱いを比較項目に含める。LeanがCoCの 系譜にあるという歴史的説明を、LeanのkernelがCoCそのものであるという同一視へ強めてはならない。
ヒント
判断を生成する規則と、その規則すべてについて外側から証明する性質を分けます。
解答
変数・Π形成・抽象・適用・変換は体系内部の型付け規則です。弱化・代入・主部簡約は構文に関するメタ定理です。 型保存・強正規化・無矛盾性も規則から証明するメタ定理です。例えば変換規則があることと変換可能性が決定可能であることは別です。後者には 正規化や合流性が必要です。メタ定理を規則として無条件に追加すると、循環した「証明」になり得ます。
Leanのカーネル機能と、Lean自身について外部で証明・検証される健全性主張を同じ基準で区別します。
第34章
部分型と篩型
問題本文問題1値と性質を一つの項として構成する
Problem
問題
章本文の位置で見るone : PositiveNat の値成分と証明成分を指し、PositiveNat を Nat へ射影したとき何が失われるか
を説明せよ。二つの正の自然数の和を再び PositiveNat として返す関数を定義し、値の計算と閉性の
証明を分けて記述する。
対照として {n : Nat // n < 0} の項を構成しようとし、失敗が自然数の値の不足ではなく証明成分の
不可能性に由来することを構成子の型から示す。
ヒント
自然数nと証明 n<5 を部分型の構成子へ同時に渡します。
解答
BelowFive := {n : Nat // n < 5} とすると、⟨3, by decide⟩ : BelowFive です。第一射影 .val は3、第二射影
.property は 3<5 の証明です。二つの値 x y : BelowFive の等しさには、基礎値 x.val=y.val を示せば
部分型外延性を使えます。証明成分を個別に比較する必要がないのは、命題の証明無関連性によります。
正規化済み構文、範囲内添字、単調関数など、値と不変条件を同じAPI境界で受け渡せます。
abbrev Positive := {n : Nat // 0 < n}
def addPositive (left right : Positive) : Positive :=
⟨left.1 + right.1, by omega⟩
example : (addPositive ⟨2, by decide⟩ ⟨3, by decide⟩).1 = 5 := rfl
theorem noNegativeNatural (impossible : {n : Nat // n < 0}) : False := by
omega補足
部分型上の演算では、第一成分の値と、結果が再び述語を満たす第二成分を別々に構成します。正の自然数同士の加算なら 値は通常の加算で作り、正値性は入力の証明から示します。空な部分型を示すときは候補値の探索ではなく、任意の候補に 要求される証明成分が矛盾することを示します。専用帰納型では不変条件を構成子の形で保つため、同じ性質でも除去原理と 定義的計算が変わります。
問題2検査から精密な型へ移す
Problem
問題
章本文の位置で見るtoPositive? の成功・失敗の各分岐で得られる仮定を展開し、実行時の比較結果が後続の証明でどう
使われるかを追え。入力が正なら証明付きの値を返し、そうでなければ失敗の理由を返す改良版を設計し、
結果型が保持する情報を比較する。
述語を判定することと、述語の証明を型の成分として保存することを区別せよ。全ての述語が計算可能な 判定手続きを持つわけではない点も、構成と検証を混同せずに説明すること。
ヒント
ブール値だけでなく、成功時に境界証明を含む Option を返します。
解答
checkBelow (b n : Nat) : Option {k : Nat // k < b} を、if h:n<b then some ⟨n,h⟩ else none と定義します。
成功分岐の呼出し側はnと証明を受け取り、その後の添字操作で境界検査を繰り返しません。完全性は
n<b → ∃x, checkBelow b n=some x、健全性は checkBelow b n=some x → x.val=n ∧ x.val<b です。
単なるBool検査では後者の証拠が返り値に保存されません。
パーサや入力検証でも、検査結果を精密な型へ昇格させるスマートコンストラクタを公開します。
問題3三つの精密化表現と研究史を比較する
Problem
問題
章本文の位置で見る偶数を、述語集合、Leanの部分型、偶数専用の帰納型で表現し、構成・除去・計算・証明の再利用を 比較せよ。同じ外延を表していても、どの情報を構文へ組み込むかで帰納原理と定義的計算が変わる。
さらに [FP91] の篩型とLeanの Subtype を、基礎言語、型検査、証明項の保持の三点で
比較する。「篩型」は広い研究領域の標準訳として用いつつ、特定の体系とLeanの一構成子を同一視
しない記述にすること。
ヒント
部分型、篩型言語、依存対を「証明の保持」「自動推論」「計算データ」の軸で比較します。
解答
Leanの部分型 {x:A // P x} は値とPropの証明を保持します。篩型体系は基礎型へ論理式を付し、部分型付けとSMTなどで
検査を自動化する設計が中心です。Σ型 Σx:A,B x は第二成分が任意のTypeに属し、計算データも保持できます。
歴史的には集合内包的な型の発想から、Freeman–Pfenningの篩型、Liquid Typesの決定可能な述語テンプレートへ展開しました。
同じ記法に見えても証明対象、消去規則、自動化の境界が異なります。
ライブラリ設計では、任意命題を扱う柔軟性と自動推論可能な論理断片のどちらを優先するか明記します。
第35章
添字付き帰納族
問題本文問題1構成子の結果型から不可能な場合を読む
Problem
問題
章本文の位置で見るVector.nil と Vector.cons の型を展開し、α がパラメータ、長さが添字であることを説明せよ。
Vector.nil が Vector α 1 を作れない理由を結果型から示し、head と tail に空ベクトルの
分岐が存在しない理由を入力型へ戻って説明する。
長さ 0 のベクトルから任意の命題を導くのではなく、長さ 1 の入力を除去すると空の構成子が
候補にならない、という依存パターンマッチの働きを正確に述べること。
ヒント
Vector.nil の結果添字は0、cons は後者なので、空ベクトルにconsの場合はありません。
解答
head : Vector A (n+1)→A を定義するとき、入力は cons a xs の形しか取りません。nil の結果型
Vector A 0 と要求型 Vector A (n+1) は構成子の非交差性により一致しないからです。これは実行時の長さ検査で
分岐を捨てるのではなく、型付けされた入力の構成可能性から分岐自体を除去しています。不可能性は添字等式
0=n+1 の矛盾としても読めます。
型付き構文の評価器では、式の型添字から加算式を関数として扱うような不正分岐を排除できます。
問題2添字保存をプログラムの型で検査する
Problem
問題
章本文の位置で見るmap の各分岐を追い、入力と出力の長さが一致する根拠を構成子の型まで遡れ。二つの関数を順に
写すプログラムを定義し、map g (map f xs) = map (g ∘ f) xs をベクトルの帰納法で証明せよ。
等式の両辺がそもそも同じ型をもつことと、値として等しいことを分けて記述する。前者は添字保存、 後者は関数法則であり、型検査だけで後者まで得られるわけではない。
ヒント
ベクトルのmapとappendについて、入力と出力の長さを型に残します。
解答
map : (A→B)→Vector A n→Vector B n は長さnを保存します。nil分岐では0、cons分岐では帰納呼出しがnを保存し、
consが両辺を後者へ送ります。append : Vector A m→Vector A n→Vector A (m+n) では第一入力へ再帰します。
nil分岐の結果型は 0+n=n、cons分岐では帰納結果の長さ m+n を一つ増やして (m+1)+n と一致させます。
行列積を内側次元が一致する型に限定すれば、次元不一致を実装の分岐ではなく呼出し時に排除できます。
問題3帰納族と部分型による表現を比較する
Problem
問題
章本文の位置で見るVector α n と {xs : List α // xs.length = n} について、値の構成、先頭の除去、連結、等式の
証明を比較せよ。同じ数学的対象を表し得ても、計算時に現れる等式輸送と帰納原理の形が異なる。
少なくとも一つの操作を両表現で実装し、どちらで長さの整合性が構成子により自動化され、どちらで 証明成分を明示的に運ぶ必要があるかをコード上で指摘せよ。
ヒント
Vector A n と {xs : List A // xs.length=n} の構成子と帰納原理を比較します。
解答
二つの表現はデータとして対応し、リストから長さ証明付き値を作り、ベクトルから要素列を忘却できます。部分型表現では リストの既存APIを再利用できますが、操作ごとに長さ証明を運びます。帰納族ではnilとconsの結果添字が定義に組み込まれ、 添字に精密な帰納原理が得られます。一方、基礎データを直接取り出すには変換が必要です。単なる同型性だけで、生成される 消去規則や定義等式まで同一とは限りません。
既存データ構造へ不変条件を後付けする場合と、不変条件が再帰構造を決める場合で表現を選びます。
open FormalLab.TypeTheory.IndexedFamilies
def ListVector (α : Type) (n : Nat) := {items : List α // items.length = n}
def mapListVector (function : α → β) (items : ListVector α n) : ListVector β n :=
⟨items.1.map function, by simpa using items.2⟩
def mapIndexedVector (function : α → β)
(items : FormalLab.TypeTheory.IndexedFamilies.Vector α n) :
FormalLab.TypeTheory.IndexedFamilies.Vector β n :=
map function items第36章
一般帰納族・除去規則・厳密正値性
問題本文問題1`Expr` の除去原理を規則から復元する
Problem
問題
章本文の位置で見るExpr.rec の型を調べる前に、motiveと四構成子の場合の型を通常の依存型記法で予想してください。
その後Leanが生成したrecursorと比較し、let本体の帰納仮定だけが n+1 のファイバーに属することを
確認します。evaluate の各分岐をrecursorの引数へ対応づければ完了です。
ヒント
各構成子について、再帰引数のすべてに帰納仮定を置いた場合を一つずつ作ります。
解答
Expr τ に自然数、真偽値、加算、条件分岐があるなら、動機は P : ∀τ,Expr τ→Prop です。定数の場合を二つ、
加算では二つの部分式への帰納仮定から結果を、条件分岐では条件と両枝への三つの帰納仮定から結果を示します。
結論は ∀τ(e:Expr τ),P τ e です。添字τを動機に残すことで、各構成子の型制約を場合の中で利用できます。
相互・入れ子帰納型では単純な構成子一覧だけで足りない場合があり、生成された原理を必ず検査します。
問題2名前変更と環境評価の可換性を証明する
Problem
問題
章本文の位置で見る名前変更 ρ : Fin n → Fin m と二環境が environment₁ i = environment₂ (ρ i) を満たすとします。
evaluate environment₂ (rename ρ expression) = evaluate environment₁ expression を式の帰納法で証明してください。
let分岐で環境拡張間の対応を補題として分離し、束縛変数と外側の変数の二場合を示せば完了です。
ヒント
式へ変数写像ρを適用する操作と、環境をρに沿って前合成する操作を対応させます。
解答
主張は eval env (rename ρ e)=eval (env∘ρ) e です。eへの構造帰納で示します。変数の場合は定義から両辺が
env (ρ x)。定数は不変です。加算や条件分岐ではrenameとevalを構成子ごとに展開し、部分式への帰納仮定で
書き換えます。添字付きExprならrenameが変数の型を保つ写像であることも型に現れます。
代入補題は環境に式を割り当てる名前変更の一般化として、同じ自然性の図式から導けます。
問題3正値性の境界例を分類する
Problem
問題
章本文の位置で見る次の五形を Shape で表してください:X × X;A → X;X → A;(X → A) → A;
(A → X) → X。それぞれの再帰出現について極性を根から追跡します。Bool判定の結果だけでなく、
関数入力を通るたびに符号が反転する経路を
注記します。Leanの実際の帰納宣言として受理されるかを別に調べ、差があれば簡略コードの限界を説明します。
ヒント
定義中の型Xが関数矢印の左を通る回数で極性を追います。
解答
X↦A×X と X↦A+(B→X) ではXは正の位置なので帰納型を作れます。X↦X→A では矢印の始域にあり負です。
X↦(X→A)→A では二回反転して正ですが、厳密正値性検査はXを含む関数型全体が構成子引数の始域に現れるため
拒否するのが一般的です。厳密正値性は単なる符号計算より強く、生成される再帰子の健全性と単調な型作用素を保証する
構文的条件です。
高階抽象構文では負の出現が自然に現れるため、単調性証明や別の表現を使う必要があります。
第37章
W型・整礎木・多項式的帰納型
問題本文問題1形と位置から三種類の木を設計する
Problem
問題
章本文の位置で見る二分木、有限分岐木、各節点が自然数個の子を持つ木について、形型 A と位置族 B を定義してください。
葉と内部節点の位置型を具体化し、それぞれの W A B の値を二層以上構成します。存在しない子を要求する
式が型付けできない理由を位置型から説明します。三つの符号化について、節点ラベル、分岐数、部分木を
格納する関数の始域を同じ表で比較すれば完了です。
ヒント
W型 sup : (a:A)→(B a→W A B)→W A B でAを節点形、B aを子位置と読みます。
解答
自然数では形を zero|succ、位置をzeroで空、succで一要素にします。二分木では葉と節を形にし、葉の位置を空、
節の位置をBoolにすれば左右二子を表せます。有限多分木では形を子数n、位置を Fin n とします。形aを選んだ後に
位置型B aが決まる依存性により、構成子ごとに異なる分岐数を一つのW型で表せます。
構文木やコンテナ型を形と位置へ分解すると、map・fold・導関手的操作を一様に設計できます。
問題2Wリストと通常のリストを往復する
Problem
問題
章本文の位置で見るList α → WList α と WList α → List α を定義し、両合成が恒等であることを各側の帰納法で証明してください。
W側の証明で関数として格納された唯一の子をどう扱うかを示します。長さが相互変換で保存されることも導き、
符号化と定義的同一性の差を説明します。各逆法則が rfl だけでは終わらない分岐を特定し、そこで使う
帰納仮定と関数外延性の有無を記録すれば完了です。
ヒント
形を none|some a、位置をそれぞれ空型と一要素型にします。
解答
Wリストのnilは sup none と空位置からの唯一関数、cons a xsは sup (some a) と唯一位置をxsへ送る関数です。
W型からListへはW帰納でnoneをnil、some aをconsへ送ります。逆向きはリスト再帰でこの二構成を使います。
往復が恒等であることは、それぞれW帰納法とリスト帰納法により、構成子の場合の計算規則へ還元されます。
同型だけでなくfoldとの可換性を示すと、表現を替えても再帰プログラムの意味が保存されます。
問題3foldを始代数の主張へ翻訳する準備をする
Problem
問題
章本文の位置で見るLayer A B X、roll、任意の algebra : Layer A B C → C を通常の多項式記法へ戻してください。
fold algebra が満たす可換方程式を fold_sup から導きます。さらに同じ方程式を満たす別関数がfoldと
等しいという一意性に必要な関数外延性とW帰納法を特定し、後の始代数定理の形を書けば完了です。
ヒント
W型を一層展開するF代数 in : F W→W と、任意の代数 α:F X→X を置きます。
解答
foldは fold α : W→X であり、方程式 fold α ∘ in = α ∘ F(fold α) を満たします。左辺は一層をWへ組み立てて
から再帰し、右辺は各子を再帰してからαで一層を処理します。W帰納法によりこの方程式を満たす写像は一意です。
従って (W,in) から任意のF代数への一意な代数射がfoldであり、これが始代数の普遍性です。
融合則は二つの代数射の合成と一意性から導き、再帰プログラム最適化の正当性へ接続できます。
第38章
高次同一性・一価性・ホモトピー型理論
問題本文問題1逆写像からファイバーの収縮を再構成する
Problem
問題
章本文の位置で見るisEquivOfInverse の中心と収縮経路を、Σ(x:A).f(x)=y の記法で書き直してください。収縮の証明を
congrArg、右辺の経路、左逆法則の三段に分け、どの等式が各段で向きを反転するかを示します。
自然数への後者関数では同じ構成が失敗するファイバーを挙げ、全射性だけでは可縮性に足りない理由を
説明すれば完了です。
ヒント
f:A→B の逆gとホモトピー f(g b)=b から、ファイバー中心 ⟨g b,ε b⟩ を選びます。
解答
b上のファイバーは Σa:A,f a=b です。中心を c_b=⟨g b,ε_b⟩ とします。任意の ⟨a,p⟩ へは、逆のもう一方の
法則 η_a:g(f a)=a とpに沿う輸送を組み合わせ、第一成分の道を作ります。Σ型の等式には、その道に沿って第二成分も
一致することが必要です。この整合性には逆データの随伴化、または等式帰納を使います。単なる左右逆の式から
ファイバー可縮性へ進む際、道の高次整合性が隠れている点が重要です。
写像が同値である定義を可縮ファイバーで与えると、合成や基底変換に安定な形で扱えます。
問題2一価性の主張を三つの弱い主張と比較する
Problem
問題
章本文の位置で見るA=B → A≃B、A≃B → A=B の単なる関数の存在、idToEquiv の全射性、idToEquiv が同値であることを
順に並べてください。各主張が前の主張へ何を加えるかをファイバーで述べます。Bool の恒等同値と
真偽反転を使い、Leanの Eq ではどの段階が破れるかを定理から再構成すれば完了です。
ヒント
型の等式から同値への標準写像 idtoequiv が何を満たすかを段階化します。
解答
同一の型が同値であることはreflから常に示せます。同値な型を交換して命題の真偽を保存することも、個別の輸送で
実現できます。骨格を選んで同値類ごとに代表を取る主張は選択を含み、型そのものの等式は与えません。一価性はさらに
idtoequiv : (A=B)→(A≃B) 自体が同値であると主張します。従って同値から道を作るだけでなく、その道空間の
高次構造まで同値空間と対応させます。
構造同一原理では、構造を保つ同型を構造の等式へ送るため、一価性と構造の同一性条件を組み合わせます。
問題3円周の除去原理に必要なデータを特定する
Problem
問題
章本文の位置で見る円周から型族 P:S¹→Type への依存関数を定義するため、base 上の点と loop に沿う輸送について
何を指定すべきかを書いてください。通常の帰納型の点構成子だけを二つ置く誤った符号化と比較します。
点の個数、経路の生成、計算規則の三項目で差を説明し、W型だけでは経路構成子を表さない理由を
示せば完了です。
ヒント
円周は点 base:S¹ と道 loop:base=base で生成されます。
解答
非依存再帰で f:S¹→X を作るには、点 x₀:X とループ p:x₀=x₀ を与えます。計算規則は
f base=x₀ と、loopへの作用 ap f loop=p です。依存消去で族 P:S¹→Type の切断を作るには
b:P base と、loopに沿う輸送がbをbへ戻す道が必要です。点の値だけでは生成するループの像を決められません。
高次帰納型では各点構成子に値、各道構成子に整合性を与えるという読み方を一般化します。
第39章
商型とwell-definedness
問題本文問題1関係を新しい等式へ送る
Problem
問題
章本文の位置で見るparitySetoid の関係成分と反射・対称・推移の証明成分を特定せよ。そのうえで
parityClass 1 = parityClass 3 を Quotient.sound から再構成し、元の自然数の等式ではなく、
商型上の等式が得られたことを説明する。
0 と 2、1 と 3 についても同じ確認を行い、同値類により保持される情報と失われる情報を
列挙せよ。代表元と同値類を同一視しないことが到達条件である。
ヒント
商射影qに対する健全性 r a b→q a=q b を使います。
解答
整数を自然数対 (a,b) の差として表し、(a,b)∼(c,d) ↔ a+d=c+b とします。この関係が同値関係であることを示して
商を作ると、関係証明は商健全性により q(a,b)=q(c,d) へ送られます。ただし逆向き、商内で等しい代表が必ず
元の関係にあることは商構成の完全性に相当し、一般の関係では同値閉包を取るためそのままでは成り立ちません。
構文を書換え規則で商するとき、意図した等式理論が反射・対称・推移・合同閉包を含むことを確認します。
問題2代表元に依存しない関数を設計する
Problem
問題
章本文の位置で見る偶奇類を Bool へ送る関数を、代表元上の関数と関係を保存する証明から構成せよ。
parityValue (parityClass 8) の簡約を追い、商からの除去がどの計算規則を与えるかを確認する。
対照として代表元そのものを返す関数を定義しようとし、0 と 2 が同じ類に属するため
well-definedにならないことを示せ。関数が同値な入力へ同じ出力を返すという条件を、数式と
Leanが要求する証明引数の双方で書くこと。
ヒント
代表上の関数fが r a b→f a=f b を満たすことを先に証明します。
解答
整数対の商から符号を無視した絶対値を定めるなら、代表 (a,b) へ自然数差の絶対値を割り当てます。関係
a+d=c+b から二つの差の絶対値が等しいことを示せば、商のliftで関数を得ます。代表の第一成分だけを返す関数は
(1,0)∼(2,1) で値が異なり、降下しません。well-definednessは実装後の注意ではなく、商除去子の型が要求する
主要な証明義務です。
商上の二項演算では左右の代表を替えても結果が同値である合同性を二変数について示します。
問題3部分型と商型が捨てるものを対照する
Problem
問題
章本文の位置で見る正の自然数の部分型と、偶奇による自然数の商を比較せよ。前者は条件を満たす元だけを残すが元同士の 区別は保ち、後者は全ての元を受け入れる代わりに一部の区別を消す。この差を包含と射影の向きから 説明する。
同じ基礎型について部分型と商型を一つずつ独自に設計し、許される構成子と除去原理を比較せよ。 「条件を付ける」と「同一視する」を型の表現から判別できれば完了である。
ヒント
部分型は許されない値を除き、商型は値同士の区別を除きます。
解答
部分型 {x:A//P x} はAのうちPを満たす値だけを残し、包含写像でAへ戻せます。商型 A/∼ はAの全要素を射影しますが、
同値な要素の区別を忘れ、一般に代表を標準的には戻せません。前者の普遍的性質はPを満たす値からの因子化、後者は
∼を尊重する写像の因子化です。有限集合の「偶数だけ」と「合同類」は、それぞれ対象の削減と観察可能な区別の削減を
具体化します。
正規形の部分型と変換可能性による商を比較し、正規化定理が両表現を結ぶ条件を調べます。
第40章
法則を持つ構造と型クラス探索
問題本文問題1構造のデータと法則を読み分ける
Problem
問題
章本文の位置で見るInvolution のフィールドをデータ成分と法則成分に分類し、各フィールドが後続の定理でどう使われるか
を追え。続いて二項演算、単位元、左右単位律をもつ構造を定義し、単に要素を一つ選ぶ
ChosenElement より何が強いかを説明する。
構造体が数学的構造を一つの型へ束ねることと、型クラス探索がその構造を暗黙に供給することは別の 機能である。この二点を、同じ構造を明示引数と型クラス引数の両方で受け取る関数により比較せよ。
ヒント
モノイドの台、単位元、演算と、結合則・単位則を別々に列挙します。
解答
データは型M、1:M、(·*·):M→M→M です。法則は結合則と左右単位則というPropのフィールドです。データだけなら
マグマに単位元候補を添えたものにすぎません。Leanの構造体は両方を一つの辞書に格納し、演算の記法はデータフィールド、
書換え補題は法則フィールドまたはそこからの定理を参照します。法則が実行時データとして重要か、証明消去されるかも
ソートから読み分けられます。
圏、順序、位相などでも「運ぶデータ」と「満たす公理」を分離して構造間の忘却写像を設計します。
問題2省略された辞書を展開する
Problem
問題
章本文の位置で見るchosenElement Nat で省略された型クラス引数を完全な関数適用として書き、
chosenElementExplicit とkernelへ渡る項を比較せよ。String に空文字列を選ぶインスタンスも
定義し、探索に成功するまでの候補を確認する。
暗黙であることは存在しないことを意味しない。elaboratorが補った辞書が最終的な項のどこに現れ、 kernelが何を型検査するかを説明できれば完了である。
ヒント
型クラス引数を明示引数へ戻し、記法をフィールド射影へ展開します。
解答
[Monoid M] を明示的な辞書 inst : Monoid M とすると、x*y は HMul.hMul x y を経てinstの乗法へ解決され、
1 も対応するOfNatやOne辞書のフィールドです。定理 mul_assoc x y z は暗黙のinstから法則を取り出します。
同じ型Mでも加法構造を乗法記法へラップした別辞書を渡せば意味が変わるため、探索は新しい数学を証明するのではなく
利用可能な構造値を合成して補う機構です。
デバッグ時は記法、型強制、既定インスタンスを順に展開し、どの辞書経路が選ばれたか追跡します。
問題3インスタンス設計の曖昧さを診断する
Problem
問題
章本文の位置で見る同じ型に自然だと思える ChosenElement を二つ考え、どちらを大域的な標準インスタンスにするかで
プログラムの意味が変わる例を作れ。競合を局所インスタンスまたは明示引数で解消し、読者から選択が
見える設計と比較する。
型クラスは数学的に一意な構造を保証しない。探索の一意性、数学的対象の一意性、普遍性による同型を 区別し、後の圏論で構造保存写像を扱う準備として述べること。
ヒント
同じ出力型を持つ候補が複数ある場合と、探索が再帰的に自分へ戻る場合を分けます。
解答
一つの型へ数学的に異なる二つの順序を同じ LE インスタンスとして大域登録すると、優先順位に依存し意図が見えません。
新しいラッパー型で構造を区別するのが安全です。また C A を作るため C A 自身を要求するインスタンスは探索循環を
起こします。出力パラメータや優先順位は正当な標準経路を表す場合だけ使い、曖昧性を隠す手段にはしません。
圏論ライブラリの忘却・誘導インスタンスでは、ダイヤモンドが定義的に一致するかをAPI設計段階で確認します。
第41章
型推論・単一化・双方向型付け
問題本文問題1制約生成を導出木と実行結果で照合する
Problem
問題
章本文の位置で見る項 (λf. λx. f x) (λy. y) を RawTerm で作り、各部分項へ割り当てられるメタ変数を生成順に記録して
ください。適用ごとに生じる方程式を手で列挙し、generate の結果と比較します。十分な燃料で infer を
実行し、得られた型へ代入を適用し直して同じ型になることを確認すれば完了です。
ヒント
適用 f x ではfの型を未知の引数型から未知の結果型への矢印と等置します。
解答
環境 f:α→β, x:α で f x を推論すると、部分項から型 α→β とαを得て、制約
α→β = γ→δ と α=γ を生成します。単一化の最汎解は γ↦α, δ↦β で、結果型はβです。導出木では
適用規則の中間型がα、実行器では新しいメタ変数γがその役割を担います。解いた置換を環境・項・結果型の全体へ
適用して初めて導出と一致します。
let多相を加える場合は一般化するメタ変数と環境に拘束されるメタ変数を分離します。
問題2単一化の不変条件と失敗を分類する
Problem
問題
章本文の位置で見る関数型の分解、左右のメタ変数束縛、構成子不一致、occurs check失敗を一例ずつ作ってください。各一段の
前後で、解集合が保存されるか、空になるかを satisfies で調べます。燃料切れによる none と論理的な
解なしを区別する結果型を設計し、呼出側が報告できる情報の差を説明すれば完了です。
ヒント
方程式集合と蓄積置換が同じ解集合を表すことを不変条件にします。
解答
分解は同じ型構成子の引数へ進み、変数消去はoccurs checkを通った変数を型へ置換します。不変条件は、現状態の解へ
蓄積置換を合成したものが元の制約の解と一致することです。Nat=Bool は構成子衝突、α=α→Nat はoccurs check、
異なる項数の型構成子は形の衝突で失敗します。occurs checkを省くと有限型構文に無限型を暗黙に要求します。
高階単一化では最汎解や決定可能性が失われ得るため、対応する論理断片を明示します。
問題3合成と検査の境目を設計する
Problem
問題
章本文の位置で見る注釈なしラムダ、注釈付きラムダ、二重適用を BidirectionalTerm で表してください。各節点を ⇒ と
⇐ のどちらで読むかを導出木へ明示し、方向を切り替える規則を特定します。ラムダにも常に型を合成させる
設計と比較し、必要なメタ変数、要求する注釈、principal typeの有無がどう変わるかを述べれば完了です。
ヒント
変数・注釈付き項・適用は型を合成し、ラムダや曖昧な構成は期待型に対して検査します。
解答
双方向型付けでは Γ⊢t⇒A と Γ⊢t⇐A を分けます。変数と型注釈は型を合成し、適用は関数型を合成して引数を
始域へ検査します。注釈なしラムダは引数型を自力で決められないため、期待される A→B に対し本体をBへ検査します。
合成から検査へは得た型と期待型の変換可能性を確認します。注釈位置は情報が一方向へ流れる境界になります。
依存適用では前の引数が後続型へ代入されるため、引数順と明示注釈が推論可能性を左右します。