Prolog DCGs несколько функций? - PullRequest
7 голосов
/ 30 июня 2011

Насколько я понимаю, в Прологе вы записываете функции при синтаксическом анализе следующим образом:

 foo(feature(X)) --> [X], bar.

Это часто встречается при разработке DCG?

 foo(featureA(X), featureB(Y)) --> [X], [Y], bar.

Ответы [ 2 ]

6 голосов
/ 30 июня 2011

DCG описывают отношения между списками и аргументами нетерминалов. Однако эти аргументы являются всего лишь терминами. Они могут использоваться для представления функций, но не представляют их напрямую. Чтобы увидеть разницу, представьте, что вы хотите связать число функций с каждым узлом. В DCG вы теперь должны решить, как для каждого случая представлять эту функцию. В одном узле это feature(X, singular), а в другом узле это может выглядеть иначе. Или вы можете решить представить все объекты единообразно в виде списка, таким образом [nodename=idx,..., numerus=singular,...].

5 голосов
/ 30 июня 2011

Это совершенно правильно и весьма полезно. В качестве примера рассмотрим это правило, взятое из классической (и теперь бесплатной!) Книги PNLA , в которой используются два аргумента для захвата перегиба и «значение» (логическая форма 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)   ).

( См. Полный пример. )

...