Генератор не работает в прологе DCG.Как изменить аргументы в функции пролога, чтобы она начала работать как генератор - PullRequest
0 голосов
/ 05 декабря 2018

Это мой код, который работает как распознаватель.Это работает.

s --> v(X), v(X), c(Y).
s --> v(X), c(Y), c(X).

v(quiet) --> line(quiet).
v(loud) --> line(loud).

c(quiet) --> line(quiet).
c(loud)  --> line(loud).

line(quiet) --> ['laa!'].
line(loud)  --> ['LAA!'].

Но затем я пытаюсь обработать этот код для синтаксического анализатора

s(s(X,X,Y)) --> v(X), v(X), c(Y).
s(s(X,Y,X)) --> v(X), c(Y), c(X).

v(quiet,v(quiet)) --> line(quiet).
v(loud, v(loud)) --> line(loud).

c(quiet, c(quiet)) --> line(quiet).
c(loud, c(loud))  --> line(loud).

line(quiet, line('laa!')) --> ['laa!'].
line(loud , line('LAA!')) --> ['LAA!'].

Я не уверен, как правильно изменить аргументы, чтобы распознаватель работалкак синтаксический анализатор.Кто-нибудь может подсказать мне, как мы можем изменить аргументы, чтобы он работал как парсер.

1 Ответ

0 голосов
/ 06 декабря 2018

Я думаю, что вы уже прошли 90% пути с оригинальным кодом.Я не знаю, что вы хотите проанализировать, поэтому я придумал следующее:

s(xxy(X,Y)) --> v(X), v(X), c(Y).
s(xyx(X,Y)) --> v(X), c(Y), c(X).

v(quiet) --> line(quiet).
v(loud) --> line(loud).

c(quiet) --> line(quiet).
c(loud)  --> line(loud).

line(quiet) --> ['laa!'].
line(loud)  --> ['LAA!'].

Как вы можете видеть, единственное существенное изменение здесь - это изменение s//0 на s//1 и возвращение чего-тос переменными X и Y (которые ранее были синглетонами в любом случае).Пример использования его для анализа всех ваших предложений:

?- phrase(s(Parse), Sentence).
Parse = xxy(quiet, quiet),
Sentence = ['laa!', 'laa!', 'laa!'] ;
Parse = xxy(quiet, loud),
Sentence = ['laa!', 'laa!', 'LAA!'] ;
Parse = xxy(loud, quiet),
Sentence = ['LAA!', 'LAA!', 'laa!'] ;
Parse = xxy(loud, loud),
Sentence = ['LAA!', 'LAA!', 'LAA!'] ;
Parse = xyx(quiet, quiet),
Sentence = ['laa!', 'laa!', 'laa!'] ;
Parse = xyx(quiet, loud),
Sentence = ['laa!', 'LAA!', 'laa!'] ;
Parse = xyx(loud, quiet),
Sentence = ['LAA!', 'laa!', 'LAA!'] ;
Parse = xyx(loud, loud),
Sentence = ['LAA!', 'LAA!', 'LAA!'].

Чтобы дать вам больше помощи, мне, вероятно, придется узнать больше о промежуточном представлении, которое вы хотите получить, но, надеюсь, это проиллюстрирует идею,Вы были уже так близко!

...