123
Agda 入門 @ikegami _ _ Proof Summit 2011 2011-09-25

Agda 入門@ProofSummit 2011

  • Upload
    ikegami

  • View
    3.607

  • Download
    4

Embed Size (px)

DESCRIPTION

対話的定理証明支援系 Agda の紹介です

Citation preview

Page 1: Agda 入門@ProofSummit 2011

Agda 入門@ikegami _ _

Proof Summit 20112011-09-25

Page 2: Agda 入門@ProofSummit 2011

Agda 概要• 依存型関数型言語

• 依存型 = 型が値に依存できる

• 関数型 = 関数が第一級市民

• 対話的定理証明支援系

• tactic なし

Page 3: Agda 入門@ProofSummit 2011

コンパイルの話は最後証明開発駆動の人ごめん

Page 4: Agda 入門@ProofSummit 2011

Agda で証明• tactic なし

• データを定義 = 公理を与える

• 関数の型を宣言 = 命題を与える

• 関数を定義し、停止させる = 証明する

• Agda が「型検査」に合格と認める

• Agda が「停止する」と認める

Page 5: Agda 入門@ProofSummit 2011

キーワード Set

Set型

型の型 Set1

型の型の型 Set2

UniverseUnicode subscriptSet1 とも Set1 とも書ける

Page 6: Agda 入門@ProofSummit 2011

データ定義

data Bool : Set where true : Bool false : Bool

TAB は非推奨

Page 7: Agda 入門@ProofSummit 2011

データ定義

data Bool : Set where true : Bool false : Bool

空白

TAB は非推奨

Page 8: Agda 入門@ProofSummit 2011

データ定義

data Bool : Set where true : Bool false : Bool

TAB は非推奨

Page 9: Agda 入門@ProofSummit 2011

データ定義

data Bool : Set where true : Bool false : Bool空白

TAB は非推奨

Page 10: Agda 入門@ProofSummit 2011

データ定義

data Bool : Set where true : Bool false : Bool

TAB は非推奨

Page 11: Agda 入門@ProofSummit 2011

データ定義

data Bool : Set where true : Bool false : Bool

空白

TAB は非推奨

Page 12: Agda 入門@ProofSummit 2011

データ定義

data Bool : Set where true : Bool false : Bool

TAB は非推奨

Page 13: Agda 入門@ProofSummit 2011

データ定義

data ℕ : Set where zero : ℕ suc : ℕ → ℕ

Page 14: Agda 入門@ProofSummit 2011

データ定義data List (A : Set) : Set where nil : List A cons : (x : A) → (xs : List A) → List A

Page 15: Agda 入門@ProofSummit 2011

データ定義data List (A : Set) : Set where nil : List A cons : (x : A) → (xs : List A) → List A

型パラメータ

Page 16: Agda 入門@ProofSummit 2011

データ定義data List (A : Set) : Set where nil : List A cons : (x : A) → (xs : List A) → List A

Page 17: Agda 入門@ProofSummit 2011

関数定義

pred : ℕ → ℕpred zero = zeropred (suc n) = n

関数は total でなければならない定義域すべてをわたる

Page 18: Agda 入門@ProofSummit 2011

Hidden arguments

id : {A : Set} → A → Aid x = x

Page 19: Agda 入門@ProofSummit 2011

lambda

id : {A : Set} → A → Aid = λ x → x

Page 20: Agda 入門@ProofSummit 2011

Unicode / ASCII

id : {A : Set} → A → Aid = λ x → x

id : {A : Set} -> A -> Aid = \x -> x

UTF8

Page 21: Agda 入門@ProofSummit 2011

mixfix オペレータ

_+_ : ℕ → ℕ → ℕzero + n = nsuc m + n = suc (m + n)

Page 22: Agda 入門@ProofSummit 2011

mixfix オペレータif_then_else_ : {A : Set} → Bool → A → A → Aif true then t else f = tif false then t else f = f

Page 23: Agda 入門@ProofSummit 2011

依存型データdata Vec (A : Set) : ℕ → Setwhere [] : Vec A zero _∷_ : {n : ℕ} → (x : A) → (xs : Vec A n) → Vec A (suc n)

Page 24: Agda 入門@ProofSummit 2011

依存型データdata Vec (A : Set) : ℕ → Setwhere [] : Vec A zero _∷_ : {n : ℕ} → (x : A) → (xs : Vec A n) → Vec A (suc n)

