Как я могу найти идентификатор переменной, которая имеет максимальное значение в CLIPS? - PullRequest
0 голосов
/ 02 июня 2018

Я пытался найти лучшего ученика по оценкам на экзамене.Я взял их у пользователя.Я хочу, чтобы КЛИПС дал мне удостоверение личности лучшего ученика.Например, студент 1 балл 70, студент 2 балл 80 и студент 3 балл 100. Клипы должны сказать мне: «Лучший студент ... потому что его / ее цель ...» Я использовал глобальные переменные, но я не уверен, что этоправда, потому что это не работает.

(defglobal ?*student1mark* = 0)
(defglobal ?*student2mark* = 0)
(defglobal ?*student3mark* = 0)

(defrule get-marks
=>
(printout t "What is the exam mark of student1?" crlf)
(bind ?*student1mark* (read))
(assert (stu1mark ?*student1mark*))
(printout t "What is the exam mark of student2?" crlf)
(bind ?*student2mark* (read))
(assert (stu2mark ?*student2mark*))
(printout t "What is the exam mark of student3?" crlf)
(bind ?*student3mark* (read))
(assert (stu3mark ?*student3mark*))
(build (str-cat
        "(deffacts students (student student1 " ?*student1mark* " student student2 " ?*student2mark* " student student3 " ?*student3mark* "))")))

(defrule whichstudent
(student ?ID = (max ?*student1mark*" ?*student2mark*" ?*student3mark*))
=>
(printout t "The best student is " ?ID crlf))

1 Ответ

0 голосов
/ 02 июня 2018

Я бы не использовал глобальные переменные.Я бы пошел с шаблоном и фактами.Одним из решений с помощью правила будет следующее:

         CLIPS (6.30 3/17/15)
CLIPS> (deftemplate student
    (slot id (type INTEGER) (default ?NONE))
    (slot mark (type INTEGER) (default ?NONE))
)
CLIPS> (deffacts students
    (student (id 1) (mark 80))
    (student (id 2) (mark 79))
    (student (id 4) (mark 60))
    (student (id 3) (mark 90))
)
CLIPS> (defrule best-mark
    (compare-students)
    (student (id ?id) (mark ?mark))
    (not 
        (student (id ?) (mark ?nmark&:(> ?nmark ?mark)))
    )
=>
    (printout t "The best student is student no. " ?id crlf)
)
CLIPS> (reset)
CLIPS> (assert (compare-students))
<Fact-5>
CLIPS> (run)
The best student is student no. 3

Ключевая часть:

    (student (id ?id) (mark ?mark))
    (not 
        (student (id ?) (mark ?nmark&:(> ?nmark ?mark)))
    )

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

...