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

时间:2015-11-13 18:15:52

标签: clips

我问是否有可能在RHS的rHS中获取事实索引? 每次我尝试索引RHS中的事实时,它都会给我一个未定义的。 因为我有一个while循环,我希望能够根据我的输入数据修改电梯事实。

$skupu = array('a1','a5');
$skupuImploded = implode(',', $skupu);

$consult_sku= "SELECT * FROM fulfillment_test WHERE sku IN ($skupuImploded)";
$result_s= mysqli_query($db, $consult_sku);

这是我的代码的一个例子,因为我不能把所有在线:

(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

我希望它打印出来 数据2 数据3 数据4 .. ..

1 个答案:

答案 0 :(得分:0)

你可以从规则的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> 

更新:

您可以将原始规则设置为&#34; work&#34;通过删除retract并将?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上多次修改相同的事实仍然很可疑。