【问题标题】:Rules activates but not firing in JESS规则在 JESS 中激活但未触发
【发布时间】:2016-07-08 23:17:10
【问题描述】:

我是 JESS 的新手,对它的功能知之甚少。我有一个程序要求提供学生 ID 号,然后程序会运行并获取学生的科目。

问题是在程序结束时程序会询问用户他/她是否想获得另一个学生的科目。

如果用户想要输入另一个学生,它会返回到第一个触发的规则,但是当我尝试这样做时,规则只是激活并且没有触发。

可能是什么问题?我确保当然有(运行)。

这是我的代码。

(defrule check-subject
    ?a <- (phase check-back)
    ?stud <- (lookupID (id ?id))
    (student-information (id-number ?id)
                         (course ?course)
                         (subjects-taken $?taken)
                         (year ?year)
                         (semester ?sem))
    (prospectus-information (curriculum-name ?course) 
                            (1st-year-1st-sem-subjects $?subjects1))
    =>
     (printout t "Student took: " (intersection$ $?taken $?subjects1) crlf)
     (printout t "Student flunked: " (complement$ $?taken $?subjects1) crlf)
     (assert (back-subject (complement$ $?taken $?subjects1)))
     (retract ?a ?stud)
     (ask))

我有询问功能

(deffunction ask ()
  (printout t "Consult another? (y/n) ")
  (if (eq (read) y) 
  then (assert (phase choose-student))))

当阶段选择学生被断言时我的defrule

(defrule student-select
    (phase choose-student)
    =>
    (printout t "Input Student ID: ")
    (assert (lookupID (id (read)))))

student-select 规则激活但从不触发。我的程序停在那里。

【问题讨论】:

  • 问题是Jess代码有错误。这可以通过查看相关代码的人发现和修复。
  • 我已经编辑了我的帖子。请帮帮我。谢谢。
  • 如果有任何用处,请确保接受答案。不用写“谢谢”-cmets。

标签: shell expert-system jess


【解决方案1】:

最好将应用程序的控制部分与规则分开编写。

(deffunction ask ()
  (printout t "Consult another? (y/n) ")
  (if (eq (read) y) then
    (printout t "Input Student ID: ")
    (assert (lookupID (id (read))))
    (return TRUE)
  else
    (return FALSE)))

在while函数中使用这个:

(while (ask) do (run))

您将不再需要(phase choose-student)

【讨论】:

  • 我基于 jess 的示例程序中的代码 sticks.clp,而它会询问用户是否要重新启动。我的问题确实是我的规则只是激活而从不触发。它停在那里。
  • 我尝试使用您建议的代码,但是当我输入学生 ID 时,它不会让我检查它是否存在于我的数据库中,但您的代码启发了我。我在 ask-function 中放置了一个(run),然后触发了 student-select 规则。谢谢!
  • 它会“让你检查”,如果你会严格按照我的建议。我怀疑您没有在规则中省略 (phase check-back)
  • 我做了妈妈。我的 check-student-id 规则刚刚激活但没有触发。
  • 不太清楚你所说的“激活”是什么意思,但如果你在通常意义上使用它,即它准备好触发,因为(至少)有一组匹配的事实,那么只有调用 (run) 失败才会阻止它被解雇。
猜你喜欢
  • 2018-05-15
  • 2019-11-27
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多