【问题标题】:how to get the index of facts in RHS of rule?如何获得规则RHS中的事实索引?
【发布时间】:2015-11-13 18:15:52
【问题描述】:

我在问是否有可能在 defrule 的 RHS 中访问 get the index of fact ? 每次我尝试在 derule 的 RHS 中索引一个事实时,它都会给我带来不确定性。 因为我有一个while循环,我希望能够根据我的输入数据修改电梯事实。

(deftemplate elevator 
(slot goal))

(deffacts elevator
(elevator (goal 0))) 

(defrule read-data

=>
?f1 <- (elevator)
(modify ?f2 (goal 1))

)

这是我的代码示例,因为我不能全部在线:

(deftemplate data
(slot data)
)

(deffacts data
(data (data 1))
)

(defrule rule1
?f1 <-(data)
=>
(bind ?value (readline input) )
(while (neq ?value EOF) 
do
(bind ?data (fact-slot-value ?f1 data)) 
(printout t "data " ?data crlf )
(retract ?f1)
(modify ?f1 (data ?value))
(bind ?value (readline input) 
)

)
)

这是我的输入文件:

2
3
4
5
6
7

这就是我得到的:

CLIPS> (run)
data 1
data FALSE
data FALSE
data FALSE
data FALSE
data FALSE
CLIPS> 

我想打印出来 数据 2 数据 3 数据 4 ..ect

【问题讨论】:

    标签: clips


    【解决方案1】:

    您可以从规则的 RHS 中做到这一点,但是如果您的规则实际上没有 LHS 条件,那么使用规则来更改事实的值是没有意义的。只需使用一个函数。

    CLIPS> 
    (deftemplate elevator 
       (slot goal))
    CLIPS> 
    (deffacts elevator
       (elevator (goal 0))) 
    CLIPS> 
    (defrule read-data
       =>
       (do-for-fact ((?f elevator)) TRUE
          (modify ?f (goal 1))))
    CLIPS> (watch facts)
    CLIPS> (reset)
    <== f-0     (initial-fact)
    ==> f-0     (initial-fact)
    ==> f-1     (elevator (goal 0))
    CLIPS> (run)
    <== f-1     (elevator (goal 0))
    ==> f-2     (elevator (goal 1))
    CLIPS> 
    

    或者,您可以在规则的条件中绑定要修改的事实:

    CLIPS> (clear)
    CLIPS> 
    (deftemplate elevator 
       (slot goal))
    CLIPS> 
    (deffacts elevator
       (elevator (goal 0))) 
    CLIPS> 
    (defrule read-data
       ?f <- (elevator (goal 0))
       =>
       (modify ?f (goal 1)))
    CLIPS> (watch facts)
    CLIPS> (reset)
    <== f-0     (initial-fact)
    ==> f-0     (initial-fact)
    ==> f-1     (elevator (goal 0))
    CLIPS> (run)
    <== f-1     (elevator (goal 0))
    ==> f-2     (elevator (goal 1))
    CLIPS> 
    

    更新:

    您可以通过删除撤回并将 ?f1 重新绑定到 modify 返回的值来使您的原始规则“起作用”:

    CLIPS> (clear)
    CLIPS> 
    (deftemplate data
       (slot data))
    CLIPS> 
    (deffacts data
       (data (data 1)))
    CLIPS> 
    (defrule rule1
       ?f1 <- (data)
       =>
       (bind ?value (readline input))
       (while (neq ?value EOF) 
          (bind ?data (fact-slot-value ?f1 data)) 
          (printout t "data " ?data crlf )
          (bind ?f1 (modify ?f1 (data ?value)))
          (bind ?value (readline input))))
    CLIPS> (reset)
    CLIPS> (open input.txt input)
    TRUE
    CLIPS> (run)
    data 1
    data 2
    data 3
    data 4
    data 5
    data 6
    CLIPS> (close input)
    TRUE
    CLIPS>
    

    在 RHS 上多次修改同一个事实仍然非常复杂。

    【讨论】:

    • 谢谢,但我问的是如果我处于循环中怎么办..现在我正在编写代码,其中它是一个通过输入文件的 while 循环,并且取决于该输入文件事实上电梯会根据目标而变化。它仅适用于第一次迭代,但在其余迭代中不会改变
    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2015-10-21
    • 2019-06-14
    • 2016-03-24
    相关资源
    最近更新 更多