型パラメータ

Page 25: Agda 入門@ProofSummit 2011

依存型データdata Vec (A : Set) : ℕ → Setwhere [] : Vec A zero _∷_ : {n : ℕ} → (x : A) → (xs : Vec A n) → Vec A (suc n)

Page 26: Agda 入門@ProofSummit 2011

レコードrecord R : Set where constructor r field f1 : Bool f2 : ℕ

Page 27: Agda 入門@ProofSummit 2011

レコードfoo : Rfoo = record { f1 = true ; f2 = zero }bar : Rbar = r true zero

Page 28: Agda 入門@ProofSummit 2011

命題論理とAgda命題論理 Agda

A ならば B

A でない

A または B

A かつ B

Page 29: Agda 入門@ProofSummit 2011

Proposition as Set

• A : Set• x が A の proof object

• x : A

Page 30: Agda 入門@ProofSummit 2011

A ならば B

• A B : Set• A ならば B

• i : A → B

Page 31: Agda 入門@ProofSummit 2011

例 : A ならば A

id : {A : Set} → A → Aid x = x

ユーザが関数定義を証明とみなす

Page 32: Agda 入門@ProofSummit 2011

p : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = ?

Page 33: Agda 入門@ProofSummit 2011

p : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = { }0

?0 : C

Page 34: Agda 入門@ProofSummit 2011

p : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = { g }0

?0 : Cg : B → C

Page 35: Agda 入門@ProofSummit 2011

p : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = { }1

?1 : B

g

Page 36: Agda 入門@ProofSummit 2011

p : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = { f x }1

?1 : Bf : A → B

g

x : A

Page 37: Agda 入門@ProofSummit 2011

p : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = g (f x)

対話的な証明の構築

Page 38: Agda 入門@ProofSummit 2011

命題論理とAgda命題論理 Agda

A ならば B A → B

A でない

A または B

A かつ B

Page 39: Agda 入門@ProofSummit 2011

空のデータ

data ⊥ : Set where

Page 40: Agda 入門@ProofSummit 2011

A でない

• A : Set• A でない• notA : A → ⊥

Page 41: Agda 入門@ProofSummit 2011

命題論理とAgda命題論理 Agda

A ならば B A → B

A でない A → ⊥

A または B

A かつ B

Page 42: Agda 入門@ProofSummit 2011

disjoint union 型data _⊎_ (A B : Set) : Set where left : A → A ⊎ B right : B → A ⊎ B

Page 43: Agda 入門@ProofSummit 2011

命題論理とAgda命題論理 Agda

A ならば B A → B

A でない A → ⊥

A または B A ⊎ B

A かつ B

Page 44: Agda 入門@ProofSummit 2011

sigma レコードrecord Σ (A : Set) (B : A → Set) : Set where constructor _,_ field proj1 : A proj2 : B proj1

Page 45: Agda 入門@ProofSummit 2011

times 関数

_×_ : (A B : Set) → SetA × B = Σ A (λ x → B)

Page 46: Agda 入門@ProofSummit 2011

命題論理とAgda命題論理 Agda

A ならば B A → B

A でない A → ⊥

A または B A ⊎ B

A かつ B A × B

Page 47: Agda 入門@ProofSummit 2011

証明できないこと• 二重否定の除去 double negation elimination

• dne : {A : Set} → ¬ (¬ A) → A

• 排中律 Law of the excluded middle

• em :{A : Set} → A ⊎ (¬ A)

• 背理法

• etc.直観主義

Page 48: Agda 入門@ProofSummit 2011

停止しない関数foo : ℕ → ℕfoo zero = zerofoo (suc n) = foo (suc n)

型検査は通るしかし、停止するとみなされない

Page 49: Agda 入門@ProofSummit 2011

Agda のあれこれ

Page 50: Agda 入門@ProofSummit 2011

forall キーワードss : ∀ n → ℕss n = suc (suc n)

ss : (n : ℕ) → ℕss n = suc (suc n)

Page 51: Agda 入門@ProofSummit 2011

forall キーワードlength : ∀{n} → {A : Set} → Vec A n → ℕlength {n} {A} v = n

length : {n : ℕ} → {A : Set} → Vec A n → ℕlength {n} {A} v = n

Page 52: Agda 入門@ProofSummit 2011

解決されていないHidden argument

foo : ∀{m} → ℕfoo = zero

