ダウンロード

第4章
1.
組み込み述語を使う
ETI の ダ ウ ン ロ ー ド と イ ン ス ト ー ル の 方 法
こ の テ キ ス ト で は 、 ET 言 語 の イ ン タ ー プ リ タ で あ る ETI を 用 い て ET プ ロ グ ラ ミ ン グ
を 学 習 す る 。 ETI に は ユ ー ザ イ ン タ ー フ ェ イ ス に 関 し て 、 CUI 版 ( 文 字 ベ ー ス ) と GUI
版( グ ラ フ ィ ッ ク ベ ー ス )の 2 つ の 版 が あ る が 、本 テ キ ス ト で は GUI 版 を 中 心 に 説 明 す る 。
ダ ウ ン ロ ー ド サ イ ト http://assam.cims.hokudai.ac.jp/eti
か ら ETGUI.exe(ETI)を ク
リックし、任意のフォルダに保存する。すると、フォルダ内にアイコン(電子レンジ)が
出てくる。これは自己解凍形式になっており、アイコンをダブルクリックすると解凍先の
指 定 が 出 て く る の で 、 ETI を イ ン ス ト ー ル す る フ ォ ル ダ を 指 定 し て 、 OK ボ タ ン を 押 す 。
すると、解凍が始まり、解凍後に自動的にセットアップが起動する。
イ ン ス ト ー ル の 画 面 が 出 て き た ら 、 指 示 に 従 っ て Next ボ タ ン を 押 す ( イ ン ス ト ー ル 先
の 指 定 が 間 違 っ て い な い か を 確 認 す る )。イ ン ス ト ー ル 終 了 後 に 、再 起 動 を 促 す ダ イ ア ロ グ
ボ ッ ク ス が 出 る こ と が あ る が 、 ETI は 再 起 動 の 必 要 が な い よ う に 作 ら れ て い る の で 、 そ れ
はキャンセルして構わない。インストールが成功すると、デスクトップにアイコンが現れ
る 。 こ の ア イ コ ン を ダ ブ ル ク リ ッ ク す る と 、 ETI を 起 動 す る こ と が で き る 。
2.
ETIで組み込み述語を直接実行する
E T I で は 、 あ ら か じ め シ ス テ ム に 組 み 込 ま れ て い る 述 語 (組 み 込 み 述 語 )に 関 す る 質 問
を 直 接 入 力 し て 、 計 算 を 行 う こ と が で き る 。 ま ず 、 E T I を 起 動 す る に は 、「 ETGUI.exe」
を ダ ブ ル ク リ ッ ク し て 、シ ス テ ム を 起 動 す る 。す る と
[D]>
というプロンプトが画面に
表 示 さ れ る 。プ ロ ン プ ト と は 入 力 を 促 す 記 号 で あ る 。E T I を 起 動 し て
トの後に質問
(:= *X (+ 1 2))
[D]>
プロンプ
を 入 力 し 、 enter を 押 す と そ の 質 問 に 対 す る 計 算 結 果 が
表示される。なおすべての入力は黒い画面ではなく、下のほうの白い入力エリアに書く。
ここでは編集を行うことができ、改行すればそのときの文字列が黒い画面に反映される。
[D]>(:= *X (+ 1 2))
--------------------D execution -----------------------------------------------------------------------------succeeded.
(:= 3 (+ 1 2))
execution time: 0 [msec]
その後、同じようにプロンプトが表示されるので、入力と計算は何回も繰り返すことがで
き る 。ETI を 終 了 す る と き は 、[D ]>
q
と入力すればウインドウが閉じて終了となる。
16
3.
ETIで用いる組み込み述語
ETIの組み込み述語をいくつか紹介しよう。
(1)
単一化
単一化とは代入によって2つの引数を一致させることであり、一致させることができな
い場合は失敗する。代入は両方の引数に対して行われる。単一化は述語「=」を用いて記
述する。
例
(= 7 *Y)
*Y は 7 に な る → 成 功
(= *X 6)
*X は 6 に な る → 成 功
(= *X apple)
*X は apple に な る → 成 功
(=
→ 失敗
5 6)
(= *X *Y)
(2)
*Y は *X に な る → 成 功
算術演算
数 式 を 計 算 す る と き に は 「 :=」 を 用 い る 。 も っ と も 頻 度 が 高 い 使 い 方 は 、
(:= < 変 数 > < 数 式 > )
の形のアトムを用いるものである。
例
足し算
(:= *X (+ 3 1 ))
*X に 3 足 す 1 の 答 4 を 代 入
引き算
(:= *X (− 5 2 ))
*X に 5 引 く 2 の 答 3 を 代 入
掛け算
(:= *X (x 3 3 ))
*X に 3 掛 け る 3 の 答 9 を 代 入
(演 算 子 は 小 文 字 エ ッ ク ス )
割り算
*X に 10 割 る 2 の 答 5 を 代 入
(:= *X (d 10 2 ))
(演 算 子 は 小 文 字 デ ィ ー )
余り
(:= *X (mod 9 4 ))
*X に 9 を 4 で 割 っ た 余 り 1 を 代 入
数式は、いくつかの演算を複合してもよい。
例
*X に (3 + 4 )+ 5 の 答 1 2 を 代 入
(:= *X (+ (+ 3 4) 5))
(:= *X (x 4 (− 6 (d 12
3))))
*X に 4 ×(6 − 12÷3 )の 答 8 を 代 入
(d 10 3)の よ う な 整 数 の み の 計 算 は 、 答 は 整 数 型 と な る 。 割 り 切 れ な い 場 合 は 小 数 点 以 下
が 切 り 捨 て ら れ て 、 3 が 答 と な る 。 (d 10.0 3)と い う よ う に 小 数 を 扱 っ た 計 算 は 答 が 浮 動
小 数 点 型 と な り 、 小 数 点 以 下 も 計 算 さ れ る 。 [D]> (:= *X (d 10.0 3))と 入 力 し て 、 Enter
を押すと、計算結果は次のページのようになる。
17
[D]>(:= *X (d 10.0 3))
--------------------D execution ----------------------------------------------------------------------------succeeded.
(:= 3.333333 (d 10.000000 3))
execution time: 0 [msec]
「 =」 と 「 :=」 の 違 い に 注 意 し た い 。「 =」 は 「 両 辺 の 一 致 」 で あ り 、「 :=」 は 「 右 辺 の 計 算
結 果 と 左 辺 の 一 致 」 で あ る 。 (= *X (+ 1 2))と 直 接 入 力 す る と 、 *X は (+ 1 2)と い う リ
ス ト を 返 す 。 (:= *X (+ 1 2))と 直 接 入 力 す る と 、 *X は 3 と い う 数 を 返 す 。 = は 構 造 の
同 一 化 の 意 味 を 持 つ の で 、そ の ま ま の 構 造 を *X に 代 入 す る が 、:=は 算 術 計 算 の 意 味 を 持
つ の で 、 計 算 し た 結 果 を *X に 代 入 す る 。
「 :=」 の 左 辺 は 数 を 書 く こ と も で き る 。
(:= < 数 > < 数 式 > )
これは、右辺の数式の計算結果と左辺の数が等しいか否か判定するアトムとなる。
数式を計算する時点で具体的な数式が確定していないとエラーが発生するので、プログラ
ムを書くときには注意する必要がある。
(3)
数の比較
2つの数の大小関係については、不等号を用いて記述する。
例
小なり
(< 2 5 )
2は5よりも小さい
→
成功
大なり
(> 4 1 )
4は1よりも大きい
→
成功
以下
(<= 3
6)
3は6以下である
→
成功
以上
(>= 4
2)
4は2以上である
→
成功
(<
4)
→ 失敗
(4)
一
6
致
2 つ の 対 象 の 一 致 に つ い て は 、 等 号 (==)を 用 い て 記 述 す る 。
例
同じ
(== 7
7)
7と7は等しい
(== 4
*A)
→ 失敗
(== a
b)
→ 失敗
→
成功
「 =」 と 「 ==」 の 違 い に 注 意 し た い 。「 =」 は 「 両 辺 の 対 象 を 一 致 さ せ る よ う に 変 形 す る 」
こ と を 意 味 す る の に 対 し て 、「 ==」 は 「 そ の 時 点 で 両 辺 の 対 象 を 比 較 し 、 S 式 と し て 一 致
し て い る か 判 定 す る 」 こ と を 意 味 す る 。「 =」 に よ っ て 両 辺 に 含 ま れ る 変 数 が 特 殊 化 さ れ る
18
こ と は あ り う る が 、「 ==」 に よ っ て 対 象 が 変 化 す る こ と は な い 。
(5)
マッチング
マッチングとは、第1番目の引数に代入を施して、第2番目の引数に一致させることで
あ る 。 す な わ ち 、 (match *A *B) は 、 *A は 代 入 に よ っ て *B に な り 得 る か ど う か を 判 定 す
る。それが可能ならば、その代入を施して成功するが、不可能なら失敗する。この場合の
代 入 は 第 1 引 数 だ け に 対 し て 行 わ れ る 。こ れ は 単 一 化 と は 異 な る 。単 一 化 と は 、第 1 引 数 、
第2引数の両方に代入して一致させることである。
例
(match *X 5)
*X を 5 と 一 致 さ せ る → *X= 5 と な っ て 成 功
(match 5 *X)
5 を *X と 一 致 さ せ る → 5 は *X に な ら な い の で 失 敗
(match 5 5)
5を5と一致させる → 5はそのままで5なので成功
(match 5 7)
5を7と一致させる → 5は7にならないので失敗
(match 5 apple)
5 を apple と 一 致 さ せ る → 5 は apple に な ら な い の で 失 敗
第4章では、ETIの組み込み述語について説明した。今回説明したもの以外にも組み
込み述語は多数存在するが、数の計算に関する問題を解くうえで必要な知識は、最初はこ
のくらいで十分であろう。
付表1
組み込み述語一覧表(第4章で採り上げたもの)
組み込み述語
組み込み述語の意味
=
単 一 化 (a θ = b θ )
:=
計算結果との一致
>
大なり
<
小なり
>=
以上
<=
以下
==
等しい
match
マ ッ チ ン グ (a θ = b )
付表2
演算子一覧表
(第4章で採り上げたもの)
演算子
演算子の意味
+
足し算
−
引き算
x
掛け算
d
割 り 算 (商 )
mod
余り
19