Prolog 写経記 その 47 aeq/3
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
そんなわけで (どんなわけで?),次は「3 章 アルファベット文字列の比較」へ突入です.
今日は
aeq/2
を写経します.解説
aeq(X, Y)
はアトムX
とアトムY
がアルファベット文字列として等しいときに成功する.
ふむ.
モード
aeq(+, +).
ホントですか? aeq(+, -)
または aeq(-, +)
としても使えないのかな?
後で確認しませう.
定義
では,こいつの定義を写経しませう.
aeq(X, Y) :- name(X, Name), name(Y, Name).
組み込み述語 name
が使われています.こいつはアトムを受け取り,それを構成する各文字の文字コードからなるリストを返す (またはその逆) というものです.
2 ?- name(ebiyuri, L). L = [101, 98, 105, 121, 117, 114, 105] Yes 3 ?- name(A, ['E', 'b', 'i', 'Y', 'u', 'r', 'i']). A = 'EbiYuri' Yes
そんなわけで (どんなわけで?),第 1 引数 X
と第 2 引数 Y
を文字コードのリストにしたものが同じなら X
と Y
は同じということですね.
注記
aeq
は比較対象がアトムでないときは失敗する.
らじゃあ.
例
では使用例を写経しませう.
6 ?- aeq('Word', 'Word'). Yes 7 ?- aeq(predicate, pred). No 8 ?- aeq('Jane', 'John'). No 9 ?- aeq(-13.7, -13.7). Yes
おやぁ?
最後の例,写経本では冷たく No
と言われることになってるんですけど?
ちょっと確認.
10 ?- name(-13.7, Name). Name = [45, 49, 51, 46, 55] Yes
ほほー.
どうやら,name/2
の振る舞いが写経本の想定と異なるようです.
本来数値はアトムではないことになっていると思いますが... うーみゅ.
手元にある本では name/2
が数値をどう扱うべきなのか不明瞭な感じ.
「Prolog: The Standard : Reference Manual (isbn:3540593047)」が届いたら調べることにしませう.
んではモードの確認.
12 ?- aeq('Hoge', Y). Y = 'Hoge' Yes 13 ?- aeq(X, 'Hoge'). ERROR: name/2: Arguments are not sufficiently instantiated
ぬお?
第1引数は具体的な値を与えないといけないのですか.
ふむ,そうでないと name(X, Name)
の呼び出しでどちらの引数も具体化されないからですか.
ってことは,モード的には aeq(+, ?)
って感じですか.
なかなか微妙ですなぁ.