我有以下瑕疵。
(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编写的程序可以有一个可执行文件吗?谢谢。
答案 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,这将产生一个可执行的实体。