ลิสต์ (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, 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 (!) ด้วย ถ้าไม่ใช้จะได้ผลเป็นอย่างไร

 

list11

เมื่อ 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.