Inform

**Inform**は、1993年にGraham Nelsonが開発したインタラクティブフィクション（テキストアドベンチャー）のためのプログラミング言語であり、設計システムである。Informは、ZコードまたはGlulx仮想マシンで動作するコードを生成する。

バージョン1から5は1993年から1996年までにリリースされた。1996年ごろNelsonはInformを一から書き換え、バージョン6（**Inform 6**）を開発した。その後約10年間、Inform 6は安定版としてインタラクティブフィクションの執筆に広く使われた。2006年、Nelsonは**Inform 7**（**Natural Inform**とも）をリリースした。これは、全く新しい自然言語的記法が可能な言語で、書籍出版のメタファーとなっている各種ツール群も新たに開発された。

## ZマシンとGlulx
Inform は全バージョンでソースコードからZコードのファイル（ストーリーファイル）を生成する。生成されたファイル群をZコードインタプリタ（Zコードの仮想マシン仕様またはZマシン仕様を実装したプログラム）で実行する。Zマシン(Z-machine)は1979年にインフォコムがインタラクティブフィクションのために開発したものである。Zコードインタプリタはほとんど全てのコンピュータに移植されており、Zコードは変更することなくそれらのプラットフォーム上で実行可能である。

Andrew Plotkinは、自身が設計した仮想マシンGlulx向けのファイルを生成するInform 6の非公式版を開発した。Glulxは開発されてから数十年を経て古くなったZマシンの各種制限への対処として設計されたものである。2004年2月29日にリリースされたInform 6.3で、Plotkinの成果が正式版に取り入れられ、Inform 6は2種類の仮想マシンに対応するようになった。Inform 7の初期のバージョンはGlulxに対応していなかったが、2006年8月に対応版がリリースされた。

## Inform 6

Informは1993年、Graham Nelsonによって開発された。1996年、NelsonはInformを一から書き換え、バージョン6 (**Inform 6**) を開発した。その後約10年間、Inform 6は安定版としてインタラクティブフィクションの執筆に広く使われた。

Inform 6は大きく2つのコンポーネントに分かれている。**Inform コンパイラ**は、ソースコードからストーリーファイルを生成する。**Inform ライブラリ**はプレイヤーのテキスト入力の構文解析器と世界モデルを保持するための機能を備えたソフトウェアスイートである。また、コンパイラの入力となるプログラミング言語も**Inform**と呼ぶ。

Inform 6とZマシンは本来、インタラクティブフィクションの開発用に設計されたものだが、それ以外の開発にも使われている。例えば、BASICインタプリタ、LISPチュートリアル（完全なインタプリタ付き）、テトリスゲームなどのゲームがInform 6を使って開発されたことがある。

### コンパイラ
Informコンパイラは、Inform 6向けのソースコードからZマシンまたはGlulxで実行可能なファイル（ストーリーファイル）を生成する。

### プログラミング言語
Inform言語は、オブジェクト指向かつ手続き型である。言語の基本要素はオブジェクトで、オブジェクトは親子関係のオブジェクトツリーで管理される。この親子関係は場所を表すのにも使われているため、あるオブジェクトの親となっているオブジェクトは、子オブジェクトを保持している (hold) とも言われる。オブジェクトはツリー上を移動できる。トップレベルオブジェクトは例えば、ゲーム内の部屋などの場所を表し、家具や小物やノンプレイヤーキャラクター、プレイヤーのキャラクター、背景効果などがオブジェクトとして保持される。親子関係は任意であり、例えば`livingroom`（居間）オブジェクトが`insurancesaleman`（保険外交員）オブジェクトを保持し、`insurancesaleman`オブジェクトが`briefcase`（かばん）オブジェクトを保持し、`briefcase`オブジェクトが`insurancepaperwork`（保険書類）オブジェクトを保持するといったことが考えられる。

