﻿

                  Lambda * Magica      ver 3.80

         Untyped Lambda Calculus Interpreter for Education

        Copyright (C) 2011-2012 Yuuki.S All Rights Reserved.


1. 概要

  単純型無しラムダ計算のインタプリタ

1.1 実行方法

  - Windows
      run.bat を実行（または lm.jar を直接実行）

  - Linux/Mac
      run.sh を実行（または lm.jar を直接実行）

1.2 CUIモード（旧版）の起動

  次のコマンドにより実行すると、CUIインタプリタを起動することができる。

    $ java -cp lm.jar lambda.Main


2. 基本

    M ::= \x.M    - ラムダ抽象 (λ-abstraction)
        | M M     - 適用 (application)
        | x       - 変数
        | <m>     - マクロ（拡張構文）

  変数名は英字1文字 (A-Z, a-z) のみからなる。
  したがって、束縛変数や適用で変数を並べるときは空白等で区切る必要はない。

  束縛変数として既に束縛されている変数名を使用することはできるが、その場合既に束縛されていた変数は
  隠される (shadowing)。
  つまり、\x.(\x.x) という式は \x.(\y.y) を意味し、\y.(\x.y) という解釈はありえない。

  ラムダ記号はλの代わりに半角バックスラッシュ記号 (\) を用いる。
  フォントによっては円記号に見えるが、問題はない。
  \x.\y.xy というラムダ抽象は \xy.xy と略記することができる。

  適用は左結合である。つまり、xyz という式は (xy)z という式と同値である。

  インタプリタで

    id = \x.x

  のように入力することでマクロを定義することができる。
  以降、ラムダ式中で (\x.x) の代わりに <id> と書くことができる。
  例えば、(\y.yy)<id> というラムダ式は

    (\y.yy)<id> --> <id><id>
                --> (\x.x)<id>
                --> <id>
                --> (\x.x)

  というように簡約される。
  未定義のマクロは簡約されない。簡約基が未定義のマクロのみになった場合、その式は正規形とみなされる。

  付属の prelude.lm.txt にはラムダ計算でよく出てくる基本的な式が定義されている。
  これはインタプリタで :l prelude と入力すると読み込むことができる。

2.1 η-簡約

  η-簡約とは、M をラムダ式として、変数 x が M において自由出現しない場合に、関数の外延的等価性に基いて

    \x.Mx  -->η  M

  と簡約するものである。例えば、

    \x.(\ab.aab)x

  というラムダ式と

    \ab.aab

  というラムダ式は、任意のラムダ式に適用して簡約すると結果が同一となり、外延的に等価である。
  したがって、η-簡約により

    \x.(\ab.aab)x  -->η  \ab.aab

  と簡約することができる。一方、

    \x.(\ab.abx)x

  というようなラムダ式を

    \ab.abx

  と簡約することはできない。

  GUIインタプリタでは「enable eta-reduction」にチェックを入れると、η-簡約が簡約基の候補に現れ、
  選択可能となる。


3. システムコマンド

  インタプリタ組み込みのコマンド。半角コロン記号 (:) に続けて指定する。

    :?            - コマンドヘルプを表示する
    :f <expr>     - 式中のマクロをすべて展開して表示する（簡約は行わない）
    :l <name>     - ファイルからマクロ定義を読み込む
    :l            - カレントディレクトリ内の *.lm.txt ファイルを読み込む
    :s <n>        - 連続ステップ数を設定する
    :s            - 現在の連続ステップ数を表示する
    :t (on|off)   - トレースモードを設定する
    :t            - 現在のトレースモードの設定を表示する
    :m            - 定義されたマクロ名とその定義式を表示する
    :clear        - マクロ定義を消去する
    :pwd          - カレントディレクトリのパスを表示する
    :short        - 短縮表示モードを切り替える
    :conv         - データ変換表示モードを切り替える
    :q            - インタプリタを終了する

  補足： これらは CUI モードにおいて利用可能であったが、いくつかのコマンドは GUI モードでは無効化されている。
  現在のバージョンでは、:? :f :l :c :pwd :q コマンドのみが利用可能である。
  その他の設定はコマンドの代わりにチェックボックスで指定する。


4. バージョン情報

- ver 3.80 (Descember 6, 2012)
  簡約基の識別が正しくなかった不具合を修正
  オートモードにおける連続実行ステップ数を設定できるようにした
  グラフパネルの整備とアニメーション機構の最適化
  ラムダ状態グラフ探索機能を実装及びGUIモードに統合
  起動時にデッドロックが稀に生じることがある不具合を修正

- ver 3.72 (December 4, 2012)
  オートモードが動かなくなる不具合を修正
  誤ったη-簡約 (\f.fx --> f など) が行われてしまう不具合を修正
  遷移の記号を簡約の種類にしたがって変更

- ver 3.71 (November 29, 2012)
  ステップバックを追加
  簡約手順の出力をLaTeXソースに変換する機能を追加
  マクロ定義テーブルの行の高さがフォントサイズに合わせて変わるように修正

- ver 3.70 (November 26, 2012)
  η-簡約を実装
  いくつかの軽微なバグ修正
  リファクタリング

- ver 3.60 (November 23, 2012)
  GUIモードの整備、デフォルトでGUIを起動するように
  フォントサイズ変更機能を実装
  行入力履歴を実装
  オートモードにおけるスタックオーバーフロー（計算の発散）を処理

- ver 3.50 (November 21, 2012)
  GUIモードをおおまかに実装、大体動く程度に
  簡約基の表示と選択を実装、オートモードの実装
  readme改訂

- ver 3.00 (November 15, 2012)
  大幅にメンテナンス、修正、改善

- ver 2.40 (November 3, 2011)
  :l コマンドでファイルが読み込まれなかったバグを（多分）修正
  特定の条件下でマクロが展開されず簡約が停止するバグを修正
  システムコマンドの追加

- ver 2.35
  最初
