(deftemplate person (multislot name (type SYMBOL)) (slot age (type INTEGER))) (assert (person (name Fred Smith) (age four))) ;wrong type
The type attribute is either ?VARIABLE for any data type, or one or more of SYMBOL, STRING, LEXEME, INTEGER, FLOAT, or NUMBER.
(defrule create-person => (printout t "What's your name? ") (bind ?name (explode$ (readline))) (printout t "What's your age? ") (bind ?age (read)) (assert (person (name ?name) (age ?age))) )
If age entered is of a wrong type, e.g. "four", it is not checked at parse time. Dynamic constraint checking can be enabled using
(set-dynamic-constraint-checking TRUE) ; FALSE if disable
(deftemplate person (multislot name (type SYMBOL)) (slot age (type INTEGER)) (slot gender (type SYMBOL) (allowed-symbols male female)) )
(deftemplate person (multislot name (type SYMBOL)) (slot age (type INTEGER) (range 0 ?VARIABLE)) )
(deftemplate volleyball-team (slot name (type STRING)) (multislot player (type STRING) (cardinality 6 6)) (multislot alternates (type STRING) (cardinality 0 2)) )
(deftemplate example1 ;default values (slot a) ; nil (slot b (type INTEGER)) ; 0 (slot c (allowed-values red green blue)) ; red (multislot d) (multislot e (cardinality 0 2) ; 3.5 3.5 (type FLOAT) (range 3.5 10.0)) ) (deftemplate example2 (slot a) (slot b (default ?NONE)) ) ;no default value (deftemplate example3 (slot a (default 3)) ; 3 (slot b (default (+ 3 4))) ; 7 (multislot c (default a b c)) ; a b c (multislot d (default (+ 1 2) (+ 3 4))) ) ; 3 7
Example: default.clp
(deftemplate data (slot create-time (default-dynamic (time))) (slot value)) (defrule retract-data-facts-after-one-minute ?f <- (data (create-time ?t1)) (current-time ?t2) (test (> (- ?t2 ?t1) 60)) => (retract ?f)) (assert (data (value 3))) (assert (current-time (time)))
Example: time.clp
(deffacts init (priority first) (priority second) (priority third))
(defrule fire-first (priority first) => (printout t "Print first" crlf)) (defrule fire-second (priority second) => (printout t "Print second" crlf)) (defrule fire-third (priority third) => (printout t "Print third" crlf))
(defrule fire-first (declare (salience 30)) (priority first) => (printout t "Print first" crlf)) (defrule fire-second (declare (salience 20)) (priority second) => (printout t "Print second" crlf)) (defrule fire-third (declare (salience 10)) (priority third) => (printout t "Print third" crlf))
(deffacts control-information (phase detection) (phase-seq detection isolation recovery)) (defrule change-phase (declare (salience -10)) ?phase <- (phase ?current-phase) ?list <- (phase-seq ?next-phase $?other-phases) => (retract ?phase ?list) (assert (phase ?next-phase)) (assert (phase-seq ?other-phases ?next-phase)))
(defmodule DETECTION) (defmodule ISOLATION) (defmodule RECOVERY) (defrule example1 =>) ; in current module (defrule ISOLATION::example2 =>) ; in module ISOLATION (get-current-module) (set-current-module DETECTION)
Example: defmodule.clp
(deftemplate DETECTION::fault (slot component)) (assert (fault (component A))) ; in module DETECTION (deftemplate ISOLATION::possible-failure (slot component)) (assert (possible-failure (component B))) ; in module ISOLATION (facts DETECTION) ; (fault (component A)) (facts ISOLATION) ; (possible-failure (component B)) (facts RECOVERY) ; none (facts *) ; list all facts
The export attribute use one of the following formats:
(export ?ALL) (export ?NONE) (export deftemplate ?ALL) (export deftemplate ?NONE) (export deftemplate <deftemplate-name>+)
The import attribute use one of the following formats:
(import <module-name> ?ALL) (import <module-name> ?NONE) (import <module-name> deftemplate ?ALL) (import <module-name> deftemplate ?NONE) (import <module-name> deftemplate <deftemplate-name>+)
Example: defmodule.clp
Demo: phases.clp
(defrule DETECTION::rule-1 (fault (component A | C)) =>) (defrule ISOLATION::rule-2 (possible-failure (component B | D)) =>) (defrule RECOVERY::rule-3 (fault (component A | C)) (possible-failure (component B | D)) =>)
(focus DETECTION) (focus DETECTION ISOLATION RECOVERY)
(list-focus-stack) (get-focus-stack) (clear-focus-stack) (get-focus) ;get current focus (pop-focus) ;remove current focus
(defmodule MAIN (export deftemplate initial-fact)) ; must (defmodule DETECTION (import MAIN deftemplate initial-fact)) ; must (defrule MAIN::start => (focus DETECTION)) (defrule DETECTION::example-1 => (return) (printout t "No printout!" crlf)) ; not printed (defrule DETECTION::example-2 ; no chance to fire => (return) (printout t "No printout!" crlf))
Example: return.clp
note: Jess has no export/import mechanisms.More Examples:
(defmodule MAIN (export deftemplate initial-fact)) (defmodule DETECTION (import MAIN deftemplate initial-fact)) (defrule DETECTION::example (declare (auto-focus TRUE)) =>)
Example: autofocus.clp
(defmodule DETECTION) (defmodule ISOLATION) (defmodule RECOVERY) (deffacts MAIN::control-information (phase-seq DETECTION ISOLATION RECOVERY)) (defrule change-phase ?list <- (phase-seq ?next-phase $?other-phases) => (focus ?next-phase) (retract ?list) (assert (phase-seq ?other-phases ?next-phase)))
Example: control-2.clp
Previous Advanced Pattern Matching Up TOC Next Procedural Programming