初期のInformでは、オブジェクトはいわゆるオブジェクト指向プログラミングのオブジェクトとは異なるもので、クラスに相当する概念がなかった。その後、クラス定義が追加され、オブジェクトはクラスに属せるようになった。オブジェクトやクラスは複数のクラスを継承できる。インタラクティブフィクションゲームには一般に多数のオブジェクトが登場する。そのためInformでの多くのオブジェクトは「メタクラス」オブジェクト以外のクラスを継承しない。しかし、オブジェクトには属性（ブーリアン型のプロパティ、`scenery`や`edible`など）があることが多く、Informライブラリがそれを認識する。普通の言語であれば、これら属性は継承によって実装されるべきものである。

以下にInform 6のソースコードの例を示す。

  Main;
     print "Hello World^";
 ;

### ライブラリ
InformシステムにはInformライブラリがあり、インタラクティブフィクションのプログラミングで難しい部分のほとんどを自動化している。特にプレイヤーが入力するテキストの構文解析器と、部屋やドアやプレイヤーの持ち物などのオブジェクト（とそのプロパティ）を保持する世界モデルが含まれる。

Informコンパイラから見ればInformライブラリは必須ではない。代替ライブラリもいくつか存在し、PlutypusやInformATEなどがある（後者はスペイン語向け）。

### ゲームでの例
Informライブラリを使ったInformのソースコードの例を以下に示す。Inform 6を前提としている。Inform 7では全く文法が異なるが、レガシーコードであることを示すよう修正を加えれば、Inform 7でも使用可能である。


```
Constant Story "Hello World";
 Constant Headline "^An Interactive Example^";

 Include "Parser";
 Include "VerbLib";

  Initialise;
     location = Living_Room;
     "Hello World";
 ;

 Object Kitchen "Kitchen";
 Object Front_Door "Front Door";

 Object Living_Room "Living Room"
     with
         description "A comfortably furnished living room.",
         n_to Kitchen,
         s_to Front_Door,
     has light;

 Object -> Salesman "insurance salesman"
     with
         name 'insurance' 'salesman' 'man',
         description "An insurance salesman in a tacky polyester 
               suit.  He seems eager to speak to you.",
         before ;
             Listen:
                 move Insurance_Paperwork to player;
                 "The salesman bores you with a discussion
                  of life insurance policies.  From his
                  briefcase he pulls some paperwork which he
                  hands to you.";
         ,
     has animate;

 Object -> -> Briefcase "briefcase"
     with
         name 'briefcase' 'case',
         description "A slightly worn, black briefcase.",
     has container;

 Object -> -> -> Insurance_Paperwork "insurance paperwork"
     with
         name 'paperwork' 'papers' 'insurance' 'documents' 'forms',
         description "Page after page of small legalese.";

 Include "Grammar";
```


### Inform 6またはそれ以前のバージョンを使って開発された主なゲーム
* *Curses*, by Graham Nelson (1993) - Informで書かれた最初のゲーム。
* *So Far*, by Andrew Plotkin (1996) - 1996年、最初のXYZZY Award for Best Gameを受賞。
* *Anchorhead*, by Michael S. Gentry (1998) - ハワード・フィリップス・ラヴクラフトのクトゥルフ神話に基づいたホラー。
* *Photopia*, by Adam Cadre (1998) - ほとんどパズル的要素のない初のゲーム。1998年のInteractive Fiction Competitionで優勝。
* *Varicella* by Adam Cadre (1999) - 1999年のXYZZY awardsのBest Game部門などで優勝。学術的論文も書かれた。
* *Galatea*, by Emily Short (2000) - 同名のアニメーション化した像との対話を中心にしたゲーム。インタラクティブフィクションでのノンプレイヤーキャラクターとの対話としては最も複雑なものとされている。Adam CadreはGalateaを "the best NPC ever" と称した。
* *Slouching Towards Bedlam*, by Star C. Foster and Daniel Ravipinto (2003) - スチームパンクの設定で、メタゲーム的構造を持つ（内部に別のゲームが登場し、そのゲームをセーブしたものを外側のゲームとしてリストア可能）。 XYZZY awardsを受賞し、2006年のInteractive Fiction Competitionでも好成績を収めた。

