CLIPS
- 5 min read
- 2 chapters
- 1 lab on Lably
Learn it on Lably
As of 2005, CLIPS was probably the most widely used expert system tool. CLIPS is written in C, extensions can be written in C, and CLIPS can be called from C. Its syntax resembles that of the programming language Lisp.
CLIPS incorporates a complete object-oriented programming language for writing expert systems. COOL combines the programming paradigms of procedural, object oriented, and logic programming (automated theorem proving) languages.
Facts and rules
CLIPS uses forward chaining. Like other expert system languages, CLIPS deals with rules and facts. Various facts can make a rule applicable. An applicable rule is then fired. Facts and rules are created by first defining them, as shown below:
<span id="mwLw"></span><span class="w" id="mwMA"> </span><span class="p" id="mwMQ">(</span><span class="nv" id="mwMg">deftemplate</span><span class="w" id="mwMw"> </span><span class="nv" id="mwNA">car_problem</span> <span class="w" id="mwNQ"> </span><span class="p" id="mwNg">(</span><span class="nv" id="mwNw">slot</span><span class="w" id="mwOA"> </span><span class="nv" id="mwOQ">name</span><span class="p" id="mwOg">)</span> <span class="w" id="mwOw"> </span><span class="p" id="mwPA">(</span><span class="nv" id="mwPQ">slot</span><span class="w" id="mwPg"> </span><span class="nv" id="mwPw">status</span><span class="p" id="mwQA">))</span> <span class="w" id="mwQQ"> </span><span class="p" id="mwQg">(</span><span class="nv" id="mwQw">deffacts</span><span class="w" id="mwRA"> </span><span class="nv" id="mwRQ">trouble_shooting</span> <span class="w" id="mwRg"> </span><span class="p" id="mwRw">(</span><span class="nv" id="mwSA">car_problem</span><span class="w" id="mwSQ"> </span><span class="p" id="mwSg">(</span><span class="nv" id="mwSw">name</span><span class="w" id="mwTA"> </span><span class="nv" id="mwTQ">ignition_key</span><span class="p" id="mwTg">)</span><span class="w" id="mwTw"> </span><span class="p" id="mwUA">(</span><span class="nv" id="mwUQ">status</span><span class="w" id="mwUg"> </span><span class="nv" id="mwUw">on</span><span class="p" id="mwVA">))</span> <span class="w" id="mwVQ"> </span><span class="p" id="mwVg">(</span><span class="nv" id="mwVw">car_problem</span><span class="w" id="mwWA"> </span><span class="p" id="mwWQ">(</span><span class="nv" id="mwWg">name</span><span class="w" id="mwWw"> </span><span class="nv" id="mwXA">engine</span><span class="p" id="mwXQ">)</span><span class="w" id="mwXg"> </span><span class="p" id="mwXw">(</span><span class="nv" id="mwYA">status</span><span class="w" id="mwYQ"> </span><span class="nv" id="mwYg">wont_start</span><span class="p" id="mwYw">))</span> <span class="w" id="mwZA"> </span><span class="p" id="mwZQ">(</span><span class="nv" id="mwZg">car_problem</span><span class="w" id="mwZw"> </span><span class="p" id="mwaA">(</span><span class="nv" id="mwaQ">name</span><span class="w" id="mwag"> </span><span class="nv" id="mwaw">headlights</span><span class="p" id="mwbA">)</span><span class="w" id="mwbQ"> </span><span class="p" id="mwbg">(</span><span class="nv" id="mwbw">status</span><span class="w" id="mwcA"> </span><span class="nv" id="mwcQ">work</span><span class="p" id="mwcg">)))</span> <span class="w" id="mwcw"> </span><span class="p" id="mwdA">(</span><span class="nv" id="mwdQ">defrule</span><span class="w" id="mwdg"> </span><span class="nv" id="mwdw">rule1</span> <span class="w" id="mweA"> </span><span class="p" id="mweQ">(</span><span class="nv" id="mweg">car_problem</span><span class="w" id="mwew"> </span><span class="p" id="mwfA">(</span><span class="nv" id="mwfQ">name</span><span class="w" id="mwfg"> </span><span class="nv" id="mwfw">ignition_key</span><span class="p" id="mwgA">)</span><span class="w" id="mwgQ"> </span><span class="p" id="mwgg">(</span><span class="nv" id="mwgw">status</span><span class="w" id="mwhA"> </span><span class="nv" id="mwhQ">on</span><span class="p" id="mwhg">))</span> <span class="w" id="mwhw"> </span><span class="p" id="mwiA">(</span><span class="nv" id="mwiQ">car_problem</span><span class="w" id="mwig"> </span><span class="p" id="mwiw">(</span><span class="nv" id="mwjA">name</span><span class="w" id="mwjQ"> </span><span class="nv" id="mwjg">engine</span><span class="p" id="mwjw">)</span><span class="w" id="mwkA"> </span><span class="p" id="mwkQ">(</span><span class="nv" id="mwkg">status</span><span class="w" id="mwkw"> </span><span class="nv" id="mwlA">wont_start</span><span class="p" id="mwlQ">))</span> <span class="w" id="mwlg"> </span><span class="nv" id="mwlw">=></span> <span class="w" id="mwmA"> </span><span class="p" id="mwmQ">(</span><span class="nb" id="mwmg">assert</span><span class="w" id="mwmw"> </span><span class="p" id="mwnA">(</span><span class="nv" id="mwnQ">car_problem</span><span class="w" id="mwng"> </span><span class="p" id="mwnw">(</span><span class="nv" id="mwoA">name</span><span class="w" id="mwoQ"> </span><span class="nv" id="mwog">starter</span><span class="p" id="mwow">)</span><span class="w" id="mwpA"> </span><span class="p" id="mwpQ">(</span><span class="nv" id="mwpg">status</span><span class="w" id="mwpw"> </span><span class="nv" id="mwqA">faulty</span><span class="p" id="mwqQ">))))</span>
Having set this up, the (reset) command causes CLIPS to read the facts and rules. In this case, that would lead to the three "trouble_shooting" facts being asserted. Then the (run) command is used. Given that the two facts listed in rule1 have both been asserted, the conditions for doing its action have been met so the additional fact is asserted as a result of the run.
<span id="mwrQ"></span><span class="nv" id="mwrg">CLIPS></span><span class="w" id="mwrw"> </span><span class="p" id="mwsA">(</span><span class="nv" id="mwsQ">reset</span><span class="p" id="mwsg">)</span> <span class="nv" id="mwsw">CLIPS></span><span class="w" id="mwtA"> </span><span class="p" id="mwtQ">(</span><span class="nv" id="mwtg">agenda</span><span class="p" id="mwtw">)</span> <span class="mi" id="mwuA">0</span><span class="w" id="mwuQ"> </span><span class="nv" id="mwug">rule1:</span><span class="w" id="mwuw"> </span><span class="nv" id="mwvA">f-1,f-2</span> <span class="nv" id="mwvQ">For</span><span class="w" id="mwvg"> </span><span class="nv" id="mwvw">a</span><span class="w" id="mwwA"> </span><span class="nv" id="mwwQ">total</span><span class="w" id="mwwg"> </span><span class="nv" id="mwww">of</span><span class="w" id="mwxA"> </span><span class="mi" id="mwxQ">1</span><span class="w" id="mwxg"> </span><span class="nv" id="mwxw">activation.</span> <span class="nv" id="mwyA">CLIPS></span><span class="w" id="mwyQ"> </span><span class="p" id="mwyg">(</span><span class="nv" id="mwyw">facts</span><span class="p" id="mwzA">)</span> <span class="nv" id="mwzQ">f-0</span><span class="w" id="mwzg"> </span><span class="p" id="mwzw">(</span><span class="nv" id="mw0A">initial-fact</span><span class="p" id="mw0Q">)</span> <span class="nv" id="mw0g">f-1</span><span class="w" id="mw0w"> </span><span class="p" id="mw1A">(</span><span class="nv" id="mw1Q">car_problem</span><span class="w" id="mw1g"> </span><span class="p" id="mw1w">(</span><span class="nv" id="mw2A">name</span><span class="w" id="mw2Q"> </span><span class="nv" id="mw2g">ignition_key</span><span class="p" id="mw2w">)</span><span class="w" id="mw3A"> </span><span class="p" id="mw3Q">(</span><span class="nv" id="mw3g">status</span><span class="w" id="mw3w"> </span><span class="nv" id="mw4A">on</span><span class="p" id="mw4Q">))</span> <span class="nv" id="mw4g">f-2</span><span class="w" id="mw4w"> </span><span class="p" id="mw5A">(</span><span class="nv" id="mw5Q">car_problem</span><span class="w" id="mw5g"> </span><span class="p" id="mw5w">(</span><span class="nv" id="mw6A">name</span><span class="w" id="mw6Q"> </span><span class="nv" id="mw6g">engine</span><span class="p" id="mw6w">)</span><span class="w" id="mw7A"> </span><span class="p" id="mw7Q">(</span><span class="nv" id="mw7g">status</span><span class="w" id="mw7w"> </span><span class="nv" id="mw8A">wont_start</span><span class="p" id="mw8Q">))</span> <span class="nv" id="mw8g">f-3</span><span class="w" id="mw8w"> </span><span class="p" id="mw9A">(</span><span class="nv" id="mw9Q">car_problem</span><span class="w" id="mw9g"> </span><span class="p" id="mw9w">(</span><span class="nv" id="mw-A">name</span><span class="w" id="mw-Q"> </span><span class="nv" id="mw-g">headlights</span><span class="p" id="mw-w">)</span><span class="w" id="mw_A"> </span><span class="p" id="mw_Q">(</span><span class="nv" id="mw_g">status</span><span class="w" id="mw_w"> </span><span class="nv" id="mwAQA">work</span><span class="p" id="mwAQE">))</span> <span class="nv" id="mwAQI">For</span><span class="w" id="mwAQM"> </span><span class="nv" id="mwAQQ">a</span><span class="w" id="mwAQU"> </span><span class="nv" id="mwAQY">total</span><span class="w" id="mwAQc"> </span><span class="nv" id="mwAQg">of</span><span class="w" id="mwAQk"> </span><span class="mi" id="mwAQo">4</span><span class="w" id="mwAQs"> </span><span class="nv" id="mwAQw">facts.</span> <span class="nv" id="mwAQ0">CLIPS></span><span class="w" id="mwAQ4"> </span><span class="p" id="mwAQ8">(</span><span class="nv" id="mwARA">run</span><span class="p" id="mwARE">)</span> <span class="nv" id="mwARI">CLIPS></span><span class="w" id="mwARM"> </span><span class="p" id="mwARQ">(</span><span class="nv" id="mwARU">facts</span><span class="p" id="mwARY">)</span> <span class="nv" id="mwARc">f-0</span><span class="w" id="mwARg"> </span><span class="p" id="mwARk">(</span><span class="nv" id="mwARo">initial-fact</span><span class="p" id="mwARs">)</span> <span class="nv" id="mwARw">f-1</span><span class="w" id="mwAR0"> </span><span class="p" id="mwAR4">(</span><span class="nv" id="mwAR8">car_problem</span><span class="w" id="mwASA"> </span><span class="p" id="mwASE">(</span><span class="nv" id="mwASI">name</span><span class="w" id="mwASM"> </span><span class="nv" id="mwASQ">ignition_key</span><span class="p" id="mwASU">)</span><span class="w" id="mwASY"> </span><span class="p" id="mwASc">(</span><span class="nv" id="mwASg">status</span><span class="w" id="mwASk"> </span><span class="nv" id="mwASo">on</span><span class="p" id="mwASs">))</span> <span class="nv" id="mwASw">f-2</span><span class="w" id="mwAS0"> </span><span class="p" id="mwAS4">(</span><span class="nv" id="mwAS8">car_problem</span><span class="w" id="mwATA"> </span><span class="p" id="mwATE">(</span><span class="nv" id="mwATI">name</span><span class="w" id="mwATM"> </span><span class="nv" id="mwATQ">engine</span><span class="p" id="mwATU">)</span><span class="w" id="mwATY"> </span><span class="p" id="mwATc">(</span><span class="nv" id="mwATg">status</span><span class="w" id="mwATk"> </span><span class="nv" id="mwATo">wont_start</span><span class="p" id="mwATs">))</span> <span class="nv" id="mwATw">f-3</span><span class="w" id="mwAT0"> </span><span class="p" id="mwAT4">(</span><span class="nv" id="mwAT8">car_problem</span><span class="w" id="mwAUA"> </span><span class="p" id="mwAUE">(</span><span class="nv" id="mwAUI">name</span><span class="w" id="mwAUM"> </span><span class="nv" id="mwAUQ">headlights</span><span class="p" id="mwAUU">)</span><span class="w" id="mwAUY"> </span><span class="p" id="mwAUc">(</span><span class="nv" id="mwAUg">status</span><span class="w" id="mwAUk"> </span><span class="nv" id="mwAUo">work</span><span class="p" id="mwAUs">))</span> <span class="nv" id="mwAUw">f-4</span><span class="w" id="mwAU0"> </span><span class="p" id="mwAU4">(</span><span class="nv" id="mwAU8">car_problem</span><span class="w" id="mwAVA"> </span><span class="p" id="mwAVE">(</span><span class="nv" id="mwAVI">name</span><span class="w" id="mwAVM"> </span><span class="nv" id="mwAVQ">starter</span><span class="p" id="mwAVU">)</span><span class="w" id="mwAVY"> </span><span class="p" id="mwAVc">(</span><span class="nv" id="mwAVg">status</span><span class="w" id="mwAVk"> </span><span class="nv" id="mwAVo">faulty</span><span class="p" id="mwAVs">))</span> <span class="nv" id="mwAVw">For</span><span class="w" id="mwAV0"> </span><span class="nv" id="mwAV4">a</span><span class="w" id="mwAV8"> </span><span class="nv" id="mwAWA">total</span><span class="w" id="mwAWE"> </span><span class="nv" id="mwAWI">of</span><span class="w" id="mwAWM"> </span><span class="mi" id="mwAWQ">5</span><span class="w" id="mwAWU"> </span><span class="nv" id="mwAWY">facts.</span> <span class="nv" id="mwAWc">CLIPS></span> <span class="p" id="mwAWg">(</span><span class="nb" id="mwAWk">assert</span><span class="w" id="mwAWo"> </span><span class="nv" id="mwAWs"><fact>+</span><span class="p" id="mwAWw">)</span> <span class="w" id="mwAW0"> </span><span class="p" id="mwAW4">(</span><span class="nv" id="mwAW8">Assert</span><span class="w" id="mwAXA"> </span><span class="p" id="mwAXE">(</span><span class="nv" id="mwAXI">object</span><span class="w" id="mwAXM"> </span><span class="p" id="mwAXQ">(</span><span class="nv" id="mwAXU">name</span><span class="w" id="mwAXY"> </span><span class="s" id="mwAXc">"chair"</span><span class="p" id="mwAXg">)</span> <span class="p" id="mwAXk">(</span><span class="nv" id="mwAXo">Material</span><span class="w" id="mwAXs"> </span><span class="nv" id="mwAXw">wood</span><span class="p" id="mwAX0">)</span> <span class="p" id="mwAX4">(</span><span class="nv" id="mwAX8">height</span><span class="w" id="mwAYA"> </span><span class="nv" id="mwAYE">3feet</span><span class="p" id="mwAYI">)</span> <span class="p" id="mwAYM">(</span><span class="nv" id="mwAYQ">Color</span><span class="w" id="mwAYU"> </span><span class="nv" id="mwAYY">brown</span><span class="p" id="mwAYc">))</span> <span class="nv" id="mwAYg">CLIPS</span><span class="p" id="mwAYk">(</span><span class="nv" id="mwAYo">retract</span><span class="w" id="mwAYs"> </span><span class="nv" id="mwAYw"><fact-index+</span><span class="p" id="mwAY0">)</span> <span class="p" id="mwAY4">(</span><span class="nv" id="mwAY8">retract</span><span class="w" id="mwAZA"> </span><span class="mi" id="mwAZE">0</span><span class="p" id="mwAZI">)</span> <span class="nv" id="mwAZM">for</span><span class="w" id="mwAZQ"> </span><span class="nv" id="mwAZU">a</span><span class="w" id="mwAZY"> </span><span class="nv" id="mwAZc">color</span>
In CLIPS, salience allows a user to assign priority (or weight) to a rule.
Sign in to keep reading
One more chapter is free with a Lably account.
Descendants
Descendants of the CLIPS language include Jess (rule-based portion of CLIPS rewritten in Java, it later grew in a different direction), and FuzzyCLIPS (which adds concept of relevancy into the language).

