Есть ли способ реализовать синтаксический анализатор для контекстно-свободной грамматики в PROLOG при следующих условиях? (Пример CLIPS включен) - PullRequest
0 голосов
/ 30 марта 2020

Мне было интересно, есть ли способ реализовать парсер для контекстно-свободной грамматики в Прологе. В рамках изучения языка я хотел посмотреть, может ли в нем быть реализована следующая проблема:

Дано предложение в качестве ввода от пользователя (или, например, более как серия слов, например: я читаю книгу) Я бы хотел, чтобы программа выводила количество примененных правил синтаксического анализа, чтобы получить указанное предложение, или выводила false, если предложение не может быть проанализировано.

Минимальное покрытие предложения для программы должно быть:

am citit o carte; Я Мерс ла Мунка; la munca o carte am citit.

Несколько упоминаний здесь:
carte = book;
munca = рабочее место;
am citit / am mers = я прочитал / я пошел;
la munca = на рабочем месте (предлагая это в случае, если людям нужно знать, какие слова являются существительными, глаголами, суждениями или наречиями и т. Д. c.)

У меня есть нечто подобное, сделанное в CLIPS, если оно помогает. Единственное отличие состоит в том, что версия CLIPS определяет правила с именами G1, G2 et c, которые были применены вместо числа примененных правил.

(deffacts facts
        (waiting_input)
        (answer)
        (rule G1  S Am A)
        (rule G2  A citit B)
        (rule G3  B o C)
        (rule G4  C carte EPS)
        (rule G5  A mers D)
        (rule G6  D la E)
        (rule G7  E munca EPS)
        (rule G8  S La F)
        (rule G9  F munca G)
        (rule G10 G o H)
        (rule G11 H carte I)
        (rule G12 I am J)
        (rule G13 J citit EPS)
        (rule G14 G am K)
        (rule G15 K citit EPS)
        (rule G16 K o L)
        (rule G17 M carte EPS)

)

(defrule read_input
        ?a <- (waiting_input)
        =>
        (printout t "Insert sentence: " crlf)
        (assert (text S (explode$ (readline))))

        (retract ?a)
)

(defrule apply_rule
        (rule ?g ?nonterminal ?first ?next)
        ?a <- (text ?nonterminal ?first $?rest)
        ?b <- (answer $?steps)
        =>
        (assert (text ?next $?rest))
        (assert (answer $?steps ?g))

        (retract ?a)
        (retract ?b)
)

(defrule success
        ?a <- (text EPS)
        (answer $?steps)
        =>
        (printout t "YES" $?steps crlf)

        (retract ?a)
)

(defrule failure
        ?a <- (text $?)
        =>
        (printout t "NO" crlf)

        (retract ?a)
)

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

...