Распечатка КЛИПС Количество сработавших правил - PullRequest
0 голосов
/ 13 января 2019

У меня есть следующая конструкция CLIPS ниже, и мне интересно подсчитать, сколько раз срабатывало определенное правило, поэтому на выходе будет серия сработавших правил с последующим их количеством (см. Рисунок, например). CLIPS Output Таким образом, все эти правила будут следовать:

температура: (раз срабатывает) секунд
давление: (раз срабатывает) секунд

(deftemplate oil-measure
  (slot utc-time (type STRING))
  (slot temperature (type INTEGER))
  (slot pressure (type INTEGER)))

(defrule oil-is-hot
  (oil-measure (temperature ?temp) (utc-time ?time))
  (test (> ?temp 32))
  =>
  (printout t ?time tab "temperature:" tab ?temp crlf))

(defrule pressure-is-high
  (oil-measure (pressure ?press&:(> ?press 0)) (utc-time ?time))
  =>
  (printout t ?time tab "pressure:" tab ?press crlf))

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Код, включающий решение noxdafox:

(defglobal ?*hot-oil-times* = 0)
(defglobal ?*high-pressure-times* = 0)

(deftemplate oil-measure
  (slot utc-time (type STRING))
  (slot temperature (type INTEGER))
  (slot pressure (type INTEGER)))

(defrule oil-is-hot
  (oil-measure (temperature ?temp) (utc-time ?time))
  (test (> ?temp 32))
  => 
  (bind ?*hot-oil-times* (+ ?*hot-oil-times* 1))
  (printout t ?time tab "temperature:" tab ?*hot-oil-times* tab ?temp crlf))

(defrule pressure-is-high
  (oil-measure (pressure ?press&:(> ?press 0)) (utc-time ?time))
  =>
  (bind ?*high-pressure-times* (+ ?*high-pressure-times* 1))
  (printout t ?time tab "pressure:" tab ?*high-pressure-times* tab ?press crlf))
0 голосов
/ 14 января 2019

Вы можете хранить счетчики в глобальных переменных и соответственно увеличивать их.

(defglobal ?*hot-oil-times* = 0)

(defrule oil-is-hot
  (oil-measure (temperature ?temp) (utc-time ?time))
  (test (> ?temp 32))
  =>
  (bind ?*hot-oil-times* (+ ?*hot-oil-times* 1))
  (printout t ?time tab "temperature:" tab ?*hot-oil-times* tab ?temp crlf))
...