-1

I use the Jess Rule Engine in Protégé.

I need to create a test rule using classes, I defined in Jess code. Here are classes & instances definition code:

(clear)
(defclass Student
    (is-a :THING)
    (slot studId (type string))
    (slot studName (type string))
    (slot satGrade (type integer))
)
(defclass Course
    (is-a :THING)
    (slot courseId (type string))
    (slot courseName (type string))
    (slot passGrade (type integer))
)
(defclass StudentInCourse
    (is-a :THING)
    (slot studId (type string))
    (slot courseId (type string))
    (slot finalGrade (type integer))
)

(make-instance stud_01 of Student (studId "s123") (studName "Rob") (satGrade 650))
(make-instance stud_02 of Student (studId "s456") (studName "Pete") (satGrade 700))
(make-instance stud_03 of Student (studId "s789") (studName "Alex") (satGrade 770))
(mapclass Student)
(deffacts Student (Student (studId)(studName)(satGrade)))
(make-instance course_01 of Course (courseId "c123") (courseName "Calculus") (passGrade 60))
(make-instance course_02 of Course (courseId "c456") (courseName "Linear Algebra") (passGrade 70))
(mapclass Course)
(deffacts Course (Course (courseId)(courseName)(passGrade)))
(make-instance studInCourse_01 of StudentInCourse (studId "s123") (courseId "c123") (finalGrade 20))
(make-instance studInCourse_02 of StudentInCourse (studId "s123") (courseId "c456") (finalGrade 90))
(make-instance studInCourse_03 of StudentInCourse (studId "s456") (courseId "c123") (finalGrade 80))
(make-instance studInCourse_04 of StudentInCourse (studId "s789") (courseId "c456") (finalGrade 75))
(mapclass StudentInCourse)
(deffacts StudentInCourse (StudentInCourse (studId)(courseId)(finalGrade)))

Now I want to implement check who among the students passes course «Linear Algebra», I know how to implement it in SQL/Java/C#, but I can't understand how exactly write it in Jess, each string I push to Jess returns with parsing/compilation error.

How exactly implement kind of join in Jess or pass over the collection, get courseID, compare the values according to ID and passGrade/finalGrade, for correct values retrieve the data from the student class and as result return something like: «Pete passed course Linear Algebra with grade 80»?

4

1 回答 1

1

自从我接触 Protege 以来已经有好几年了,但根据你上面的内容,我假设你有这样的事实(以及其他事实)。在这一点上,您上面的“缺陷”必须是概念性的——它们不会做任何好事(甚至可能不会解析)。

(Student (studId "s123")(studName "Rob")(satGrade 650))
(StudentInCourse (studId "s123") (courseId "c456") (finalGrade 90))
(Course (courseId "c456") (courseName "Linear Algebra") (passGrade 70))

鉴于我对上述内容是正确的,那么报告每个通过任何课程的学生的规则可能看起来像

(defrule passed-algebra
    (Course (courseName ?cn) (courseId ?cid) (passGrade ?pg))
    (StudentInCourse (courseId ?cid) (studId ?sid) (finalGrade ?fg&:(>= ?fg ?pg))
    (Student (studName ?name) (studId ?sid))
    =>
    (printout t ?name " passed course " ?cn " with a grade of " ?fg crlf))
于 2013-12-08T17:52:08.703 回答