⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitor.clp

📁 一套美国国家宇航局人工智能中心NASA的专家系统工具源代码
💻 CLP
字号:

;;;======================================================
;;;   Monitoring Program
;;;
;;;     This program was introduced in Section 12.5.
;;;
;;;     CLIPS Version 6.0 Example
;;;
;;;     To execute, merely load, reset and run.
;;;======================================================

(defmodule MAIN (export ?ALL))

(deftemplate MAIN::device 
   (slot name (type SYMBOL))
   (slot status (allowed-values on off)))
  
(deffacts MAIN::device-information
  (device (name D1) (status on))
  (device (name D2) (status on))
  (device (name D3) (status on))
  (device (name D4) (status on)))

(deftemplate MAIN::sensor 
   (slot name (type SYMBOL)) 
   (slot device (type SYMBOL))
   (slot raw-value (type SYMBOL NUMBER)
                    (allowed-symbols none)
                    (default none))
   (slot state (allowed-values low-red-line 
                               low-guard-line
                               normal
                               high-red-line
                               high-guard-line)
                (default normal))
   (slot low-red-line (type NUMBER))
   (slot low-guard-line (type NUMBER))
   (slot high-guard-line (type NUMBER))
   (slot high-red-line (type NUMBER)))

(deffacts MAIN::sensor-information
  (sensor (name S1) (device D1)
          (low-red-line 60) (low-guard-line 70)
          (high-guard-line 120) (high-red-line 130))
  (sensor (name S2) (device D1)
          (low-red-line 20) (low-guard-line 40)
          (high-guard-line 160) (high-red-line 180))
  (sensor (name S3) (device D2)
          (low-red-line 60) (low-guard-line 70)
          (high-guard-line 120) (high-red-line 130))
  (sensor (name S4) (device D3)
          (low-red-line 60) (low-guard-line 70)
          (high-guard-line 120) (high-red-line 130))
  (sensor (name S5) (device D4)
          (low-red-line 65) (low-guard-line 70)
          (high-guard-line 120) (high-red-line 125))
  (sensor (name S6) (device D4)
          (low-red-line 110) (low-guard-line 115)
          (high-guard-line 125) (high-red-line 130)))

(deffacts MAIN::cycle-start
  (data-source user)
  (cycle 0))

(defrule MAIN::Begin-Next-Cycle
   ?f <- (cycle ?current-cycle)
   =>
   (retract ?f)
   (assert (cycle (+ ?current-cycle 1)))
   (focus INPUT TRENDS WARNINGS))

(defmodule INPUT (import MAIN ?ALL))

(defrule INPUT::Read-Sensor-Values-From-Sensors
  (data-source sensors)
  ?s <- (sensor (name ?name)
                (raw-value none)
                (device ?device))
  (device (name ?device) (status on))
  =>
  ;(modify ?s (raw-value (get-sensor-value ?name)))
  )

(defrule INPUT::Get-Sensor-Value-From-User
  (data-source user)
  ?s <- (sensor (name ?name) 
                (raw-value none) 
                (device ?device))
  (device (name ?device) (status on))
  =>
  (printout t "Input value for sensor " ?name ": ")
  (bind ?raw-value (read))
  (if (not (numberp ?raw-value))
      then (halt)
      else (modify ?s (raw-value ?raw-value))))

(deftemplate INPUT::fact-data-for-sensor 
   (slot name)
   (multislot data))

(deffacts INPUT::sensor-fact-data-values 
  (fact-data-for-sensor (name S1)
     (data 100 100 110 110 115 120))
  (fact-data-for-sensor (name S2)
     (data 110 120 125 130 130 135))
  (fact-data-for-sensor (name S3)
     (data 100 120 125 130 130 125))
  (fact-data-for-sensor (name S4)
     (data 120 120 120 125 130 135))
  (fact-data-for-sensor (name S5)
     (data 110 120 125 130 135 135))
  (fact-data-for-sensor (name S6)
     (data 115 120 125 135 130 135)))

(defrule INPUT::Read-Sensor-Values-From-Facts 
  (data-source facts)
  ?s <- (sensor (name ?name) 
                (raw-value none))
  ?f <- (fact-data-for-sensor 
                (name ?name) 
                (data ?raw-value $?rest))
  =>
  (modify ?s (raw-value ?raw-value))
  (modify ?f (data ?rest)))

(defrule INPUT::No-Fact-Data-Values-Left
  (data-source facts)
  (sensor (name ?name) 
          (raw-value none))
  (fact-data-for-sensor (name ?name) (data))
  =>
  (printout t "No fact data for sensor " ?name crlf)
  (printout t "Halting monitoring system" crlf)
  (halt))

(defrule INPUT::Open-File-With-Sensor-Values
  (data-source file)
  (not (data-file-open))
  =>
  (bind ?flag file-closed)
  (while (eq ?flag file-closed)
    (printout t "What is the name of the data file? ")
    (bind ?file-name (readline))
    (if (open ?file-name data-file "r") 
       then (bind ?flag true)))
  (assert (data-file-open)))

(defrule INPUT::Read-Sensor-Values-From-File
  (data-source file)
  (data-file-open)
  (cycle ?time)
  =>
  (bind ?name (read data-file))
  (if (eq ?name EOF) then (halt))
  (while (and (neq ?name end-of-cycle)
              (neq ?name EOF))
     (bind ?raw-value (read data-file))
     (if (eq ?raw-value EOF) then (halt))
     (assert (raw-sensor-value ?name ?raw-value))
     (bind ?name (read data-file))
     (if (eq ?name EOF) then (halt))))

