在JESS

时间:2016-03-18 14:57:04

标签: jess

我有以下瑕疵。

(deffacts students
    (student-information
        (id-number 2014567)
        (course BSCS)
        (year 2)
        (semester 2)
        (subjects-taken CS111 Math103 Math101 Engl111n PE101)))

(deffacts curriculum
    (prospectus-information 
        (curriculum-name BSCS)
        (1st-year-1st-sem-subjects CS111 Bio101 Math103 Math101 Engl111n PE101))

在这个应用程序中,我向用户询问student-id,如果它存在于我的工作记忆中,它会获取student-id并将其信息绑定在全局变量中,例如?*id*,{{1 },?*course*。我有这个规则来检查学生不能参加哪些科目。

?*year*

但是,由于全局变量,此规则无法正常工作。当我用BSCS替换(defrule check-back-subject (phase check-back) (prospectus-information (curriculum-name ?*course*) (1st-year-1st-sem-subjects $?subjec)) ?x <- (student-information (id-number ?*id*)) => (bind ?subject ?subjec) (foreach ?subj ?subject (if (member$ ?subj ?x.subjects-taken) then (printout t "Student took: " ?subj crlf) else (assert (back-subject ?subj)) (printout t "Student did not take: " ?subj crlf)))) 时:

?*course*

并将(prospectus-information (curriculum-name BSCS) 替换为2014567,就像这样

?*id*

该规则完成了它的工作,它完美地输出了学生-2014567无法接受的科目。但是这种规则效率不高,如果我有10名学生,那么这就意味着我会为每个学生制定10条规则。为什么代码不适用于我的defglobal变量?我还确保defglobal-reset是错误的。

最后,纯粹在JESS编写的程序可以有一个可执行文件吗?谢谢。

1 个答案:

答案 0 :(得分:1)

仔细阅读Jess手册到达这句话:*&#34;如果你匹配一个类似(foo? x )模式的defglobal,那么匹配只会考虑当事实被断言时,defglobal。&#34; *。这意味着你不能按照计划的方式做你想做的事。

此类任务的通常范例或设计模式是使用lookup,这是一个包含输入数据(您的学生ID)的事实,然后与驻留在工作记忆中的事实相匹配。

(deftemplate lookupId (slot id))

您可以找到student-information

(defrule locate-student
   (lookupId (id ?id))
   (student-information (id ?id))
=>
(printout t "Found student" crlf))

您可以将其与课程数据结合起来:

(defrule locate-student
   (lookupId (id ?id))
   (student-information (id ?id)
                        (course ?course)
                        (subjects-taken $?taken))
   (prospectus-information (curriculum-name ?course)
                           (1st-year-1st-sem-subjects $?subjects))
=>
   (printout t "Student took: " (intersection$ $?taken $?subjects) crlf)
   (printout t "Student flunked: " (complement$ $?taken $?subjects) crlf))

关于Jess程序是否可以&#34;有可执行文件&#34;的问题,答案是&#34; no&#34;。 (我当然假设您的意思是说Jess中的程序是否可以像C程序一样编译和链接。)当然,您可以创建一个(相对简单的)Java程序来执行Jess程序,并且你可以将all包装成一个.jar,这将产生一个可执行的实体。