【问题标题】:CLIPS infinite facts剪辑无限的事实
【发布时间】:2013-03-31 02:47:33
【问题描述】:

我正在开发一个专家系统,它将使用 PyClips 做出录取决定。但是,代码不断产生“内存不足”错误。我想我已经孤立了我的问题。我的 CLIPS 文件有问题。希望有人能看到我在这里做错了什么。这是代码的最简单版本....为了调试它,我进行了简化:所以这是我的模板,为了论证,只有一条规则:如果收到成绩单,则 app-complete属性被标记为 TRUE。

; template for application facts
(deftemplate application "structure of an application"
(slot app-id (type INTEGER))
(slot app-complete (type SYMBOL))
(slot transcript-received (type SYMBOL))
 )


(defrule complete "rule for app completeness"

?f <- (application
        (transcript-received Yes)    
    )
=>
    (modify ?f
        (app-complete TRUE)
    )
)
; end.

所以当我这样做时(assert (application (app-id 123) (transcript-received Yes))) 然后,我其实是加了。 但是,当我单击运行时.... CLIPS 中的窗口开始因数千个事实而超载... app-complete 属性看起来被标记为 TRUE,但是,事实只是不停地循环和循环。当事实太多时,我说的是100K之类的……然后CLIPS就退出了……知道我在这里做错了什么吗?我的语法以某种方式搞砸了?我的意图是让一个 sqlite 数据库能够从数据库中读取“事实”,以便系统能够做出决定......但我无法超越这个!

【问题讨论】:

    标签: clips expert-system pyclips knowledge-capture


    【解决方案1】:

    要记住的重要一点是,当您修改 deftemplate 事实时,该事实将被撤回并断言一个新的(修改后的)事实。您的规则也匹配修改后的事实,然后再次修改和匹配等,从而导致无限循环。如果您在运行代码时观察事实和激活,您会看到如下内容:

    <== f-1     (application (app-id 123) (app-complete nil) (transcript-received Yes))
    ==> f-2     (application (app-id 123) (app-complete TRUE) (transcript-received Yes))
    ==> Activation 0      complete: f-2
    <== f-2     (application (app-id 123) (app-complete TRUE) (transcript-received Yes))
    ==> f-3     (application (app-id 123) (app-complete TRUE) (transcript-received Yes))
    ==> Activation 0      complete: f-3
    <== f-3     (application (app-id 123) (app-complete TRUE) (transcript-received Yes))
    ==> f-4     (application (app-id 123) (app-complete TRUE) (transcript-received Yes))
    ==> Activation 0      complete: f-4
    (etc.)
    

    您可以通过仅匹配尚未完成的应用程序来防止这种情况。这是您的代码的修改版本,它将默认的 FALSE 值添加到 app-complete 插槽,并且仅匹配未完成的应用程序:

    (deftemplate application "structure of an application"
      (slot app-id (type INTEGER))
      (slot app-complete (type SYMBOL) (default FALSE))
      (slot transcript-received (type SYMBOL)))
    
    (defrule complete "rule for app completeness"
      ?f <- (application (transcript-received Yes) (app-complete FALSE))
      =>
      (modify ?f (app-complete TRUE)))
    

    现在,如果您观察事实和激活,当您断言事实并运行时,您应该会看到以下内容:

    CLIPS> (assert (application (app-id 123) (transcript-received Yes)))
    ==> f-0     (application (app-id 123) (app-complete FALSE) (transcript-received Yes))
    ==> Activation 0      complete: f-0
    <Fact-0>
    CLIPS> (run)
    <== f-0     (application (app-id 123) (app-complete FALSE) (transcript-received Yes))
    ==> f-1     (application (app-id 123) (app-complete TRUE) (transcript-received Yes))
    CLIPS>
    

    【讨论】:

    • 对这个有什么想法吗? stackoverflow.com/questions/15963202/…
    • 看起来和这个问题有点相关。如果我对这个问题的回答是可以接受的,那么请点击接受链接,这样我就知道它是正确的,任何与您的问题相关的搜索都会知道这是一个可以接受的解决方案。然后我们可以继续讨论相关问题。
    • 谢谢@bogatron。我本来打算这样做的。也感谢您帮助我解决另一个问题!
    • 嘿...@bogatron...你是我认识的唯一 CLIPS 人...你知道为什么逻辑 OR 在这里不起作用吗?...stackoverflow.com/questions/16223702/…
    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多