200 likes | 334 Vues
This document explores advanced concepts in CLIPS, focusing on the use of wildcards and patterns within rules. It covers how to apply wildcards to match symbols dynamically in a rule context, along with practical examples using band member facts and variables. Key topics include declaring facts, defining templates, and utilizing rules to manipulate data and perform operations like addition. The document features practical implementations such as identifying band members, calculating totals, and handling personal data. Perfect for enhancing your CLIPS programming skills.
E N D
PRAKTIKUM _#5Expert System CLIPS [lanjutan]
WildCard Pattern • Used to take the place of a symbol on the left hand side of a rule. • ? -> match any one symbol • $? -> match zero or more symbols • ?name -> only match one symbols
bands.CLP • (deftemplatemember_bands (multislot member-of)) • (deffactsnama_band (member_bands (member-of beatlesjohn_lennonpaul_mccartneygeorge_harrisonringo_starr)) (member_bands (member-of who roger_daltreypete_townsendkeith_moon)) (member_bands (member-of ebtgtracey_thornben_watt))) • (defrule bands (member_bands (member-of ?groupband ?member1 $?)) => (printout t "there is a band called " ?groupband “anggota1 adalah“ ?member1 crlf))
bands_member.CLP • (deftemplatemember_bands (multislot member-of)) • (deffactsnama_band (member_bands (member-of beatlesjohn_lennonpaul_mccartneygeorge_harrisonringo_starr)) (member_bands (member-of who roger_daltreypete_townsendkeith_moon)) (member_bands (member-of ebtgtracey_thornben_watt))) • (defrule band-members (member_bands (member-of ?band $? ?member $?)) => (printout t ?member " is a member of " ?band crlf))
multi_member.CLP • (deftemplatemember_bands (multislot member-of)) • (deffactsnama_band (member_bands (member-of beatlesjohn_lennonpaul_mccartneygeorge_harrisonringo_starr)) (member_bands (member-of who roger_daltreypete_townsendkeith_moon)) (member_bands (member-of ebtgtracey_thornben_watt))) • (defrule band-members (member_bands (member-of ?band $?members)) => (printout t "The members of " ?band " are " $?members crlf))
variabel.CLP (deftemplate variabel (slot number)) (deftemplate jumlah (slot total)) (deffacts nilai (variabel (number 4)) (variabel (number 6))) (defrule addup (variabel (number ?x)) (variabel (number ?y)) => (bind ?total (+ ?x ?y)) (printout t ?x " + " ?y " = " ?total crlf) (assert (jumlah (total ?total))))
defglobal.CLP (defglobal ?*var1* = 17 ?*oranges* = "seven") (deftemplate variabel (slot number)) (deftemplate jumlah (slot total)) (deffacts nilai (variabel (number 24))) (defrule addup (variabel (number ?x)) => (bind ?total (- ?x ?*var1*)) (printout t ?x " - " ?*var1* " = " ?total "(" ?*oranges* ")" crlf) (assert (jumlah (total ?total))))
Function Templates and Conditions
birthday.CLP (defrule birthday_is ?ulang_tahun <- (ultah (birthday ?name)) ?data-fact <- (personal-data (name ?name) (age ?age)) => (modify ?data-fact (age (+ ?age 1))) (retract ?ulang_tahun))
tes_weight.CLP (deftemplate personal-data (slot name) (slot age) (slot weight) (slot height) (multislot blood-pressure)) (deffacts people (personal-data (name Andrew) (age 20) (weight 180) (height 188) (blood-pressure 130 80)) (personal-data (name Cyril) (age 63) (weight 70) (height 1678) (blood-pressure 180 90))) (defrule lardy-bugger (personal-data (name ?name) (weight ?weight)) (test (> ?weight 100)) => (printout t ?name " weighs " ?weight " kg - the fat sod." crlf))
print_age.CLP (deftemplate personal-data (slot name)(slot age)(slot weight)(slot height)(multislot blood-pressure)) (deffacts people (personal-data (name Andrew) (age 120) (weight 80) (height 188) (blood-pressure 130 80)) (personal-data (name Cyril) (age 63) (weight 70) (height 1678) (blood-pressure 180 90))) (defrule print-ages (and (personal-data (name ?name) (age ?age)) (personal-data (name ?name) (weight ?weight))) => (printout t ?name " weighs " ?weight " at " ?age " years old." crlf))
umbrella.CLP (deftemplate umbrella (slot weather)) (deffacts cuaca (umbrella (weather raining)) (umbrella (weather snowing)) ; mencobadihilangkanfaktaini (umbrella (weather sunny))) (defrule take-an-umbrella (or (umbrella (weather raining)) (umbrella (weather snowing))) => (printout t "Take an umbrella" crlf)) (defrulenotTake-an-umbrella (not (umbrella (weather sunny))) => (printout t “Not Take an umbrella" crlf))
not_birthday.CLP (deftemplate personal-data (slot name) (slot age) (slot weight) (slot height) (multislot blood-pressure)) (deftemplate ultah (slot birthday)) (deffacts is_ultah (ultah (birthday Andrew))) (deffacts people (personal-data (name Andrew) (age 120) (weight 80) (height 188) (blood-pressure 130 80)) (personal-data (name Cyril) (age 63) (weight 70) (height 1678) (blood-pressure 180 90))) (defrule not-birthday (personal-data (name ?name) (weight ?weight)) (not (ultah (birthday ?name))) => (printout t "It's not " ?name "'s birthday" crlf))
pointless.CLP (defrule pointless (test (> 6 5)) => (printout t "Six is indeed greater than five" crlf))
exist_forall.CLP (deftemplate personal-data (slot name)(slot age)(slot weight)(slot height)(multislot blood-pressure)) (deffacts people (personal-data (name Andrew) (age 20) (weight 80) (height 188) (blood-pressure 130 80)) (personal-data (name Cyril) (age 63) (weight 70) (height 1678) (blood-pressure 180 90))) (defrule person-exists (personal-data (name ?name)) => (printout t "Rule person exists reports there is a person called " ?name crlf))
Lanjutan...... (defrule are-there-people (exists (personal-data (name ?name))) => (printout t "Rule are-there-people reports there is at least one person" crlf)) (defrule check-each-person (forall (personal-data (name ?name) (age ?umur)) (personal-data (name ?name) (weight ?berat))) => (printout t "Rule check-each-person reports that all persons have a name" crlf))
Summary • (deftemplate (slot slotname1) (slot slotname1)) • (and (predicate1) (predicate2)) • (or (predicate1) (predicate2)) • (not (predicate1)) • (test (predicate1)) • (exists (pattern)) • (forall (pattern1) (pattern2) )