Upgrade to Pro — share decks privately, control downloads, hide ads and more …

次に流行る※プログラミング言語「Lean」

soukouki
August 20, 2023

 次に流行る※プログラミング言語「Lean」

2023-08-20 Zli OB/OG LT で発表したスライドです。

関数型プログラミング言語であり、定理証明支援系であるLeanについて、かんたんに解説しています。

※ 次に流行ると良いな

soukouki

August 20, 2023
Tweet

More Decks by soukouki

Other Decks in Technology

Transcript

  1. 5

  2. はろわ def main : IO Unit := let str :=

    "Hello world!" IO.println str % lean --run hello_world.lean Hello world! 9
  3. 定数(関数)の定義 -- 定数の定義 def hello := "Hello" -- 関数の定義(関数は第一級オブジェクトなので、定数に関数を代入するイメージ) def

    add1 (n : Nat) : Nat := n + 1 -- ラムダ式も使えます! -- λ {α : Type} (x : α) => x def lam := λ {α : Type} (x : α) => x 11
  4. 条件分岐と入出力 def main : IO Unit := do let stdin

    ← IO.getStdin IO.println "年齢を入力してください" let str ← stdin.getLine match str.trim.toNat? with | none => IO.println "数字を入力してください" | some age => if age <= 12 then IO.println "こども" else IO.println "おとな" 入出力はdo構文というやつを使います。入出力に構文を使うのはPython2も同じです し楽勝ですね! パターンマッチもあってプログラムも安全! 12
  5. 代数的データ構造 inductive Option (α : Type u) where | none

    : Option α | some (val : α) : Option α みんな大好きOption型。上記の例でも使用してます。 inductive Bool : Type where | false : Bool | true : Bool Bool(真偽値)型です。trueとTrue、falseとFalseは別物なので注意しましょう。 inductive Nat where | zero : Nat | succ (n : Nat) : Nat 他の言語では見ないNat(自然数)型もあります。 13
  6. def pred (n : Nat) : n > 0 →

    Nat := fun h => match n with | Nat.zero => absurd h (Nat.not_lt_zero 0) | Nat.succ m => m -- checkコマンドは型を表示します。 #check pred -- pred : (n : Nat) → n > 0 → Nat n > 0 では、型が値(項)に依存しています。このような型を依存型といいます。 依存型を持つ言語はLeanの他にCoq、Isabelle、Idrisなどありますが、かなり希少で す。 16
  7. def List.get {α : Type u} : (as : List

    α) → Fin as.length → α | cons a _, ⟨0, _⟩ => a | cons _ as, ⟨Nat.succ i, h⟩ => get as ⟨i, Nat.le_of_succ_le_succ h⟩ Fin as.length は、0以上 as.length 未満の自然数(の集合)です。 これで、リストからn番目の要素を取ってくる操作を 例外を使わずに 必要ないデフォルト値を用意することなく Option型を戻り値にすることなく 実装できます。とても美しい!大好き! 18
  8. 証明の書き方 証明を書くには、「タクティック」(コマンドみたいなもの)を使います。 variable {p q : Prop} theorem t1 :

    (p → q) → p → q := by intros hpq hp -- (p → q)をhpq、pをhpと名付ける apply hpq -- qに対して、(p → q)を適用すると、pになる exact hp -- これはhpそのもの -- これと対応するプログラム theorem t1' : (p → q) → p → q := λ hpq hp => hpq hp 21
  9. 参考文献 「Lean Manual」 https://leanprover.github.io/lean4/doc/ インストール方法から構文まで書いてある。難易度低め。 「Functional Programming in Lean」 https://leanprover.github.io/functional_programming_in_lean/

    より関数型プログラミング言語っぽく書いてある。実践的。 「Documentation」 https://leanprover-community.github.io/mathlib4_docs/ 標準ライブラリと、数学ライブラリmathlibのリファレンス。 「Theorem Proving in Lean 4 日本語訳」 https://aconite- ac.github.io/theorem_proving_in_lean4_ja/introduction.html 型理論や証明についてのドキュメント。数少ない日本語資料だけれど、難易度は高 め。 24