(defrule INPUT::Remove-Values-For-Inactive-Sensors
  (data-source file)
  (data-file-open)
  (cycle ?time)
  (sensor (name ?name) (device ?device))
  (device (name ?device) (status off))
  ?data <- (raw-sensor-value ?name ?raw-value)
  =>
  (retract ?data))

(defrule INPUT::Transfer-Sensor-Values-To-Sensors 
  (data-source file)
  ?s <- (sensor (name ?name) 
                (raw-value none)
                (device ?device))
  (device (name ?device) (status on))
  ?f <- (raw-sensor-value ?name ?raw-value)
  =>
  (modify ?s (raw-value ?raw-value))
  (retract ?f))

(defmodule TRENDS (import MAIN ?ALL))

(defrule TRENDS::Normal-State
  ?s <- (sensor (raw-value ?raw-value&~none)
                (low-guard-line ?lgl)
                (high-guard-line ?hgl))
  (test (and (> ?raw-value ?lgl) (< ?raw-value ?hgl)))
  =>
  (modify ?s (state normal) (raw-value none)))

(defrule TRENDS::High-Guard-Line-State
  ?s <- (sensor (raw-value ?raw-value&~none)
                (high-guard-line ?hgl)
                (high-red-line ?hrl))
  (test (and (>= ?raw-value ?hgl) (< ?raw-value ?hrl)))
  =>
  (modify ?s (state high-guard-line) (raw-value none)))
  
(defrule TRENDS::High-Red-Line-State
  ?s <- (sensor (raw-value ?raw-value&~none)
                (high-red-line ?hrl))
  (test (>= ?raw-value ?hrl))
  =>
  (modify ?s (state high-red-line) (raw-value none)))

(defrule TRENDS::Low-Guard-Line-State
  ?s <- (sensor (raw-value ?raw-value&~none)
                (low-guard-line ?lgl)
                (low-red-line ?lrl))
  (test (and (> ?raw-value ?lrl) (<= ?raw-value ?lgl)))
  =>
  (modify ?s (state low-guard-line) (raw-value none)))

(defrule TRENDS::Low-Red-Line-State
  ?s <- (sensor (raw-value ?raw-value&~none)
                (low-red-line ?lrl))
  (test (<= ?raw-value ?lrl))
  =>
  (modify ?s (state low-red-line) (raw-value none)))

(deftemplate MAIN::sensor-trend
   (slot name) 
   (slot state (default normal))
   (slot start (default 0)) 
   (slot end (default 0))
   (slot shutdown-duration (default 3)))

(deffacts MAIN::start-trends
  (sensor-trend (name S1) (shutdown-duration 3))
  (sensor-trend (name S2) (shutdown-duration 5))
  (sensor-trend (name S3) (shutdown-duration 4))
  (sensor-trend (name S4) (shutdown-duration 4))
  (sensor-trend (name S5) (shutdown-duration 4))
  (sensor-trend (name S6) (shutdown-duration 2)))

(defrule TRENDS::State-Has-Not-Changed
  (cycle ?time)
  ?trend <- (sensor-trend (name ?sensor) 
                          (state ?state)
                          (end ?end-cycle&~?time)) 
  (sensor (name ?sensor) (state ?state)
          (raw-value none))
  =>
  (modify ?trend (end ?time)))

(defrule TRENDS::State-Has-Changed
  (cycle ?time)
  ?trend <- (sensor-trend (name ?sensor) 
                          (state ?state)
                          (end ?end-cycle&~?time))
  (sensor (name ?sensor) 
          (state ?new-state&~?state)
          (raw-value none))
  =>
  (modify ?trend (start ?time) 
                 (end ?time) 
                 (state ?new-state)))

(defmodule WARNINGS (import MAIN ?ALL))

(defrule WARNINGS::Shutdown-In-Red-Region
  (cycle ?time)
  (sensor-trend 
     (name ?sensor) 
     (state ?state&high-red-line | low-red-line))
  (sensor (name ?sensor) (device ?device))
  ?on <- (device (name ?device) (status on))
  =>
  (printout t "Cycle " ?time " - ")
  (printout t "Sensor " ?sensor " in " ?state crlf)
  (printout t "   Shutting down device " ?device
              crlf)
  (modify ?on (status off)))
  
(defrule WARNINGS::Shutdown-In-Guard-Region
  (cycle ?time)
  (sensor-trend 
      (name ?sensor)
      (state ?state&high-guard-line | low-guard-line) 
      (shutdown-duration ?length)
      (start ?start) (end ?end))
  (test (>= (+ (- ?end ?start) 1)  ?length))
  (sensor (name ?sensor) (device ?device))
  ?on <- (device (name ?device) (status on))
  =>
  (printout t "Cycle " ?time " - ")
  (printout t "Sensor " ?sensor " in " ?state " ")
  (printout t "for " ?length " cycles "
              crlf) 
  (printout t "   Shutting down device " ?device
              crlf)
  (modify ?on (status off)))

(defrule WARNINGS::Sensor-In-Guard-Region
  (cycle ?time)
  (sensor-trend 
      (name ?sensor) 
      (state ?state&high-guard-line | low-guard-line)
      (shutdown-duration ?length)
      (start ?start) (end ?end))
  (test (< (+ (- ?end ?start) 1) ?length))
  =>
  (printout t "Cycle " ?time " - ")
  (printout t "Sensor " ?sensor " in " ?state crlf))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -