今までは単位節やホーン節(:- がある述語)などを使ってきましたが、
その他にdcgと言った便利な方法があります。
prologの設計者のAlain Colmerauer氏はこれを作りたくてprologを作ったと
誰かに聞いた覚えがあります。
weather --> a,b,c,d.
a --> ['今日'].
a --> ['昨日'].
a --> ['明日'].
b --> ['の天気は'].
c --> ['晴れ'].
c --> ['雨'].
c --> ['曇'].
d --> ['です'].
test:-weather(A,[]),atom_appends(A,B),write(B),nl,fail.
test:-!.
テストしてみましょう。
?-test.
今日の天気は晴れです
今日の天気は雨です
今日の天気は曇です
昨日の天気は晴れです
昨日の天気は雨です
昨日の天気は曇です
明日の天気は晴れです
明日の天気は雨です
明日の天気は曇です
yes
このように単語を属性ごとに分けて管理することができます。
ところで、どういった構成になっているのでしょうか?
これはlistingを行えば、実はdcgはリストになっていることが分かります。
?-listing.
test :-
weather(A,[]),
atom_appends(A,B),
write(B),
nl,
fail.
test :-
!.
c([晴れ|_0],_0).
c([雨|_0],_0).
c([曇|_0],_0).
a([今日|_0],_0).
a([昨日|_0],_0).
a([明日|_0],_0).
b([の天気は|_0],_0).
d([です|_0],_0).
weather(_0,_1) :-
a(_0,_2),
b(_2,_3),
c(_3,_4),
d(_4,_1).
weatherの第2アリティが空リスト担っているのは、_0を[]にしたい為です。
こうすれ第1アリティに[a,b,c,d]といったリストがユニフィケーションされるので、
最後にatom_appendsすればアトム型の文字列を得ることができます。
こうやった使い方もできます。
test:-weather(['今日','の天気は','晴れ','です'],[]).
?-test.
yes
最終更新:2014年05月09日 13:14