dcg

今までは単位節やホーン節(:- がある述語)などを使ってきましたが、
その他に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