Сравните одно значение с другим, чтобы проверить, существует ли файл в CLIPS - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь заставить пользователя ввести название книги, а затем проверить, существует ли книга в библиотеке.Если нет, программа должна попросить его ввести данные книги.Но программа видит все входные данные как новую книгу.Я сравниваю два значения неправильно или моя readline?

Код до сих пор:

(deftemplate book (slot name) (slot author) (slot code))

(deffacts current-lib
  (book (name "Alice in Wonderland") (author Lewis-Carroll) (code CAR))
  (book (name "The Bourne Supremacy") (author Robert-Ludlum) (code LUD)))

(defrule readnew "inputs potential new book details"
=>


(printout t "Enter the name of the book:")
  (bind ?b_name (readline))
  (assert (potential ?b_name)))

(defrule add-book "determine if book already exists otherwise add"
  ?out <- (potential ?newname)
  (and (potential ?newname)
       (not (book (name ?b_name&?newname) (author $?))))
=>
  (printout t "Book is new, please enter the author's name:" crlf)
  (bind ?auth (readline))
  (printout t "Please enter a three letter code for the book:" crlf)
  (bind ?coode (read))
  (assert (book (name ?newname) (author ?auth) (code ?coode)))
  (retract ?out))

1 Ответ

0 голосов
/ 05 марта 2019

Вы предоставили код, но не шаги, которые вы предприняли для его запуска, поэтому мне придется угадывать причину вашей проблемы.Простейшим объяснением было бы то, что вы не ввели команду reset для подтверждения фактов в ваших current-lib недостатках.

Я внес несколько изменений в ваш код,В ваших current-lib ошибках имена авторов должны быть строками, так как вы используете readline в вашем add-book правиле для получения имен.В условиях вашего правила add-book также есть ненужный код.

         CLIPS (6.31 2/3/18)
CLIPS> 
(deftemplate book 
   (slot name)
   (slot author) (slot code))
CLIPS> 
(deffacts current-lib
   (book (name "Alice in Wonderland") (author "Lewis Carroll") (code CAR))
   (book (name "The Bourne Supremacy") (author "Robert Ludlum") (code LUD)))
CLIPS> 
(defrule readnew
   =>
   (printout t "Enter the name of the book:" crlf)
   (bind ?b_name (readline))
   (assert (potential ?b_name)))
CLIPS> 
(defrule add-book
  ?out <- (potential ?newname)
  (not (book (name ?newname)))
  =>
  (printout t "Book is new, please enter the author's name:" crlf)
  (bind ?auth (readline))
  (printout t "Please enter a three letter code for the book:" crlf)
  (bind ?coode (read))
  (assert (book (name ?newname) (author ?auth) (code ?coode)))
  (retract ?out))
CLIPS>

Теперь, если вы добавите несуществующую книгу, вас попросят ввести дополнительнуюинформация.

CLIPS> (reset)
CLIPS> (run)
Enter the name of the book:
Ringworld
Book is new, please enter the author's name:
Larry Niven
Please enter a three letter code for the book:
RNG
CLIPS> 

Если вы попытаетесь добавить несуществующую книгу, правило add-book не будет выполнено.

CLIPS> (reset)
CLIPS> (run)
Enter the name of the book:
Alice in Wonderland
CLIPS>
...