Agda始めました

Agdaを始めました。Windows 10でWindows版EmacsとWindows版のGHCupのCabalで入れたHaskellでやっています。最初にCygwin版のEmacsとWindows版のHaskellでやろうとしてできませんでした。前者の方法なら引っかかるところはなかったはずです。

Emacs以外にもVSCodeやNeovimでできるみたいです。でも、元々はEmacsで作られたみたいで、安定していそうなのでこれにしました。

「どこから手をつけるか?」ですがAgda公式ページのチュートリアルが一番丁寧そうです。でも、"Agda"でぐぐっても公式ページすら最初のほうに出てこないんですよね。本当に公式ページなのかもよくわかりませんし。"Agda tutorial"だと古いバージョンが引っかかる始末。なぜ、こんなことになっているのか?

公式ページの頭から読んでいくと"A Taste of Agda"がけっこう難しかったです。なので、ここは飛ばして次の"A List of Tutorials"の"Books on Agda"にある、"Programming Languages Foundations in Agda"をやるのが良い気がします。日本語のページだと違う気がしますが、英語のサイトだとBooksにあるやつはだいたいただでHTMLで読めますよね。どういうことなんでしょう?読めるならいいんですけど。

最初は自然数の定義からです。

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

で定義できます。

ℕは黒板太字というやつで、数学の世界では自然数を表わすことが多いようです。黒板太字を使えない環境ではNatと書くことが多いようです。他にはℤで整数、ℚで有理数、ℝで実数、ℂで複素数みたいです。EmacsのAgdaだと\bNで出せます。\bnだと小文字が出てきます。\->で→が出せます。でも、ここらへんはバージョン依存かも。他にもたくさんの記号があって、Agda Emacs Symbolsに書いてあります。ここは公式ページではなさそうなのですけど。詳しくは公式ページのHow can I write Unicode characters using Emacs?に書いてあります。

自然数の定義ですが、これらはHaskellに似た記法になっています。dataはデータ型を宣言する命令です。ℕを定義しています。Setはまだよくわかりませんが、zeroとsucの集合みたいなことでしょう。zeroはデータコンストラクタで型はℕです。sucはsuccessorの略でℕを引数にとってℕを返す関数になります。

自然数の定義の後に

{-# BUILTIN NATURAL ℕ #-}

を書いておくと2などの数字がsuc (suc zero)の代わりに使えるようになります。

チュートリアルでは次のコードでインポートすることになっています。

import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_; refl)
open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; _∎)

しかし、標準ライブラリがインストールされていないとエラーになります。

D:\home\sakura\docs\comp\lang\agda\test.agda:1,8-51
Failed to find source of module
Relation.Binary.PropositionalEquality in any of the following
locations:
  D:\home\sakura\docs\comp\lang\agda\Relation\Binary\PropositionalEquality.agda
  D:\home\sakura\docs\comp\lang\agda\Relation\Binary\PropositionalEquality.lagda
  C:\cabal\store\ghc-8.10.7\Agda-2.6.2.2-44283e0a92e767b3a6754f539efccb0afbc41964\share\lib\prim\Relation\Binary\PropositionalEquality.agda
  C:\cabal\store\ghc-8.10.7\Agda-2.6.2.2-44283e0a92e767b3a6754f539efccb0afbc41964\share\lib\prim\Relation\Binary\PropositionalEquality.lagda
when scope checking the declaration
  import Relation.Binary.PropositionalEquality as Eq

Agdaの公式ページには標準ライブラリへのリンクしかありませんが、書いてあるとおりでインストールできます。

まず、ダウンロードして展開します。そして展開したディレクトリでcabal installです。

kurok@DESKTOP-55E88RD /cygdrive/d/app/agda-stdlib-1.7.1
$ cabal install
Wrote tarball sdist to
D:\app\agda-stdlib-1.7.1\dist-newstyle\sdist\agda-stdlib-utils-1.7.1.tar.
gz
Resolving dependencies...
Build profile: -w ghc-8.10.7 -O1
In order, the following will be built (use -v for more details):
 - unix-compat-0.7 (lib) (requires download & build)
  - filemanip-0.3.6.3 (lib:filemanip) (requires download & build)
   - agda-stdlib-utils-1.7.1 (exe:GenerateEverything) (requires build)
    - agda-stdlib-utils-1.7.1 (exe:AllNonAsciiChars) (requires build)
    Downloading  unix-compat-0.7
    Downloaded   unix-compat-0.7
    Downloading  filemanip-0.3.6.3
    Starting     unix-compat-0.7 (lib)
    Downloaded   filemanip-0.3.6.3
    Building     unix-compat-0.7 (lib)
    Installing   unix-compat-0.7 (lib)
    Completed    unix-compat-0.7 (lib)
    Starting     filemanip-0.3.6.3 (all, legacy fallback)
    Building     filemanip-0.3.6.3 (all, legacy fallback)
    Installing   filemanip-0.3.6.3 (all, legacy fallback)
    Completed    filemanip-0.3.6.3 (all, legacy fallback)
    Starting     agda-stdlib-utils-1.7.1 (exe:AllNonAsciiChars)
    Starting     agda-stdlib-utils-1.7.1 (exe:GenerateEverything)
    Building     agda-stdlib-utils-1.7.1 (exe:GenerateEverything)
    Building     agda-stdlib-utils-1.7.1 (exe:AllNonAsciiChars)
    Installing   agda-stdlib-utils-1.7.1 (exe:GenerateEverything)
    Completed    agda-stdlib-utils-1.7.1 (exe:GenerateEverything)
    Installing   agda-stdlib-utils-1.7.1 (exe:AllNonAsciiChars)
    Completed    agda-stdlib-utils-1.7.1 (exe:AllNonAsciiChars)
    Copying 'AllNonAsciiChars.exe' to 'C:\cabal\bin\AllNonAsciiChars.exe'
    Copying 'GenerateEverything.exe' to 'C:\cabal\bin\GenerateEverything.exe'

AGDA_DIRはWindows版ではC:\Users\kurok\AppData\Roaming\agdaになります。agdaの前にドットは必要ありません。AGDA_DIRにlibrariesというファイル名で先程展開したstandard-library.agda-libへのパスを書きます。もう一つ、defaultsというファイル名でstandard-libraryと書きます。これで標準ライブラリが動くはずです。

もしかしたら正常に表示されないフォントがあるかもしれません。その場合は"DejaVu Sans Mono"か"Noto Sans Math"を指定すれば表示されるはずです。"Noto Sans Math"はインストールが必要です。

ここまで環境を作って、基礎が理解できれば、あとはチュートリアルを読んでいくだけのはずです。さあ、どんどん行きましょう。

コメント

このブログの人気の投稿

五十音配列付き新下駄配列

WSLでの親指シフトはどうやらMozcで実現可能と気がつくまで

親指シフト新下駄配列の可能性