Мне было интересно, есть ли способ реализовать парсер для контекстно-свободной грамматики в Прологе. В рамках изучения языка я хотел посмотреть, может ли в нем быть реализована следующая проблема:
Дано предложение в качестве ввода от пользователя (или, например, более как серия слов, например: я читаю книгу) Я бы хотел, чтобы программа выводила количество примененных правил синтаксического анализа, чтобы получить указанное предложение, или выводила 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)
)
Все ответы приветствуются, хотя я был бы признателен за полное ответь больше. Из своего прошлого опыта я узнал, что лучше понимаю вещи, если вижу полное решение чего-то, так что я могу следить за ним построчно и смотреть, что делает решение галочкой.