LISPやPrologを使って基本的な知識情報処理(主にグラフ探索)を行いましょう!
当ドキュメントは初歩的なプログラミングの知識がある方向けに作成しています. 例えば,四則演算(
+,-,*,/,%[mod]
)や条件式の解釈および制御(if (...) else ...
),関数の定義(ex.def func (args...) {...}
),特にデータ構造(配列やリスト)による有向/無向グラフの表現についての理解が必要です.
- LISPの数ある方言の中でも「Emacs Lisp (ELisp)」を使います.
- GNU Emacs(テキストエディタ)を用意してください.
ELispは主流なLISP方言群であるSchemeやCommom Lispとは大きく異なる部分があるようですが,ここでは多くのLISPで使用される最も基本的な関数(
car
,cdr
,cons
,eq
,atom
)や特殊形式(cond
,quote
, etc.),シンボル(t
,nil
)をベースにプログラムを記述しています.
- Prologの数ある処理系の中でも「SWI-Prolog」を使います.
- 任意のWebブラウザから「SWISH -- SWI-Prolog for SHaring」に接続してください(今回はこちらを利用).
- Linux環境であれば
swi-prolog
パッケージをインストールすることでSWI-Prologの処理系を用意できます. - Prologファイルの拡張子は「
.pl
」がよく使われますが,別のプログラミング言語であるPerlも同じ拡張子を使うことがあるため,競合する場合は「.pro
」「.prolog
」を代わりに使う手もあります(特にSWI-Prologの場合は.swi
を使うことがあるみたいです).
ちなみに,Prologは述語論理に基づいた宣言型言語であり,関数ではなく述語をプログラムで定義していきます.SWI-Prolog以外の処理系ではGNU Prologが有名です.
***.el
で終わるテキストファイルにELispのコードを書きます.- その他のテキストファイルでも
M-x emacs-lisp-mode
コマンドを実行することでEmacs-Lispモードに切り替えられます(ELispとしてテキストを認識します).多くの場合,
M-x
はAlt-x
に相当します. - 実行したい行末にポイント(カーソル)を合わせて
C-x C-e
を実行することで,直前のLisp式を評価できます(結果はミニバッファに表示されます).lispxmp
を導入できると実行結果を非常に確認しやすくなるのでオススメです. - 参考になりそうなサイト:
- ここではWebブラウザで「SWISH」を利用する方法を説明します.
コマンドラインシェルからSWI-Prologを利用する場合,
<file_name>.pl
というファイルにPrologのプログラムを記述し,prolog
のCLIを起動してからconsult(<file_name>).
または[<file_name>].
と入力することでファイル内の式を読み込むことができます(true
が表示されたら成功です!).[<file_name>].
で読み込める拡張子としては.pl
の他に.prolog
があります.他の拡張子を持つ場合は['<file_name>.pro']
のように拡張子まで含めたファイル名を' '
で囲いましょう. ちなみにprolog
を終了するにはhalt.
と入力してください. - 直感的な画面設計なので,特に解説は必要ないかもしれません.
- 画面左のタブに
[Program]
か[Notebook]
を追加して,そこにPrologのプログラムを記述します. - 右下のテキストボックス(左枠に"?-"と書かれている入力欄)に質問(評価したい式)を入力します.
- 参考になりそうなサイト:
-
Hello Lisp!:
elisp/hello_world.el
- 最初の儀式.
"Hello World!"
を出力します.
- 最初の儀式.
-
ELisp Basics:
elisp/elisp_basics.el
- Lispの基本的なプログラムを書いてみよう.
- 純LISPのデータ型, 関数, 特殊形式
- ELispの組み込み関数/特殊形式
- 別のファイルを読み込む(
load-file
) - ELispのコメントアウト方法
ELispの詳しい解説:GNU Emacs Lisp Reference Manual [日本語]
- Lispの基本的なプログラムを書いてみよう.
-
Hello Prolog!:
prolog/hello_world.pl
- 最初にやる定番.
"Hello World!"
を出力します.
- 最初にやる定番.
-
Prolog Basics:
prolog/prolog_basics.el
- Prologの基本的なプログラムを書いてみよう.
- 確定節:プログラムによる事実(Fact)の宣言, 規則(Rule)の定義
- ゴール節:質問(Question/Query)による事実/規則の証明
- データ型, 演算子(比較, 算術計算)
- 再帰によるループ実装
- リストの使い方
- カット(
!
)について - Prologのより詳しい入門:Prolog - Quick Guide
- Prologの基本的なプログラムを書いてみよう.
The source codes in this repository are provided under the MIT License, see LICENSE.