## Inform 7

2006年4月30日、Graham Nelsonはrec.arts.int-fictionというニュースグループでInform 7のベータ版リリースを発表した。Inform 7は主に3つの部分から構成される。**Inform 7 [[統合開発環境|IDE]]**はインタラクティブフィクションのテストに特化した開発ツールである。**Inform 7コンパイラ**は新たな言語用コンパイラ、"**The Standard Rules**" はInform 7のライブラリの中核である。Inform 7では、Inform 6のコンパイラとライブラリも必要とする。Inform 7のコンパイラはソースコードからInform 6用ソースコードを生成し、そこから Inform 6のコンパイラでGlulxやZコードのストーリーファイルを生成する。Inform 7はインタラクティブフィクションのパッケージ形式であるBlorbファイルもデフォルトでサポートしている。これは、Zコードのファイルや表紙画像、検索用メタデータなどを格納するアーカイブファイルである。Inform 7の完全セットは今のところMac OS X、Windows、Linuxで利用可能である。2007年3月25日、Linuxでのコマンド行サポートが追加され、新たなリリースではSourceForge.netの**GNOME Inform 7**プロジェクトで開発されているGNOMEデスクトップ環境で動作するIDEも同梱されるようになっている。言語とツールの開発は続いており、2007年3月25日のリリースでも言語に様々な変更が加えられた。

Inform 7は短期間だけ**Natural Inform**と呼ばれていたが、その後Inform 7に改名された。このため、Inform 7のコンパイラは "NI" とも呼ばれる。

### IDE
Inform 7には、Mac OS XとWindowsで動作する統合開発環境 (IDE) が付属する。Mac OS X版IDEはAndrew Hunterが開発し、Windows版IDEはDavid Kinderが開発した。

Inform 7 IDEには、Inform 7のソースコード編集のためのテキストエディタが含まれる。他のソースコードエディタと同様、シンタックス強調機能がある。引用符で囲まれた文字列は色付きで表示される。章節見出しは太字で大きく表示される。コメントはやや小さいフォントで別の色付きで表示される。

IDE にはZコードインタプリタも組み込まれている。Mac版IDEのインタプリタは、Andrew Hunterが開発したZoom インタプリタを基本としている。Windows版IDEのインタプリタはWinFrotzに基づく。

開発者が組み込みのインタプリタでゲームをテストすると、IDEの "skein" または "transcript" ビューにその進行状況が報告される。skeinビューでは、分岐する木構造としてプレイヤーのコマンドを追跡する。分岐においてゲームの同じ部分を再生せずに開発中ゲームの異なる経路を再試行でき、迅速なテストが可能である。経路には注釈をつけたり、正解としてマークしたりできる（それをテキストでのウォークスルー用に出力可能）。transcriptビューでは、プレイヤーのコマンドとゲームの応答を記録する。応答が正しければ、それを "blessed" とマークできる。再生したときblessedとマークされた部分は強調されるので、開発者が問題を発見する助けとなる。

IDEは開発中のプログラムに各種索引を提供する。コードをクラス階層として示したり、従来的なIFマップで示したり、本の目次のように示したり、といった様々な形態の表示が可能である。索引上の項目をクリックすると、対応するソースコードにジャンプできる。

IDEは2つのペインを左右に並べて表示する。それぞれのペインには、ソースコード、コンパイルの現在状態、skein、transcript、ソースコードの索引、ゲームの実行中画面、Inform 7の文書、その他プラグイン、設定などが表示できる。これは、多数のペインを同時表示するのではなく2つの向かい合うページのようにペインを表示することで、ノートを模倣しているのである。

