Jump to content

Jess (programming language)

From Niidae Wiki
Revision as of 16:13, 18 June 2024 by imported>Jerryobject (License: Small WP:COPYEDITs WP:EoS: clarify, WP:TERSE.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Template:Refimprove Template:Infobox software Jess is a rule engine for the Java computing platform, written in the Java programming language. It was developed by Ernest Friedman-Hill of Sandia National Laboratories.<ref name="ExpertSystems">Template:Cite book Template:ISBN</ref> It is a superset of the CLIPS language.<ref name="ExpertSystems"/> It was first written in late 1995.<ref name="ExpertSystems"/> The language provides rule-based programming for the automation of an expert system, and is often termed as an expert system shell.<ref name="ExpertSystems"/> In recent years, intelligent agent systems have also developed, which depend on a similar ability.

Rather than a procedural paradigm, where one program has a loop that is activated only one time, the declarative paradigm used by Jess applies a set of rules to a set of facts continuously by a process named pattern matching. Rules can modify the set of facts, or can execute any Java code. It uses the Rete algorithm<ref name="ExpertSystems"/> to execute rules.

License

[edit]

The licensing for Jess is freeware for education and government use, and is proprietary software, needing a license, for commercial use. In contrast, CLIPS, which is the basis and starting code for Jess, is free and open-source software.

Code examples

[edit]

Code examples: <syntaxhighlight lang="lisp">

is a comment

(bind ?x 100)

x = 100

(deffunction max (?a ?b)

            (if (> ?a ?b) then ?a else ?b))

(deffacts myroom

         (furniture chair)
         (furniture table)
         (furniture bed)
         )

(deftemplate car

            (slot color)
            (slot mileage)
            (slot value)
            )

(assert (car (color red) (mileage 10000) (value 400))) </syntaxhighlight> Sample code: <syntaxhighlight lang="lisp"> (clear) (deftemplate blood-donor (slot name) (slot type)) (deffacts blood-bank ; put names & their types into working memory

         (blood-donor (name "Alice")(type "A"))
         (blood-donor (name "Agatha")(type "A"))
         (blood-donor (name "Bob")(type "B"))
         (blood-donor (name "Barbara")(type "B"))
         (blood-donor (name "Jess")(type "AB"))
         (blood-donor (name "Karen")(type "AB"))
         (blood-donor (name "Onan")(type "O"))
         (blood-donor (name "Osbert")(type "O"))
         )

(defrule can-give-to-same-type-but-not-self ; handles A > A, B > B, O > O, AB > AB, but not N1 > N1

        (blood-donor (name ?name)(type ?type))
        (blood-donor (name ?name2)(type ?type2 &:(eq ?type ?type2) &: (neq ?name ?name2) ))
        =>
        (printout t ?name " can give blood to " ?name2 crlf)
        )

(defrule O-gives-to-others-but-not-itself ; O to O cover in above rule

        (blood-donor (name ?name)(type ?type &:(eq ?type "O")))
        (blood-donor (name ?name2)(type ?type2 &: (neq ?type ?type2) &: (neq ?name ?name2) ))
        =>
        (printout t ?name " can give blood to " ?name2 crlf)
        )

(defrule A-or-B-gives-to-AB ; case O gives to AB and AB gives to AB already dealt with

        (blood-donor (name ?name)(type ?type &:(or (eq ?type "A") (eq ?type "B" ))))
        (blood-donor (name ?name2)(type ?type2 &: (eq ?type2 "AB") &: (neq ?name ?name2) ))
        =>
        (printout t ?name " can give blood to " ?name2 crlf)
        )
(watch all)

(reset) (run) </syntaxhighlight>

See also

[edit]
[edit]

References

[edit]

Template:Reflist

Further sources

[edit]
[edit]