私が理解していることから、Prologでは次のように解析しながら機能をキャプチャします:
foo(feature(X)) --> [X], bar.
これは DCG を設計するときによくあることですか?
foo(featureA(X), featureB(Y)) --> [X], [Y], bar.
DCG は、リストと非終端記号の引数の間の関係を記述します。ただし、これらの引数は単なる用語です。フィーチャを表すために使用できますが、直接表すことはできません。違いを確認するために、機能数値を各ノードに関連付けたいと想像してください。DCG では、その機能をどのように表現するかをケースバイケースで決定する必要があります。あるノードではそうですがfeature(X, singular)
、別のノードでは異なって見える場合があります。または、リストを使用してすべての機能を一様に表現することを決定する場合もあります[nodename=idx,..., numerus=singular,...]
。
それは完全に有効で、非常に便利です。例として、この規則を考えてみましょう。この規則は、古典的な (現在は無料です!) 本PNLAから引用したものです。この規則では、2 つの引数を使用して、他動詞の抑揚と「意味」 (論理形式LF
)を取得しtv
ます。
tv(nonfinite, LF) --> [TV], {tv(TV, _, _, _, _, LF)}.
tv(finite, LF) --> [TV], {tv(_, TV, _, _, _, LF)}.
tv(finite, LF) --> [TV], {tv(_, _, TV, _, _, LF)}.
tv(past_participle, LF) --> [TV], {tv(_, _, _, TV, _, LF)}.
tv(pres_participle, LF) --> [TV], {tv(_, _, _, _, TV, LF)}.
動詞は次のように定義できます。
tv( write, writes, wrote, written, writing, X^Y^ `writes(X,Y) ).