### コンパイラ
Inform 7のコンパイラはInform 6のソースコードを生成する。その後Inform 6のコンパイラを使ってZコードを出力する。Inform 7は "Natural Inform" と呼ばれていた関係で、そのコンパイラは "NI" とも呼ばれている。

### プログラミング言語
特筆すべき機能として、宣言型プログラミングによる強化と、オブジェクトが使われる状況からその型と属性を推論する能力がある。例えば、"John wears a hat."（ジョンは帽子をかぶっている）という文から、"John" という "person" が生成され（wear という動詞の主語は人物だけであるため）、"wearable" 属性を持つ "thing" が生成され（wearの目的語は着用可能でなければならないため）、Johnが帽子を着用している状態に設定される。

また、オブジェクト間の関係も直接サポートしている。例えば、あるオブジェクトの中に別のオブジェクトがあるとか、あるオブジェクトが別のオブジェクトを着用しているといった関係を自動的に抽出する。また、開発者が独自の関係を追加することもできる。例えば、「愛する」とか「嫌う」といった関係を追加することもでき、登場人物間の好悪関係を保持することができる。

Inform 7はドメイン固有言語の一種であり、Inform 6よりも抽象的なレベルでインタラクティブフィクションを構築でき、ソースコードの可読性も向上している。

### ゲームでの例
以下は、上掲の "Hello World" の例をInform 7で書いて再実装したものである。Inform 7でのコンパイルで自動的にリンクされる "The Standard Rules" というライブラリを使っている。

### Inform 7で書かれた主なゲーム
Emily Shortの*Mystery House Possessed*（2005年）は、一般にリリースされた最初のInform 7を使ったゲーム。"Mystery House Taken Over" プロジェクトの一環としてリリースされた。

2006年3月1日、Shortは3つのゲームのリリースを発表した。*Bronze*（パズル指向の従来型ゲーム）、*Damnatio Memoriae*（Short 作の Inform 6 のゲーム *Savoir-Taire* の続編）、Graham Nelson の *The Reliques of Tolti-Aph*である。2006年4月30日にInform 7のパブリックベータ版を発表すると同時に、3月1日にリリースされた3本を含む6本の「動作例」がソースコードと共に公開された。

Emily Shortの*Floatpoint*はInform 7を使ったゲームとして初めてInteractive Fiction Competitionで優勝した。また、2006年のXYZZY awardsのBest Setting部門とBest NPCs部門でも優勝している。nespresso作の*Rendition*（2007年）は、テキストアドベンチャーゲームの形態をとった政治的実験小説であり、プレイヤーは自身の共犯に立ち向かうことを要求される。この悲劇の手法はACMとケンブリッジ大学で学術的に論じられている。

## 参考文献
; Inform 6
* Graham Nelson, *Inform Designer's Manual*. チュートリアル兼マニュアル兼技術文書。公式サイトから自由にダウンロード可能。書籍としてはソフトカバー版 (ISBN 0-9713119-0-0) とハードカバー版 (ISBN 0-9713119-3-5) がある。
* The *Inform Beginner's Guide* by Roger Firth and Sonja Kesserich (ISBN 0-9713119-2-7) - より平易なInform入門。公式サイトから自由にダウンロード可能。
;Inform 7
*  The SPAG Interview - Inform 7開発に関するGraham NelsonとEmily Shortへのインタビュー。このインタビューはリリース直前に行われ、リリースと同時に公開された。
* "Natural Language, Semantic Analysis and Interactive Fiction" - 設計者Graham NelsonによるInform 7の設計に関する論文。

## 脚注

## 外部リンク
* Inform 7 - 公式サイト
* Inform 7 - 公式サイト
* Inform 6 - 公式サイト
* Inform 6 FAQ at Roger Firth's IF Pages
* The Interactive Fiction Archive Inform関連ツール、例、ライブラリなどがある。
* Inform category at the Open Directory Project
* Cloak of Darkness: Inform 同じ短いゲームをInform 6およびInform 7（さらには他の言語）で実装した例で比較している。