m が型推論できていない証明としても未完成

Page 53: Agda 入門@ProofSummit 2011

解決されていないHidden argument

foo : ∀{m} → ℕfoo = zero

m が型推論できていない証明としても未完成

Page 54: Agda 入門@ProofSummit 2011

コメント-- 一行のコメント{-複数行のコメント-}

Page 55: Agda 入門@ProofSummit 2011

let と wherefoo : .....foo = let bar : ..... bar = ..... in .....

foo : .....foo = ..... where bar : ..... bar = .....

Page 56: Agda 入門@ProofSummit 2011

() パターン

f : {A : Set} → ⊥ → Af ()

data ⊥ : Set where

Page 57: Agda 入門@ProofSummit 2011

wildcard パターン

_∧_ : Bool → Bool → Booltrue ∧ b = bfalse ∧ _ = false

Page 58: Agda 入門@ProofSummit 2011

with パターンfilter : {A : Set} → (A → Bool) → List A → List Afilter p nil = nilfilter p (cons x xs) with p x... ¦ true = cons x (filter p xs)... ¦ false = filter p xs

Page 59: Agda 入門@ProofSummit 2011

dot パターン(の動機)data IsEven : ℕ → Set where evenZ : IsEven zero evenSS : (n : ℕ) →IsEven n → IsEven (suc (suc n))

Page 60: Agda 入門@ProofSummit 2011

dot パターン(の動機)data IsEven : ℕ → Set where evenZ : IsEven zero evenSS : (n : ℕ) →IsEven n → IsEven (suc (suc n))even+ : (m n : ℕ) → IsEven m → IsEven n → IsEven (m + n)even+ zero n p q = qeven+ (suc m’) n p q = ?

Page 61: Agda 入門@ProofSummit 2011

dot パターン(の動機)data IsEven : ℕ → Set where evenZ : IsEven zero evenSS : (n : ℕ) →IsEven n → IsEven (suc (suc n))

m でパターンマッチすると証明が進まない

even+ : (m n : ℕ) → IsEven m → IsEven n → IsEven (m + n)even+ zero n p q = qeven+ (suc m’) n p q = ?

Page 62: Agda 入門@ProofSummit 2011

dot パターン(の動機)data IsEven : ℕ → Set where evenZ : IsEven zero evenSS : (n : ℕ) →IsEven n → IsEven (suc (suc n))even+ : (m n : ℕ) → IsEven m → IsEven n → IsEven (m + n)even+ zero n p q = qeven+ (suc m’) n p q = ?

Page 63: Agda 入門@ProofSummit 2011

dot パターンdata IsEven : ℕ → Set where evenZ : IsEven zero evenSS : (n : ℕ) →IsEven n → IsEven (suc (suc n))even+ : (m n : ℕ) → IsEven m → IsEven n → IsEven (m + n)even+ .zero n evenZ q = qeven+ .(suc (suc m’)) n (evenSS m’ p) q = evenSS (m’ + n) (even+ m’ n p q)

Page 64: Agda 入門@ProofSummit 2011

dot パターンdata IsEven : ℕ → Set where evenZ : IsEven zero evenSS : (n : ℕ) →IsEven n → IsEven (suc (suc n))even+ : (m n : ℕ) → IsEven m → IsEven n → IsEven (m + n)even+ .zero n evenZ q = qeven+ .(suc (suc m’)) n (evenSS m’ p) q = evenSS (m’ + n) (even+ m’ n p q)

パターンマッチ

Page 65: Agda 入門@ProofSummit 2011

dot パターンdata IsEven : ℕ → Set where evenZ : IsEven zero evenSS : (n : ℕ) →IsEven n → IsEven (suc (suc n))even+ : (m n : ℕ) → IsEven m → IsEven n → IsEven (m + n)even+ .zero n evenZ q = qeven+ .(suc (suc m’)) n (evenSS m’ p) q = evenSS (m’ + n) (even+ m’ n p q)

Page 66: Agda 入門@ProofSummit 2011

mutual ブロックmutual data Even : Set where zeroE : Even succE : Odd → Even data Odd : Set where succO : Even → Odd

相互に依存するデータ定義

Agda 2.2.12 以降では不要になる

Page 67: Agda 入門@ProofSummit 2011

mutual ブロックmutual data Even : Set where zeroE : Even succE : Odd → Even data Odd : Set where succO : Even → Odd

相互に依存するデータ定義

