如何获取规则 RHS 中的事实索引?

how to get the index of facts in RHS of rule?

我想问是否有可能访问 defrule 的 RHS 中的事实索引? 每次我尝试在 defrule 的 RHS 中索引一个事实时,它都会给我 undefined 。 因为我有一个 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

您可以从规则的 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 重新绑定到修改返回的值来使原始规则 "work":

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 上多次修改同一个事实仍然很复杂。