Есть ли способ сделать контролируемый l oop в клипах? - PullRequest
0 голосов
/ 16 марта 2020

Здравствуйте, сообщество переполнения стека, я обращаюсь к вам за помощью. Я пытаюсь что-то сделать в CLIPS, вроде парсера, и у меня возникли небольшие проблемы. Подводя итог, я пытаюсь сделать программу, которая принимает ввод пользователя, который является фразой, такой как «Я читаю книгу», и дает вывод, основанный на некоторых правилах, которые я определил, скажем, «Я прочитал» идентифицируется как Правило G1, а «книга» идентифицируется правилом G2 («Книга» может быть идентифицирована правилом G3, если нам потребуется обработать ввод «Книга, которую я прочитал»).

Вывод «Я прочитал» книга "должна быть" ДА G1 G2 ", потому что на основе пользовательского ввода и правил программа определила правила, используемые для определения того, что было написано на вводе, предоставленном пользователем. Надеюсь, я объяснил это довольно хорошо, это мой первый вопрос. До сих пор мне удалось создать правила, и я учел ситуации, когда строка могла быть помещена в начало ввода (см. Правило G3, упомянутое выше).

Возможно, это можно решить с помощью слов Explode $ и подстановочных знаков как $? но я действительно не знаю, с чего начать.

Это мой код, я знаю, что он не очень:

(defrule G1
    =>
    (assert (regula G1 "I read"))
)

(defrule G2
    =>
    (assert (regula G2 "I read."))
)

(defrule G3
    =>
    (assert (regula G3 "a book."))
)

(defrule G4
    =>
    (assert (regula G4 "A book"))
)

Я ценю всю помощь и все ответы.

1 Ответ

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

Ваша формулировка проблемы не совсем соответствует коду, который вы сгенерировали («книга» не определяется правилом G2). Кроме того, вы можете использовать оператор deffacts вместо правил, которые безоговорочно утверждают факты.

Вот один из способов решения проблемы:

         CLIPS (6.31 6/12/19)
CLIPS> 
(deffacts regulas
   (regula G1 I read)
   (regula G2 I read.)
   (regula G3 a book.)
   (regula G4 A book))
CLIPS> 
(deftemplate translation
   (multislot text)
   (multislot tokens)
   (multislot output)
   (slot complete (default NO)))
CLIPS>       
(defrule get-input
   =>
   (printout t "Input: ")
   (bind ?text (readline))
   (assert (translation (text ?text)
                        (tokens (explode$ ?text)))))
CLIPS>                         
(defrule parse
   ?t <- (translation (tokens $?tokens $?rest)
                      (output $?output))
   (regula ?replacement $?tokens)
   =>
   (modify ?t (tokens $?rest)
              (output $?output ?replacement)))
CLIPS> 
(defrule success
   ?t <- (translation (tokens)
                      (complete NO))
   =>
   (modify ?t (complete YES)))
CLIPS>    
(defrule print-results
   (declare (salience -10))
   ?t <- (translation (complete ?complete)
                      (tokens $?tokens)
                      (output $?output))

   =>
   (printout t ?complete " " (implode$ (create$ ?output ?tokens)) crlf))
CLIPS> (reset)
CLIPS> (run)
Input: I read a book.
YES G1 G3
CLIPS> (reset)
CLIPS> (run)
Input: A book I read.
YES G4 G2
CLIPS> (reset)
CLIPS> (run)
Input: A book you read.
NO G4 you read.
CLIPS> (reset)
CLIPS> (run)
Input: You read a book.
NO You read a book.
CLIPS> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...