空白

Agda 2.2.12 以降では不要になる

Page 68: Agda 入門@ProofSummit 2011

mutual ブロックmutual data Even : Set where zeroE : Even succE : Odd → Even data Odd : Set where succO : Even → Odd

相互に依存するデータ定義

Agda 2.2.12 以降では不要になる

Page 69: Agda 入門@ProofSummit 2011

postulate 宣言postulate A : Set foo : A → A

定義なしにシンボルを導入Agda のシステムが壊れる可能性

ご利用は計画的に

Page 70: Agda 入門@ProofSummit 2011

postulate 宣言postulate A : Set foo : A → A

定義なしにシンボルを導入Agda のシステムが壊れる可能性

ご利用は計画的に

空白

Page 71: Agda 入門@ProofSummit 2011

postulate 宣言postulate A : Set foo : A → A

定義なしにシンボルを導入Agda のシステムが壊れる可能性

ご利用は計画的に

Page 72: Agda 入門@ProofSummit 2011

parametrized modulemodule Foo (A : Set) (foo : A → A)where

module Bar wheredata B : Set where b : Bbar : B → Bbar x = x

module F = Foo B Bar

Page 73: Agda 入門@ProofSummit 2011

Agda の module についてもうすこし

Ulf のスライド(2006) で 30 枚…

Page 74: Agda 入門@ProofSummit 2011

階層的 module

open import Data.Nat

lib/src/Data/Nat.agda

(add-to-list ʻagda2-include-dirs “.../lib/src”)

Agda 標準ライブラリ参照パスの起点が .../lib/src

Page 75: Agda 入門@ProofSummit 2011

ファイル名と module

MyProject/Foo.agda

(add-to-list ʻagda2-include-dirs “.../MyProject”)

module Foo wheredata A : Set where a : A

Page 76: Agda 入門@ProofSummit 2011

open import 宣言open import Data.Nat

• import 宣言

• Nat.zero と参照できる

• open import 宣言

• zero と参照できるスコープの違い

Page 77: Agda 入門@ProofSummit 2011

module using

open import Data.Bool using (Bool; true; false)

Page 78: Agda 入門@ProofSummit 2011

module renaming

open import Data.Bool renaming (true to t; false to f)

Page 79: Agda 入門@ProofSummit 2011

module hiding

open import Data.Nat hiding (ℕ; zero; suc)

Page 80: Agda 入門@ProofSummit 2011

module as

open import Data.Bool as B

foo : B.Boolfoo = B.true

Page 81: Agda 入門@ProofSummit 2011

Agda の機能

Page 82: Agda 入門@ProofSummit 2011

agda2-goal-and-contextp : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = { }0

?0 : CCtrl-c Ctrl-,

x : Af : A → Bg : B → C

A B C : Set

Page 83: Agda 入門@ProofSummit 2011

agda2-goal-and-context-and-inferred

p : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = {f x}0

?0 : CCtrl-c Ctrl-.

f x : B

Page 84: Agda 入門@ProofSummit 2011

agda2-refinep : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x ={g (f x)}0

Ctrl-c Ctrl-r

g (f x)

Page 85: Agda 入門@ProofSummit 2011

agda2-refinep : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x =

Ctrl-c Ctrl-r

g (f x)

Page 86: Agda 入門@ProofSummit 2011

ロード/リスタート• Ctrl-C Ctrl-l (agda2-load)

• Ctrl-C Ctrl-x Ctrl-r (agda2-restart)

書いてはやりなおし、書いてはロードする

Page 87: Agda 入門@ProofSummit 2011

compile

open import IOopen import Data.Unitmain : IO ⊤main = putStrLn “Hello”

C-c C-x C-c (agda2-compile)

MAlonzo

Page 88: Agda 入門@ProofSummit 2011

automation provingp : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = { }0

Ctrl-c Ctrl-a

これくらいの問題は自動的に解くAgsy

Page 89: Agda 入門@ProofSummit 2011

automation provingp : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x =

Ctrl-c Ctrl-a

これくらいの問題は自動的に解くAgsy

Page 90: Agda 入門@ProofSummit 2011

automation provingp : {A B C : Set} → (A → B) → (B → C) → A → Cp f g x = g (f x)

Ctrl-c Ctrl-a

これくらいの問題は自動的に解くAgsy

Page 91: Agda 入門@ProofSummit 2011

等号についてadvanced topic

