[Prolog] เริ่มต้นเขียนโปรแกรมด้วยภาษา Prolog พร้อมรู้จักกับ Facts, Rules และ Queries

Neverrest
Neverrest
4 min readFeb 9, 2021

--

หลังจากที่เราได้ติดตั้ง SWI-Prolog สำหรับการเขียนโปรแกรมด้วยภาษา Prolog แล้ว เราก็จะมาเริ่มเรียนรู้ concept และ syntax ของ Prolog กันเลยครับ

Create new Prolog file
Create new Prolog file

อย่างแรกให้เราเปิด SWI-Prolog ขึ้นมา และสร้างไฟล์ภาษา Prolog โดยกดที่ File และไปที่ New จากนั้นให้เลือก directory ที่จะ save พร้อมตั้งชื่อไฟล์

New file
New file

ไฟล์ที่ได้จะเป็นไฟล์สกุล .pl ซึ่งเป็นสกุลของภาษา Prolog ทีนี้เราก็สามารถเขียนโปรแกรมด้วยภาษา Prolog ได้แล้วครับ มาเริ่มเขียนกันเลย

Hello World

Print Hello World on console
Print Hello World on console

เริ่มจากการแสดงผล Hello World ออกมาที่หน้า Console กันก่อนนะครับ ให้ใช้คำสั่ง write('Hello World'). เพื่อ print Hello World ออกทาง Console โดยจะเห็นว่าจะแสดงคำว่า true ออกมาด้วย ซึ่งเป็นลักษณะของ logical programming language ครับ ที่จะต้องแสดงผลเป็น true หรือ false ในคำสั่ง

Symbols

เครื่องหมายที่ใช้ใน Prolog มีหลัก ๆ ทั้งหมด 5 ชนิดดังนี้

  • and แทนด้วย ,
  • or แทนด้วย ;
  • if แทนด้วย :-
  • not แทนด้วย not
  • comment แทนด้วย % (กรณี single-line comment) และ /**/ (กรณี multi-line comment)

Data Types พื้นฐาน

1. Atom มีลักษณะดังนี้

  • เป็น string ที่สามารถประกอบด้วยตัวอักษรภาษาอังกฤษแบบ uppercase, lowercase, underscore และตัวเลข แต่ต้องขึ้นต้นด้วย lowercase เท่านั้น เช่น orange, playGuitar, burger_store
  • เป็น string ที่เขียนอยู่ใน single quote ซึ่งในกรณีนี้สามารถขึ้นต้นด้วย uppercase, lowercase, underscore และตัวเลขได้ เช่น ‘Vincent’. ‘64num’, ‘_animal’
  • สัญลักษณ์พิเศษ เช่น , (and) . (full stop) :- (if) ; (or)

2. Number มี 2 แบบ

  • Interger เช่น 13, -52, 65425
  • Float เช่น -6.6, 35.233

3. Variable เป็น string ที่สามารถประกอบด้วยตัวอักษรภาษาอังกฤษแบบ uppercase, lowercase, underscore และตัวเลข แต่ต้องขึ้นต้นด้วยตัวอักษร uppercase หรือ underscore เท่านั้น เช่น X, Y, Cat, _name

4. Complex Term เกิดจากการประกอบกันของ Atoms, Numbers และ Variables เช่น playGuitar(carlos), loves(marcus, mia)

Facts, Rules and Queries

1. Facts
Fact เป็นความจริงที่เราสร้างขึ้น โดยมี syntax ดังนี้

Syntax: relation(entity, entity2, ... ,entityN).Example:
Oliver and Jacob are friends. -> friends(oliver, jacob).
Marcus is a man. -> man(marcus).
6 is an even number. -> even_number(6).

จะเห็นว่าจะเขียนในรูปแบบของ function ที่มี argument ข้างใน อย่างเช่น The dog is brown. เป็น fact ที่เรากำหนดขึ้น เราก็สามารถเขียนใน term ของ Prolog ได้ว่า brown(dog). นั่นคือ dog มีความสัมพันธ์ is กับ brown

  • fact จะมี . หรือจุด full stop ลงท้าย
  • fact จะต้องใช้ lowercase ทั้งหมด ยกเว้นกรณีที่เป็นตัวแปร (variable) จะต้องเป็น uppercase

