20 May 2004

Prolog กับ Internal Data Base

ด้วยความที่อยากใช้ Prolog ทั้งหมดในโปรแกรมที่กำลังเขียนอยู่ เนื่องจากโปรแกรมที่เขียนอยู่ ต้องเก็บข้อมูลจำนวนมาก เดิมก็เก็บไว้ในดาต้าเบสของ Prolog โดยตรง ด้วย assert/1 กับ retract/1 ผลปรากฏว่าโปรแกรมที่ได้ทำงานช้ามาก สุดท้ายเลยต้องจำใจแยกส่วนนี้ออกไปเป็น C แล้วเขียน library มาเชื่อมกับ Prolog วันก่อนกลับมาพยายามแก้ปัญหานี้ใหม่ ลองนั่งอ่านคู่มือการใช้ Prolog ไปเรื่อยๆ (ผมใช้ YAP) ก็เจอ predicate ที่เกี่ยวกับ internal data base มีคำอธิบายไว้สั้นๆ ว่า เอาไว้เก็บข้อมูลที่ต้องการให้เป็น global ใช้แทน assert/retract ได้ แต่ทำงานเร็วกว่า ประหยัดพื้นที่กว่า แต่มีเงื่อนไขว่าจะต้องมี key กำกับ term ทุกตัวที่จะเก็บ (คงใช้ hash table แหละ ส่วนโปรแกรมเราก็มี key อยู่แล้ว ไม่ยาก)

สุดท้าย อยากรู้ว่าเร็วกว่าแค่ไหน เลยลองเอาเขียนโปรแกรมมาเทียบกัน ลองเก็บ term จำนวน 100,000 ตัว แล้ว ดึงกลับมา โดยใช้สองวิธี ปรากฏว่า วิธีปรกติ (assert/retract) ใช้เวลา 5:52 นาที ถ้าใช้ idb จะลดเหลือ 2:52 นาที เร็วกว่ากันเยอะแฮะ แต่ก็มีข้อจำกัดแหละ ถ้าใช้ idb ก็ไม่สามารถ unify หรือ query หาค่าของตัวแปรแบบปกติได้ ซึ่งเราไม่ต้องการอยู่แล้ว (ที่จริงถ้าเขียน predicate อีกตัวมาครอบไว้ ก็พอจะทำได้เหมือนกันแหละ)

No comments: