使用 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 事实的 p1 和 p2 槽,其中引用 ?o:p1 和 ?o:p2,但这些插槽不存在。也许您想要 productid 和 quantity 插槽。您还可以使用 readline 函数来获取输入。这将 return 一个字符串,但您的事实槽包含符号和整数,而不是字符串,因此使用 eq 函数对这些值进行的任何比较都将失败,因为类型不是相同的。您应该改用 read 函数。
我是剪辑规则引擎的新手,必须在移动应用程序的剪辑中执行以下操作。 如果一个人购买了 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 事实的 p1 和 p2 槽,其中引用 ?o:p1 和 ?o:p2,但这些插槽不存在。也许您想要 productid 和 quantity 插槽。您还可以使用 readline 函数来获取输入。这将 return 一个字符串,但您的事实槽包含符号和整数,而不是字符串,因此使用 eq 函数对这些值进行的任何比较都将失败,因为类型不是相同的。您应该改用 read 函数。