ลิสต์ (Lists) ใน Turbo Prolog

วันนี้ว่ากันเรื่องภาษา Prolog บ้าง ดูเรื่องของรายการ (Lists, ลิสต์) แล้วกัน เริ่มแรกรู้จักลักษณะของ ลิสต์ ใน Prolog กันก่อน ตัวอย่าง [1, 2, 3, 4], [a, d, x, b, s], [“Wichar”, “Somsri”, “Susan Ann”]  ให้สังเกตลิสต์แรก 1 จะเป็นตัวแรกของลิสต์ เรียกว่าหัวของลิสต์ (Head) ที่เหลือ [2, 3, 4] คือลิสต์ของหาง (Tail) Turbo Prolog จะใช้เครื่องหมาย | (เรียกว่า vertical bar) เพื่อแยกส่วนหัวและหาง ตัวอย่าง [X|Y] X คือ ส่วนหัว และ Y คือหาง ตัวอย่าง ถ้ามีเป้าประสงค์ (Goal) test([X|Y]) และมีค่าความจริง (Fact) test(a, b, c, d) ค่าของ X จะหมายถึง a ค่าของ Y คือ ลิสต์ [b, c, d] การเทียบค่าของ list [X, Y, Z] กับ [susan, read, book] X=susan, Y=read, Continue reading →

Backtracking ใน Turbo Prolog

 สมมุติปัญหาต้องการจับคู่ นักเรียนมาแข่งขันตอบปัญหาโดยที่จะต้องมีอายุเท่ากันตัวอย่าง ค่าความจริง (facts) ของนักเรียนในห้อง domains           learner = symbol            age = integer predicates            student(learner, age) clauses             student(wichai, 21).             student(somsak, 19).             student(somsri, 21).             student(somchai, 21).  ให้จับคู่นักเรียน อายุ 21 ปี มาแข่งขันกัน 2 รอบ กำหนดเป้าประสงค์ (goal) แบบผสม (compound goal) ซึ่งจะมีเป้าประสงค์ย่อย (subgoals) หลาย ๆ เป้าประสงค์ดังนี้ student(Who1, 21) and student(Who2, 21) and Who1 <> Who2.  โตยที่ Who1 และ Who2 เป็นคนละคนกัน การทำงานของ Turbo Prolog จะหาคำตอบจากเป้าประสงค์ย่อย (subgoal) อันแรก และจะหาจากเป้าประสงค์ย่อยอื่นต่อไปก็ต่อเมื่อ เจอเป้าประสงค์ย่อยแรกแล้ว จากตัวอย่าง Who1 คือ wichai Turbo Prolog จะหาเป้าประสงค์ย่อยอื่นต่อไป คือ student(Who2, 21) จะได้ Who2 มีค่าเป็น wichai ด้วย Continue reading →