Создать парсер DCG в PROLOG - PullRequest
       60

Создать парсер DCG в PROLOG

0 голосов
/ 31 марта 2020

Мне нужно реализовать в PROLOG синтаксический анализатор без контекста, который использует грамматику, которая может генерировать:

I saw a tutorial.
I went in a library.
In library a tutorial I saw. 

(я знаю, что это не правильно грамматически, но мне нужно посмотреть, как соответствовать шаблону )

Я получаю входные данные в качестве запроса - давайте предположим, что это первое предложение - и я должен напечатать количество применений правил для успешного разбора, в противном случае - false.

В порядке Для этого я нашел следующие грамматики:


s (X, Z): - vp (Y, Z), np (X, Y).
np (X, Z): - дет (X, Y), n (Y, Z).
np (X, Z): - дет (X, Y), n (Y, Z), np (X, Z).
vp (X, Z): - дет (X, Y), v (Y, Z).

дет ([i | W], W).
йе ([а | W], W).
дет ([in | W], W).

n ([учебник | W], W).
n ([библиотека | W], W).

v ([пошел | W], W).
v ([saw | W], W).


Это работает для первых двух предложений, но я не знаю, как заставить это работать для последнего, и я не Не знаю, как распечатать количество применений правил для успешного разбора.

Спасибо!

1 Ответ

0 голосов
/ 04 апреля 2020

Это поможет с количеством применений правил для успешного разбора. Однако, как вы можете видеть, это всегда будет то же число, что и количество слов в предложении. Что я сделал, так это внедрил «counter» в параметрах каждого правила, и каждый раз, когда «базовое правило» исполняется, оно увеличивает значение «counter».

det([i|W], W, A, R) :- R is A + 1.
det([a|W], W, A, R) :- R is A + 1.
det([in|W], W, A, R) :- R is A + 1.

n([tutorial|W], W, A, R) :- R is A + 1.
n([library|W], W, A, R) :- R is A + 1.

v([went|W], W, A, R):- R is A + 1.
v([saw|W], W, A, R):- R is A + 1.

np([], R, R).
np(X, A, R2):- det(X, Y, A, R), np(Y, R, R2).
np(X, A, R3):- det(X, Y, A, R), n(Y, Z, R, R2), np(Z, R2, R3).
vp(X, Z, R2):- det(X, Y, 0, R), v(Y, Z, R, R2).

s(X, R2):- atomic_list_concat(L,' ', X), vp(L, Z, R), np(Z, R, R2), !.

Вот результаты . Results.

Как вы можете видеть, последнее предложение все еще не выполнено, потому что если вы будете следовать потоку алгоритм или вызовы этого вы можете видеть, что правило 's' вызывает правило 'vp', которое допускает только 'det', за которым следует 'v', поэтому, если вы видите первое слово третьего предложения, которое 'In' 'det' в 'vp' будет работать, но следующее слово, которое 'библиотека', не будет успешным на 'v', потому что 'библиотека' не глагол, поэтому она терпит неудачу. В заключение, если вы хотите, чтобы третье предложение было успешным, вам придется внести некоторые изменения в свои грамматики. Между прочим, есть лучший способ, возможно, немного более сложный для достижения, но как только вы поймете, как его использовать, будет быстрее работать и проще создать сложную грамматику, используя Prolog DCG https://www.swi-prolog.org/pldoc/man?section=DCG. Я упоминал на случай, если вы не знали об этом.

...