2. Rules
Rule เป็นกฎที่เราสร้างขึ้น โดยจะมีสัญลักษณ์ :- (if) เพื่ออธิบายความสัมพันธ์ระหว่าง facts โดยมี syntax ดังนี้

Syntax: left_hand_side :- right_hand_side.Example:
dating(X,Y) :- likes(X,Y), likes(Y,X).
enemies(X,Y) :- not(likes(X,Y)), not(likes(Y,X)).

จากตัวอย่างจะเห็นว่า rule คือกฎที่เราสร้างโดยกำหนดว่าผลลัพธ์จะเป็น true เมื่อ facts ทางด้านขวามีค่าความจริงเป็น true และผลลัพธ์จะเป็น false เมื่อ facts ทางด้านขวามีค่าความจริงเป็น false โดยเรานิยมใส่ variable X,Y เข้าไปในวงเล็บ เพื่อให้สามารถนำไปใช้กับค่าที่หลากหลายได้ เช่น dating(X,Y) :- likes(X,Y), likes(Y,X). หมายถึง ถ้า X,Y จะออกเดตกัน ทั้งคู่ต้องชอบกันก่อนถึงจะออกเดตกันได้

3. Queries
เป็นการถามว่าสิ่งที่เรากำหนดเป็น true หรือ false โดยผลลัพธ์ที่เป็น false นั้น สามารถมีความหมายได้ทั้ง false (เท็จจริง ๆ) หรือ null (ไม่มี fact นั้นอยู่)

Create facts and rule
Create facts and rule

จากภาพด้านบน ผมกำหนด facts ทั้งหมด 3 ข้อ และ rule 1 ข้อ เราลองมาทำ query ข้อมูลกันครับ

ก่อนที่เราจะ query ได้ เราต้อง compile ไฟล์ .pl ที่เราสร้างขึ้นมาก่อนครับ ซึ่งมี 2 วิธีที่เราจะทำได้

วิธีที่ 1 Compile ใน Editor

Compile from editor
Compile from editor

วิธีแรกคือ กด compiler ใน editor ให้คลิกที่ Compile และเลือก Compile buffer หรือกด shortcut key (Ctrl + C ตามด้วย Ctrl + B) จากนั้นที่ SWI-Prolog Console จะมีข้อความขึ้นมาว่า compile เรียบร้อย พร้อมให้เรา query ได้

วิธีที่ 2 Compile ใน SWI-Prolog Console

Compile in SWI-Prolog Console
Compile in SWI-Prolog Console

ใช้คำสั่ง [‘FILE_PATH’]. เพื่อทำการ compile file.pl ตาม path ที่เรากำหนด เมื่อใช้คำสั่งถูกต้องก็จะแสดงข้อความ true. บนหน้า console แสดงว่าพร้อมสำหรับการ query แล้วล่ะครับ

เริ่มการ query

Start query
Start query
  • likes(william, amelia). เป็น fact ที่ระบุไว้ใน test.pl จึงได้ผลลัพธ์เป็น true
  • likes(john, mia). เป็น fact ที่ไม่ได้ระบุไว้ใน test.pl จึงได้ผลลัพธ์เป็น false
  • dating(william, amelia). เป็น true เนื่องจากใน fact มีการกำหนด likes(william, amelia). และ likes(amelia, william). ซึ่งตรงตามเงื่อนไขในด้านขวาคือทั้ง X และ Y ต้อง likes ซึ่งกันและกัน ทำให้ผลลัพธ์เป็น true นั่นเอง
  • dating(james, amelia). เป็น false เพราะว่าใน fact มีแค่ likes(james, amelia). แต่ไม่มี likes(amelia, james). จึงเป็น false นั่นเองครับ (เศร้าเลย 😢)

จบกันไปแล้วนะครับสำหรับการเขียนโปรแกรมด้วยภาษา Prolog เบื้องต้น จากทั้งหมดนี้เราก็ได้เรียนรู้ data types, symbols, facts, rules, query และวิธีการ compile file.pl ของภาษา Prolog กันไปแล้ว ในบทความหน้าเราจะมาพูดถึงเรื่อง variable กันครับ 👇

แหล่งอ้างอิง

--

--

Neverrest
Neverrest

A strong enthusiastic Full Stack Software Engineer with a passion for web development. Game Master | Fortune Teller | Trader | Magician