【问题标题】:Defglobal variable not working in my defrule in JESSDefglobal 变量在 JESS 中的 defrule 中不起作用
【发布时间】:2016-03-20 22:13:17
【问题描述】:

我有以下缺陷。

(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))

在这个应用程序中,我向用户询问学生 ID,如果它确实存在于我的工作内存中,它会获取学生 ID 并将其信息绑定到全局变量中,例如 ?*id*?*course*、@ 987654324@。我有这条规则来检查学生不能选修哪些科目。

(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))))

但是,由于全局变量,此规则无法发挥作用。当我用这样的 BSCS 替换 ?*course* 时:

(prospectus-information (curriculum-name BSCS)

并像这样用 2014567 替换 ?*id*

?x <- (student-information (id-number 2014567)) 

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

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

【问题讨论】:

    标签: jess


    【解决方案1】:

    仔细阅读Jess手册得出这句话:*“如果你匹配到一个defglobal的模式像(foo ?x),那么匹配时只会考虑defglobal的值事实被断言。”*。这意味着您无法按照您计划的方式做您想做的事情。

    此类任务的常用范例或设计模式是使用 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程序是否可以“拥有可执行文件”的问题,答案是“不”。 (我当然假设你的意思是用 Jess 编写的程序是否可以像 C 程序一样编译和链接。)当然,你可以创建一个(相对简单的)Java 程序来执行 Jess 程序,你可以将所有内容包装到 .jar 中,这将生成一个可执行实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      相关资源
      最近更新 更多