Page 92: Agda 入門@ProofSummit 2011

equality

data _≡_ {A : Set} (x : A) : A → Setwhere refl : x ≡ x

Leibnitz equality

Page 93: Agda 入門@ProofSummit 2011

等号を用いた証明cong : {A B : Set} → (f : A → B) → {x y} → x ≡ y → f x ≡ f ycong f refl = refl

foo : (n : ℕ) -> n + zero ≡ nfoo zero = reflfoo (suc m) =

?0 : suc m ≡ suc m + zero

{ }0

Page 94: Agda 入門@ProofSummit 2011

等号を用いた証明cong : {A B : Set} → (f : A → B) → {x y} → x ≡ y → f x ≡ f ycong f refl = refl

foo : (n : ℕ) -> n + zero ≡ nfoo zero = reflfoo (suc m) =

Page 95: Agda 入門@ProofSummit 2011

等号を用いた証明cong : {A B : Set} → (f : A → B) → {x y} → x ≡ y → f x ≡ f ycong f refl = refl

foo : (n : ℕ) -> n + zero ≡ nfoo zero = reflfoo (suc m) = cong suc (foo m)

Page 96: Agda 入門@ProofSummit 2011

rewrite の動機foo : (n : ℕ) -> n + zero ≡ nfoo zero = reflfoo (suc m) with m + zero ¦ foo m... ¦ .m ¦ refl =

?0 : suc m ≡ suc m

{ }0

Page 97: Agda 入門@ProofSummit 2011

rewrite の動機foo : (n : ℕ) -> n + zero ≡ nfoo zero = reflfoo (suc m) with m + zero ¦ foo m... ¦ .m ¦ refl =

Page 98: Agda 入門@ProofSummit 2011

rewrite の動機foo : (n : ℕ) -> n + zero ≡ nfoo zero = reflfoo (suc m) with m + zero ¦ foo m... ¦ .m ¦ refl = refl

Page 99: Agda 入門@ProofSummit 2011

rewritefoo : (n : ℕ) → n + zero ≡ nfoo zero = reflfoo (suc m) rewrite plus-zero m =

?0 : suc m ≡ suc m

{ }0

Page 100: Agda 入門@ProofSummit 2011

rewritefoo : (n : ℕ) → n + zero ≡ nfoo zero = reflfoo (suc m) rewrite plus-zero m =

Page 101: Agda 入門@ProofSummit 2011

rewritefoo : (n : ℕ) → n + zero ≡ nfoo zero = reflfoo (suc m) rewrite plus-zero m = refl

Page 102: Agda 入門@ProofSummit 2011

rewrite

f : .....f ps rewrite eqn = rhs

eqn : a ≡ b

f : .....f ps with a ¦ eqn... ¦ ._ ¦ refl = rhs

Page 103: Agda 入門@ProofSummit 2011

equality reasoningopen import Data.Listopen import Data.List.Propertiesopen import Relation.Binary.PropositionalEquality as Pr : {A : Set} → (xs : List A) → reverse (reverse xs) ≡ xsr nil = reflr (cons x xs) = begin reverse (reverse (cons x xs)) ≡⟨ ?0 ⟩

reverse (reverse xs ++ cons x nil) ..... cons x xs ∎ where open P.≡-reasoning

Page 104: Agda 入門@ProofSummit 2011

equality reasoning

r : {A : Set} → (xs : List A) → reverse (reverse xs) ≡ xsr nil = reflr (cons x xs) = begin reverse (reverse (cons x xs)) ≡⟨ ?0 ⟩

reverse (reverse xs ++ cons x nil) ..... cons x xs ∎ where open P.≡-reasoning

?0 : reverse (reverse (cons x xs)) ≡ reverse (reverse xs ++ cons x nil)

Page 105: Agda 入門@ProofSummit 2011

equality reasoning

r : {A : Set} → (xs : List A) → reverse (reverse xs) ≡ xsr nil = reflr (cons x xs) = begin reverse (reverse (cons x xs)) ≡⟨ cong reverse (unfold-reverse x xs) ⟩

reverse (reverse xs ++ cons x nil) ..... cons x xs ∎ where open P.≡-reasoning

?0 : reverse (reverse (cons x xs)) ≡ reverse (reverse xs ++ cons x nil)

Page 106: Agda 入門@ProofSummit 2011

標準ライブラリにある関数の型を調べて

入力することが tactic に相当

