Грамматика в клипах - PullRequest
       74

Грамматика в клипах

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

Я должен внедрить экспертную систему в CLIPS, которая использует грамматику, которая может генерировать:

  • Я видел учебник.
  • Я пошел в библиотека.
  • В библиотеке учебник, который я видел.
    Я получаю ввод от пользователя - давайте предположим, что это первое предложение - и я должен напечатать сообщение, например: ДА G1 G4 G3 G8, если я могу проанализировать ввод с моей системой или НЕТ, в противном случае.

Чтобы достичь этого, я нашел модельную систему, реализованную как:
(факты несовместимы
(правило G1 S i B)
(правило G2 S в E
(правило G3 B a C)
(правило G4 B видел B)
(правило G5 B прошло S)
(правило G6 B видел #)
(правило G7 B #)
(правило G8 C учебное пособие #)
(правило G9 D i B)
(правило G10 E библиотека B)
(правила S))


Теперь я не знаю, как реализовать правила, и мне нужна помощь.

Спасибо!

1 Ответ

1 голос
/ 19 марта 2020
         CLIPS (6.31 6/12/19)
CLIPS> 
(deftemplate sentence
   (multislot words)
   (multislot queue)
   (multislot rules)
   (slot symbol (default S)))
CLIPS>       
(deffacts productions
   (rule G1 S i B) 
   (rule G2 S in E) 
   (rule G3 B a C) 
   (rule G4 B saw B) 
   (rule G5 B went S) 
   (rule G6 B saw #) 
   (rule G7 B #) 
   (rule G8 C tutorial #) 
   (rule G9 D i B) 
   (rule G10 E a library B))
CLIPS>    
(deffacts test
   (sentence (words i saw a tutorial))
   (sentence (words i went in a library))
   (sentence (words in library a tutorial i saw)))
CLIPS>              
(defrule load-queue
    ?f <- (sentence (words ?w1 $?w2)
                    (queue)
                    (symbol S))
    =>
    (modify ?f (queue ?w1 $?w2)))
CLIPS>     
(defrule apply
   (rule ?r ?s $?m ?ns)
   (sentence (words $?w)
             (symbol ?s)
             (queue $?m $?e)
             (rules $?rules))
   =>
   (assert (sentence (words ?w)
                     (symbol ?ns)
                     (queue ?e)
                     (rules ?rules ?r))))
CLIPS>    
(defrule success 
   (declare (salience -10))
   (sentence (words $?w)
             (symbol #)
             (queue)
             (rules $?r))
   =>
   (printout t "YES " (implode$ ?w) " : " (implode$ ?r) crlf))
CLIPS> 
(defrule failure 
   (declare (salience -10))
   (sentence (words $?w) (queue $?w))
   (not (sentence (words $?w) (queue) (symbol #)))
   =>
   (printout t "NO  " (implode$ ?w) crlf))
CLIPS> (reset)
CLIPS> (run)
YES i saw a tutorial : G1 G4 G3 G8
YES i went in a library : G1 G5 G2 G10 G7
NO  in library a tutorial i saw
CLIPS> 
...