使用 CLIPS 规则引擎计算折扣时出错

Error while calculating discount using CLIPS rule engine

我是剪辑规则引擎的新手,必须在移动应用程序的剪辑中执行以下操作。 如果一个人购买了 x 件产品 A 给他 y 折扣。

以下是我编写的代码,首先检查我的 productid 是否在订单中。

(deftemplate Producttemp
(slot productid (type INTEGER))
(slot umid)
(slot quantity (type INTEGER))
)

(deffacts orders
(Producttemp (productid 123) (umid CG) (quantity 4))
(Producttemp (productid 456) (umid CG) (quantity 2))
)



(defrule checkorder
=>
 (printout t "Enter the productid: ")
  (bind ?p1 (readline))
   (printout t "Enter another quantity: ")
   (bind ?p2 (readline))

   (do-for-all-facts ((?o Producttemp)) 
       (and (eq ?p1 ?o:p1)
            (eq ?p2 ?o:p2))
       (printout t ?p1 " is a " ?o: productid" in order " ?p2 crlf)))
)

我遇到以下错误。

Defining defrule: checkorder 
[PRCCODE3] Undefined variable o: referenced in RHS of defrule.

在最后一个打印输出语句中 ?o:product 之间有一个 space。规则末尾还有一个无关的右括号。此规则将在没有任何语法错误的情况下加载:

(defrule checkorder
   =>
   (printout t "Enter the productid: ")
   (bind ?p1 (readline))
   (printout t "Enter another quantity: ")
   (bind ?p2 (readline))

   (do-for-all-facts ((?o Producttemp)) 
       (and (eq ?p1 ?o:p1)
            (eq ?p2 ?o:p2))
       (printout t ?p1 " is a " ?o:productid" in order " ?p2 crlf))
)

您的规则还有另外两个问题。在事实查询中,您引用了 Producttemp 事实的 p1p2 槽,其中引用 ?o:p1?o:p2,但这些插槽不存在。也许您想要 productidquantity 插槽。您还可以使用 readline 函数来获取输入。这将 return 一个字符串,但您的事实槽包含符号和整数,而不是字符串,因此使用 eq 函数对这些值进行的任何比较都将失败,因为类型不是相同的。您应该改用 read 函数。