วันนี้ว่ากันเรื่องภาษา 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, Z=book, list [5] กับ [H|T] H=5, T = []
มาดูตัวอย่างใน Turbo Prolog เริ่มจากการตรวจสอบสมาชิกของลิสต์
domains
list = integer*
a = integer
predicates
member(a,list).
clauses
member(X,[X|_]).
member(X,[_|R]) :- member(X,R).
เมื่อ run program ทดลองป้อน
Goal: member(1,[2,3,4])
No
Goal: member(3,[2,3,4])
Yes
ต่อมาลองดูตัวอย่างการเพิ่มข้อมูลจากลิสต์หนึ่งไปยังอีกลิสต์หนึ่ง
domains
list = integer*
a = integer
predicates
app(list,list,list).
clauses
app([],L,L).
app([X|L1],L2,[X|L3]) :- app(L1,L2,L3).
เมื่อ run program ทดลองป้อน
Goal: app([1,2],[2,3,4],X)
X=[1,2,2,3,4]
1 Solution
จะเป็นการเพิ่ม list [1,2] ด้วย list [2,3,4] ได้เป็น [1,2,2,3,4]
แต่ถ้าไม่ต้องการให้ข้อมูลใน list ซ้ำกันทำได้โดย ตรวจสอบ ข้อมูลใน list แรกว่าเป็นสมาชิกของ list ที่ 2 หรือเปล่า ถ้าใช่ก็จะไม่เพิ่มข้อมูลเข้าไป ตามตัวอย่างด้านล่าง
domains
list = integer*
a = integer
predicates
member(a,list).
app(list,list,list).
clauses
member(X,[X|_]).
member(X,[_|R]) :- member(X,R).
app([],L,L).
app([X|L1],L2,L3):-member(X,L2),app(L1,L2,L3),!.
app([X|L1],L2,[X|L3]):-app(L1,L2,L3).
เมื่อ run programทดลองป้อน
Goal: app([1,2],[2,3,4],X)
X=[1,2,3,4]
1 Solution
ข้อสังเกต จะเห็นได้ว่ามีการใช้ เครื่องหมาย (operator) cut (!) ด้วย ถ้าไม่ใช้จะได้ผลเป็นอย่างไร
เมื่อ run program ทดลองป้อน
Goal: app([1,2],[2,3,4],X)
X=[1,2,3,4]
X=[1,2,2,3,4]
2 Solutions
เครื่องหมาย cut (!) จะทำให้ Turbo Prolog หยุดการหา คำตอบ (solution) หลังจากที่ได้ solution แรกแล้ว
Acknowledgment
Turbo Prolog is a registered trademark of Borland International, Inc. California 95066 USA.