Правило стрельбы в клипах не работает должным образом - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в клипах и пытаюсь написать правила для срабатывания набора правил. условие для правила:

Рассчитайте скидку для продуктов из продуктов 1, 2, 3 как 10, только если продукт 1 присутствует (обязательно). и общее количество продуктов больше или равно 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.

Предлагаю.

1 Ответ

0 голосов
/ 22 июня 2020
         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> 
...