Skip to content

Instantly share code, notes, and snippets.

@dtinth
Last active December 13, 2015 19:09
Show Gist options
  • Save dtinth/4960810 to your computer and use it in GitHub Desktop.
Save dtinth/4960810 to your computer and use it in GitHub Desktop.
เล่นกับ CLIPS

ติดตั้ง

รันโปรแกรม

เลือกรันได้หลายแบบ:

  • แบบ Console ให้เปิด CLIPS Dos / CLIPS Console
  • แบบมี GUI ให้เปิด CLIPS IDE

ออกจากโปรแกรม

พิมพ์ว่า

(exit)

ส่วนประกอบ

ในฐานความรู้ของ Expert System ปกติจะเก็บสองอย่าง

  • fact-list เก็บ Fact ต่างๆ (ประมาณว่า เป็น Working Memory)
  • knowledge-base หรือ rule-base เก็บ Rule ทั้งหมด

Fact

Fact ในโปรแกรม CLIPS จะมีหน้าตาเป็นคำ 1 คำขึ้นไปอยู่ในวงเล็บ เช่น

(it-rained)

อาจจะมีหลายคำก็ได้ เช่น

(person A)
(person B)
(likes A cookie)
(likes B pie)
(dislikes A fish)
(dislikes A onion)
(dislikes B cookie)

มี Fact อะไรอยู่ในระบบบ้าง

พิมพ์ว่า

(facts)
f-0     (initial-fact)
For a total of 1 fact.

แปลว่าใน fact-list มีข้อมูลอยู่แค่ 1 ข้อมูล คือ (initial-fact) (ปกติมันจะมีอยู่แล้วเวลาเราเปิด CLIPS ฉะนั้นไม่ต้องสนใจมัน)

ใส่ Fact เพิ่มเข้าไป

พิมพ์ว่า

(assert (person A))
(assert (person B))
(assert (likes A cookie))
(assert (likes B pie))
(assert (dislikes A fish))
(assert (dislikes A onion))
(assert (dislikes B cookie))
(assert (dislikes B vegetables))

หลังจากนั้น

(facts)

จะได้

f-0     (initial-fact)
f-1     (person A)
f-2     (person B)
f-3     (likes A cookie)
f-4     (likes B pie)
f-5     (dislikes A fish)
f-6     (dislikes A onion)
f-7     (dislikes B cookie)
f-8     (dislikes B vegetables)
For a total of 9 facts.

เอา Fact ออก

(retract 6)

f-6 จะหายไป

(facts)
f-0     (initial-fact)
f-1     (person A)
f-2     (person B)
f-3     (likes A cookie)
f-4     (likes B pie)
f-5     (dislikes A fish)
f-7     (dislikes B cookie)
f-8     (dislikes B vegetables)
For a total of 8 facts.

เอา Fact ออกให้หมด

(reset)
(facts)
f-0     (initial-fact)
For a total of 1 fact.

พิมพ์ข้อความ

(printout t "hello" "world" " this" " is " "a " "test" crlf)
helloworld this is a test

Rule

Rule ทำหน้าที่เช็คว่ามี Fact ตามใน Working Memory หรือไม่ (IF) ถ้ามันเจอ Fact ตามที่กำหนดไว้ครบทุกข้อ มันจะทำให้เกิดเหตุการณ์บางอย่าง (THEN)

Syntax:

(defrule ชื่อrule "คำอธิบาย"
    (pattern 1)
    (pattern 2)
    (pattern 3)
 => (action 1)
    (action 2)
    (action 3))

ตัวอย่าง เราจะไม่ชอบคนที่ไม่ชอบอะไรที่เราชอบ:

(assert (likes I cookie))
(assert (likes I steak))
(assert (dislikes I fish))
(assert (likes Someone fish))
(assert (dislikes Someone steak))
(facts)
f-0     (initial-fact)
f-1     (likes I cookie)
f-2     (likes I steak)
f-3     (dislikes I fish)
f-4     (likes Someone fish)
f-5     (dislikes Someone steak)
For a total of 6 facts.
(defrule dislike "I dislike anyone who dislike what I like"
    (likes I ?something)
    (dislikes ?x ?something)
 => (assert (dislikes I ?x)))

พอเรา defrule แล้ว ถ้าเกิดสามารถหา Fact ที่ตรงเงื่อนไขได้ทั้งหมด Rule ที่เรากำหนดจะเข้าไปอยู่ในสิ่งที่เรียกว่า "agenda"

(agenda)
0      dislike: f-5,f-2
For a total of 1 activation.

แปลว่า Rule "dislike" ตรงตามเงื่อนไข โดย Fact ที่ทำให้ตรงตามเงื่อนไขได้แก่ f-5 (dislikes Someone steak) และ f-2 (likes I steak)

เราสั่งให้ Rule มันทำงานโดยสั่ง

(run)

จะเกิดการ assert ข้อมูลใหม่เข้าไป สามารถเช็คได้

(facts)
CLIPS> (facts)
f-0     (initial-fact)
f-1     (likes I cookie)
f-2     (likes I steak)
f-3     (dislikes I fish)
f-4     (likes Someone fish)
f-5     (dislikes Someone steak)
f-6     (dislikes I Someone)
For a total of 7 facts.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment