Prolog 写経記 その 47 aeq/3

(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.

Prologユーティリティライブラリ

Prologユーティリティライブラリ

なにげに昨日で「2 章 集合操作」を終えてしまいました.まとめて一気という感じ.
そんなわけで (どんなわけで?),次は「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文字コードのリストにしたものが同じなら XY は同じということですね.

注記

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(+, ?) って感じですか.
なかなか微妙ですなぁ.