Mercurial > hg > Document > Growi
diff Agda/tutorial.md @ 2:b6c284fd5ae4
backup 2020-12-16
author | autobackup |
---|---|
date | Wed, 16 Dec 2020 15:11:16 +0900 |
parents | e12992dca4a0 |
children |
line wrap: on
line diff
--- a/Agda/tutorial.md Wed Dec 16 15:04:03 2020 +0900 +++ b/Agda/tutorial.md Wed Dec 16 15:11:16 2020 +0900 @@ -31,12 +31,130 @@ - その中でC-c C-, すると引数に何が格納されているのか見ることができる。 - また、C-c C-a するとAuto (proof search)ができ、自動でできるならAgdaが自動的に補完をしてくれる。 +関数を実行したい際にはC-c C-n で実行することができる。 + コマンド群は[ここ](https://agda.wiki.fc2.com/wiki/コマンド一覧)にも記載されている。 +特殊文字などもみんなのagdaに記載されている。 ## 関数定義 +関数定義の際に基本となる記述を記載しておく。 +```agda:func.agda +test2 : (A : Set) → Set +test2 a = a + +-- 引数を増やすこともできる。 +test3 : (A B : Set) → Set +test3 a b = b + +-- ()ではなく{}で方を定義することもできる。その場合{}で定義した部分の変数を隠すことができる。 +test4 : {A B : Set} → A → (A → B) → B +test4 a x = x a + +-- {}で定義した部分を取得することも可能 +test5 : {A B : Set} → A → (A → B) → B +test5 {A} {B} a x = x a + +-- 上記の{}で定義した物を()で書き換えると以下のようになる +test6 : (A B : Set) → A → (A → B) → B +test6 A B a x = x a +-- あまりスマートではないし定義の意味が{}で記述した場合と違う +``` ## data型 +```agda:data.agda +-- 次はdata型とrecord型の説明 +-- 記号などはみんなのagdaにほとんど載っていたり、普通にググっても出る。 -## record型 \ No newline at end of file +data _∨_ (A B : Set) : Set where + front : A → A ∨ B + back : B → A ∨ B +-- 関数名として_∨_を定義しているが、これで中置演算子を定義することができる。 +-- 実際にやっていることは下記に定義している関数と同じ + +data or (A B : Set) : Set where + front : A → or A B + back : B → or A B +``` +data型というのは分岐のことであり、「どちらか一方が必ず動作する。」ということになる。 + +わかり易い例としてBool型の定義がある。 +``` +data Bool : Set where + true : Bool + false : Bool +``` +data型を使用した例としてジャンケンを定義してみる。 +```agda:rps.agda +data hand : Set where + r : hand + p : hand + s : hand + +-- 「手」を二つ受け取って勝った方の手を返すように設計すると +-- 定義は「handを2つ受け取る。最終的にhandを返す」となり、以下のようになる。 +rps : (A B : hand) → hand +-- rps : hand → hand → hand これでも良い +-- rps : (_ _ : hand) → hand これでもできるかもしれない +rps r r = r +rps r p = p +rps r s = r +rps p r = p +rps p p = p +rps p s = s +rps s r = r +rps s p = s +rps s s = s +``` +場合分けの数が足りない場合、agdaが親切に怒ってくれる。 + + +## record型 +data型とは違い、 +オブジェクトあるいは構造体のようなもの。 +以下の関数はAND。p1で前方部分が取得でき、p2で後方部分が取得できる。 + +``` agda:record.agda +record _∧_ (A B : Set) : Set where + field + p1 : A + p2 : B + +-- 普通にANDの後ろの方を取得することもできる +datatest1 : {A B C : Set} → (A ∧ (B → C )) → (B → C) +datatest1 x b = _∧_.p2 x b + + +-- ANDの後ろの方を取得した結果を使用することもできる。 +datatest : {A B C : Set} → B → (A ∧ (B → C )) → C +datatest b x = _∧_.p2 x b +``` + +これらを使用して三段論法を定義することができる。 +定義は「AならばB」かつ「BならばC」なら「AならばC」となる。 +``` +syllogism : {A B C : Set} → ((A → B) ∧ (B → C)) → (A → C) +syllogism x a = _∧_.p2 x (_∧_.p1 x a) +``` + + + + + + + + + + + + + + + + + + + + +