Page 107: Agda 入門@ProofSummit 2011

emptiness check

f : (n : ℕ) → n ≡ suc n → ℕf n ()

Agda 2.2.12 Feature

Page 108: Agda 入門@ProofSummit 2011

プラグマとフラグ

Page 109: Agda 入門@ProofSummit 2011

--universe-polymorphism

Set型 型の型

Set1型の型の型Set2

{-# OPTIONS --universe-polymorphism #-}module Foo wheref : ∀{a} → Set a → .....f = .....

Agda 標準ライブラリに頻出

Universe

Agda 2.2.12 以降ではデフォルトで有効になる

Page 110: Agda 入門@ProofSummit 2011

agda コマンド• --compile

• コンパイル MAlonzo

• --html

• HTML ドキュメント生成

• フラグ無し

• 型検査

• etc. (たくさんのオプション)

Page 111: Agda 入門@ProofSummit 2011

Agda release notes

• Agda 2-2-0 (2009-03-18)

• Sized type

Page 112: Agda 入門@ProofSummit 2011

sized typessub : ℕ → ℕ → ℕsub zero n = zerosub (suc m) zero = suc msub (suc m) (suc n) = sub m n-- div m n computes ceiling (m/(n+1))div : ℕ → ℕ → ℕdiv zero n = zerodiv (suc m) n = suc (div (sub m n) n)

停止しない

Page 113: Agda 入門@ProofSummit 2011

sized typessub : ℕ → ℕ → ℕsub zero n = zerosub (suc m) zero = suc msub (suc m) (suc n) = sub m n-- div m n computes ceiling (m/(n+1))div : ℕ → ℕ → ℕdiv zero n = zerodiv (suc m) n = suc (div (sub m n) n)

停止しない

Page 114: Agda 入門@ProofSummit 2011

{-# OPTIONS --sized-types #-}open import Size

data Nat : {i : Size} → Set where zero : {i : Size} → Nat {↑ i} suc : {i : Size} → Nat {i} → Nat {↑ i}

sub : {i : Size} → Nat {i} → Nat {∞} → Nat {i}sub zero n = zerosub (suc m) zero = suc msub (suc m) (suc n) = sub m n-- div m n computes ceiling (m/(n+1))div : {i j : Size} → Nat {i} → Nat {j} → Nat {i}div zero n = zerodiv (suc m) n = suc (div (sub m n) n)

型宣言を Sized Type にするだけで停止する

Page 115: Agda 入門@ProofSummit 2011

Agda release notes

• Agda 2.2.10 (2011-02-21)

• --without-K flag

• irrelevant declarations

• termination checker with projections

• compiler backend

• Epic

• MAlonzo

Page 116: Agda 入門@ProofSummit 2011

Epic コンパイラ• Epic 言語とコンパイラ

• http://www.cs.st-andrews.ac.uk/~eb/epic.php

• Agda から Epic への言語変換

• Epic コンパイラは C を経由

Page 117: Agda 入門@ProofSummit 2011

MAlonzo コンパイラ

• Agda で型安全、停止

• Haskell で型検査しなくてもいいね(!?)

• unsafeCoerce :: a -> b

Agda の構文木をそのまま Haskell の構文木にする

Page 118: Agda 入門@ProofSummit 2011

他言語 (experimental)

• JavaScript Compiler Backend

• Ruby Compiler Backend

• https://github.com/larrytheliquid/agda-rb

Page 119: Agda 入門@ProofSummit 2011

Agda release notes

• Agda 2.2.12 (current development)

• coming soon (maybe within this week?)

• instance arguments {{ }}

• pattern matching lambda

Page 120: Agda 入門@ProofSummit 2011

Agda in browser

• Agda + JavaScript Compiler

• Functional Reactive Programming

• Example : Clock

あとでデモ

Page 121: Agda 入門@ProofSummit 2011

時間確認

Page 122: Agda 入門@ProofSummit 2011

DemoKeyCastr.app 起動Emacs.app 起動 (Command + T でフォント変更)

[1B_Maze-Black 25pt font]ディスプレイをミラーするようモニタ変更

Page 123: Agda 入門@ProofSummit 2011

まだ理解してないこと• Agda standard library の一部

• well-founded induction

• coinduction

• --without-K フラグ

• irrelevant declaration

• projection and termination

• instance arguments

• pattern matching lambda

• reflection

• etc. (too much)