【问题标题】:Firing rule in Clips not working properlyClips 中的触发规则无法正常工作
【发布时间】:2020-06-18 04:41:27
【问题描述】:

我是新的 ti 剪辑,正在尝试编写触发一组规则的规则。 规则的条件是

仅当产品 1 存在时,才计算产品 1、产品 2、产品 3 的产品折扣为 10(强制)。并且产品总数大于等于6个。

(deftemplate Product
   (slot productNumber)
   (slot quantity))

(defrule sum_of_quantity
   (exists (Product (productNumber 1 | 2 | 3)(quantity ?q&:(> ?q 1))))
   =>
   (bind ?totalQuantity 0)
   (do-for-all-facts ((?p Product))
                     (or (eq ?p:productNumber 1)
                         (eq ?p:productNumber 2)
                         (eq ?p:productNumber 3))
      (bind ?totalQuantity (+ ?totalQuantity ?p:quantity)))
   (if (>= ?totalQuantity 6) then
      (printout t "TotalQuantity is " ?totalQuantity "and discoun is 10" crlf)))

(deffacts input1 
   (Product (productNumber 2)(quantity 3))
   (Product (productNumber 3)(quantity 3)))

如图所示输入了事实,即使没有强制性产品,结果也会计算并显示为 10。

建议。

【问题讨论】:

  • 这个程序的输出是“TotalQuantity is 6and discoun is 10”。显示的 6 是正确计算的 ?totalQuantity 值。显示的 10 不是计算值;这些字符包含在传递给打印输出命令的字符串中。
  • 是的。折扣是一个常数值 10。但产品 1 是强制性产品。因此,即使没有产品 1,也会为其他产品计算总量。如果事实中只有产品 1 可用,我该如何制定触发规则?
  • 在规则条件中使用 (productNumber 1) 而不是 (productNumber 1 | 2 | 3)。
  • @GaryRiley :如果您能提供规则的 LHS 可以吗?当我尝试使用(productNumber 1)(productNumber 2 | 3)时。当产品编号为 1 的单个产品时,该规则不会被触发。当产品 1 的事实中存在单个产品时,不计算总数量。当存在 1、2、3、1、2 时,该规则应该起作用或 1,3 存在,以及仅存在产品 1 时。请提出建议。

标签: rules rule-engine clip clips


【解决方案1】:
         CLIPS (6.31 6/12/19)
CLIPS> 
(deftemplate Product
   (slot productNumber)
   (slot quantity))
CLIPS> 
(defrule sum_of_quantity
   (exists (Product (productNumber 1) (quantity ?q&:(> ?q 1))))
   =>
   (bind ?totalQuantity 0)
   (do-for-all-facts ((?p Product))
                     (or (eq ?p:productNumber 1)
                         (eq ?p:productNumber 2)
                         (eq ?p:productNumber 3))
      (bind ?totalQuantity (+ ?totalQuantity ?p:quantity)))
   (if (>= ?totalQuantity 6) then
      (printout t "TotalQuantity is " ?totalQuantity " and discount is 10" crlf)))
CLIPS> (assert (Product (productNumber 1) (quantity 6)))
<Fact-1>
CLIPS> (run)
TotalQuantity is 6 and discount is 10
CLIPS> (reset)
CLIPS> (assert (Product (productNumber 1) (quantity 3)))
<Fact-1>
CLIPS> (assert (Product (productNumber 2) (quantity 2)))
<Fact-2>
CLIPS> (assert (Product (productNumber 3) (quantity 4)))
<Fact-3>
CLIPS> (run)
TotalQuantity is 9 and discount is 10
CLIPS> (reset)
CLIPS> (assert (Product (productNumber 2) (quantity 2)))
<Fact-1>
CLIPS> (assert (Product (productNumber 3) (quantity 4)))
<Fact-2>
CLIPS> (run)
CLIPS> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多