Rust の型を学ぼう

@lyrical_logical

Rust 基礎勉強会

  • lyrical_logical
    • ​病人
      • ​頸肩腕症候群
    • フリーランスのプログラマ
      • ​といえば聞こえはいい
      • 12 月現在仕事ない、欲しい
    • race condition に親を殺された
      • ​程度に race とかが嫌い
      • ので検証とかに多少の興味がある

誰や

  • 当初の予定より大分人数が増えました
    • ​最初は身内数人でやるはずが…?
    • 参加者のレベルの想定ができない
      • ​下げざるを得ない
    • ​かなり informal に話を進めます、具体的には
      • ​シークエント図とか使いません(辛い)

Disclaimer

本題

Rust の型どうなってるの

所有権だのなんだの

Region

+

Linearity(Linear types)

Rust is not a particularly original language,

with design elements coming from a wide range of sources.

Some of these are listed below

  • ML Kit, Cyclone: region based memory management

(bold は自分が加えました)

  • Cyclone
    • ​研究目的の言語
    • Region と呼ばれるものを使ってメモリ管理
      • 今日は話しません
    • 実用的には Region の方が大事です
      • ​皆さん実は既に Region 触りまくってます
        • lifetime と呼ばれるものがほぼそれです
        • 暗黙に推論されることが多い
fn implicit(x: &i32) { ... }
fn explicit<'a>(x: &'a i32) { ... }

Q. Linear types は?

A. ない

(近い所で Clean とかは…)

  • Linear type system
    • "A taste of linear logic" が初出
      • ​Philip Wadler(1990)
    • Type system の話なのに linear logic?

論理とプログラムの関係

  • Curry-Howard Isomorphism
    • カリー・ハワード同型
    • カリー・ハワード対応とも
      • ​Curry-Howard Correspondence

Proofs as Programs

プログラムとしての証明

Propositions as Types

型としての命題

  • Curry-Howard Isomorphism
    • カリー・ハワード同型
    • カリー・ハワード対応とも
      • ​Curry-Howard Correspondence
    • ​Proofs = Programs
      • ​証明もプログラムも似たようなもの
    • Propositions = Types
      • ​命題も型も似たようなもの
  • informal には…
    • プログラムが命題の証明に相当
    • ​論理にはそれぞれルールがある
    • プログラムにはそれぞれ型システムがある
    • ​論理を知ることで型システムを知ることができる
      • ​対応したものが存在するはずなので
    • ​論理を作ることで型システムを作ることができる
      • ​大体先に論理屋さんが作ってるけど

戻る

  • Linear type system
    • "A taste of linear logic" が初出
      • ​Philip Wadler(1990)
    • Type system の話なのに Linear Logic?
      • ​Curry-Huward Isomorphism
    • Linear Logic に対応した型システム
      • ​Logic を知れば Type system が分かるはず
  • Linear Logic
    • "Linear Logic" が初出(そのまんま…)
      • Jean-Yves Girard (1987)
      • 改訂版出てます
    • 線形論理と呼ばれる
      • ​世の中色んな論理がある
  • Linearity
    • 線形論理のどこに線形性があるのだろう?
    • そもそも線形性とは何だろう?
    • 結論からいうと、informal には…
      • 証明の過程で、​各仮定が一度しか使われない
    • ​プログラムの視点から見ると…
      • ​後で
  • 「普通の」論理
    • 古典論理でも直観論理でもいいです
    • 一般的な論理では、仮定は好きなだけ使える
    • 命題論理で適当な例
      • A ⇒ (A ⇒ B) ∧ (A ⇒ C) ⇒ B ∧ C
        • ​仮定 A は二回使われる
    • ​​当然使わないこともできる
      • ​A ∧ B ⇒ A
        • ​仮定 B は使わない
  • 証明の手法
    • ​そもそも我々はどのように証明しているのか
    • 以下の三つがよく知られている
      • ​ゲンツェンのシークエント計算
      • ゲンツェンの自然演繹
      • ヒルベルトシステム
    • ​今回はシークエント計算を前提に進めます
      • 深くは掘り下げません
  • シークエント計算と「普通の」論理
    • ​例えば命題論理をシークエント計算で表す
      • 論理規則と構造規則により表される
    • 構造規則とは
      • Weakning, Contraction, Exchange
  • 構造規則
    • Weakning
      • ​弱化規則
      • 任意の仮定や命題を足したり引いたりする
    • ​Contraction
      • ​縮約規則
      • 同じ仮定や命題を減らしたり増やしたりする
    • ​二つの規則のおかげで仮定が何度も使えた
      • ​Exchange は今回関係ないのでパス
  • 「普通」でない論理
    • 世の中色んな論理がある
    • 多値論理、様相論理、etc...
    • 部分構造論理と呼ばれる論理がある
      • ​正確には論理群、後述
  • 部分構造論理
    • 構造論理(の一部)を捨てた論理
      • ​何を捨てるかで色々変わってくる
    • 適用可能な規則が減ってる分、論理として弱い
      • 弱い方が都合がいいこともある
  • Linear Logic - revisited
    • 弱化規則と縮約規則を捨てた部分構造論理
    • 弱化規則と縮約規則があると
      • ​同じ仮定を何度も使える
    • 二つの​規則を捨てたことで弱くなったかわりに
      • ​仮定は必ず一度だけ使われるようになった
      • つまり、線形性を得た(めでたい)
  • 線形性により得られる表現力
    • 仮定は一度しか使えない
      • ​これは仮定の「消費」と見做すことができる
    • よくある例として食べ物の例がある
    • 「N 円払う」⇒「N 円払いパンを買う」⇒「パン」
      • ​「N 円払う」仮定が何度も使えたらまずい
    • ​「リソース」を扱う上で良い性質
  • 型システムとしての線形性
    • 仮定を「ある型 A の変数 x」とする
    • 変数 x は一度しか使えない
      • ​これは変数の「消費」と見做すことができる
    • 変数が何らかの「リソース」だとすると
      • ​リソースの消費と見做すことができる
  • mutable reference in Rust
    • やっと Rust の話です
    • ownership だの borrowing だのがある
      • ​知ってる前提で進めます
  • ​mutable reference の制限
    • mutable reference が存在するとき
      • ​同時に reference を複数作ることはできない
      • immutable reference でもダメ
    • mutable reference は linear value
fn bad() {
    let mut x = 0;
    let imm_ref = &x;
    let mut_ref = &mut x; // error
}

Q. これだけですか?

A. これだけです

Q. Rust の型システムって結局 Linear Types なの?

A. そんな面倒臭い訳ない

  • ​Linearity は大事
    • mutable reference は linear value
    • でも Linearity を担保する方法は一つじゃない
      • ​Linear Types でなくても実現できる
    • 現実には region-based + α
      • C-like な言語で Linear Types は厳しい
      • ​実装の話はしません、brrowck 見て下さい
  • まとめ
    • Linearity は良い性質
      • ​mutable reference を安全に扱える
    • Rust の mutable reference は linear
      • ​data race にさよならばいばいできる
    • 別に Linear Type System ではない
      • 変数の寿命とか所有権とか考えだすと不足

おわり