Что плохого в моем коде CLIPS — or / и variable или else — если он грамматический?

#artificial-intelligence #clips

#искусственный интеллект #клипы

Вопрос:

Это мой код CLIPS, который я собираюсь соединить с кодом Java. Когда я пытаюсь загрузить файл в WinCLIPS, он записывается как FALSE.

Я думаю, что проблема может быть в синтаксисе or / и или if-else.

 (deftemplate diagnoza
(slot wiek)
(slot klasa)
)

(deftemplate result
(slot value)
)

(defrule wiek-klasa-rule 
 (diagnoza (wiek ?w))
 (diagnoza (klasa ?g))
 =>
(if (and (< ?w 19)(> ?g 4))) 
    then
    (bind ?x "Wiek szkolny - ok.")
    (printout t ?x crlf)
    (assert (result (value ?x)))

(if (< ?w 4)) 
    then
    (bind ?x "Wiek poniżej 4 lat. Nie można zdiagnozować.")
    (printout t ?x crlf)
    (assert (result (value ?x)))

(if (> ?w 19)) 
    then
    (bind ?x "Wiek powyżej 19 lat. Nie można zdiagnozować.")
    (printout t ?x crlf)
    (assert (result (value ?x)))

else 
    (bind ?w "Nieprawidłowa wartość wieku. Nie można zdiagnozować.")
    (printout t ?x crlf) 
    (assert (result (value ?x)))
)
)
 

Ответ №1:

Ваши круглые скобки несбалансированы. Если вы сделаете отступ в своем коде, чтобы отразить глубину вложенности, вы сможете увидеть, где вы допустили ошибки:

 (defrule wiek-klasa-rule 
   (diagnoza (wiek ?w))
   (diagnoza (klasa ?g))
 =>
   (if (and (< ?w 19)
            (> ?g 4)
       )
   ) 
   then
   (bind ?x "Wiek szkolny - ok.")
   (printout t ?x crlf)
   (assert (result (value ?x)
           )
   )
   (if (< ?w 4)
   ) 
   then
   (bind ?x "Wiek poniżej 4 lat. Nie można zdiagnozować.")
   (printout t ?x crlf)
   (assert (result (value ?x)
           )
   )
   (if (> ?w 19)
   ) 
   then
   (bind ?x "Wiek powyżej 19 lat. Nie można zdiagnozować.")
   (printout t ?x crlf)
   (assert (result (value ?x)))
   else 
   (bind ?w "Nieprawidłowa wartość wieku. Nie można zdiagnozować.")
   (printout t ?x crlf) 
   (assert (result (value ?x)))
)