Lably
Skip to content

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.

More in Computing and communication