3 คะแนน โดย GN⁺ 2023-09-14 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Prolog สร้างโปรแกรมด้วย clause เพียงแบบเดียวและโมเดลข้อมูลที่ยึด term เป็นศูนย์กลาง จึงสามารถแสดงความสัมพันธ์ที่คำนวณได้ด้วยไวยากรณ์ขนาดเล็ก
  • แนวทางเชิงประกาศจะเขียนว่า อะไรเป็นจริงได้บ้าง แทนขั้นตอนการทำงาน ทำให้ใช้ความสัมพันธ์เดียวกันได้ทั้งกับการคำนวณ การสร้าง และการสืบค้น
  • Prolog แบบบริสุทธิ์มีพื้นฐานอยู่บน Horn clause และ resolution ทำให้คาดการณ์ผลของการเพิ่มข้อจำกัดและการเพิ่ม clause ต่อเซตคำตอบได้อย่างมีเหตุผลเชิงตรรกะ
  • ตัวโปรแกรมเองก็เป็น Prolog term ด้วย จึงอ่าน วิเคราะห์ และแปลงโปรแกรมอื่นได้ง่าย อีกทั้งยังสร้างภาษาจำเพาะโดเมนได้ด้วยการเขียนใหม่ในช่วงคอมไพล์
  • ด้วยความเป็นพลวัตในรันไทม์และกลไกโดยนัยอย่างการค้นหา การรวมเป็นหนึ่งเดียว และการแพร่กระจายข้อจำกัด จึงถูกนำไปใช้อย่างกว้างขวางตั้งแต่การประมวลผลภาษา ฐานข้อมูล การตรวจพิสูจน์ ไปจนถึงการหาค่าเหมาะที่สุด

ภาษาขนาดเล็กที่ประกอบด้วย clause และ term

  • ข้อมูลทั้งหมดของ Prolog แสดงด้วย Prolog term
  • องค์ประกอบหลักของภาษามีเพียง clause แบบเดียว โดยรูปแบบพื้นฐานคือ Head :- Body.
    • ความหมายคือ ถ้า Body เป็นจริง Head ก็เป็นจริง
    • ตัวดำเนินการ infix (:-)/2 แทนลูกศร ที่ชี้จากขวาไปซ้าย
    • ถ้า Head เป็นจริงเสมอ สามารถละ :- Body ได้
  • โครงสร้างนี้เพียงอย่างเดียวก็เพียงพอสำหรับการเขียนโปรแกรม Prolog แรกที่ใช้งานได้จริง
  • การคำนวณทุกแบบที่รู้จักสามารถอธิบายด้วย clause ลักษณะนี้ได้ จึงทำให้ Prolog เป็นภาษาที่ Turing-complete
    • สามารถอิมพลีเมนต์ Turing machine ได้โดยอธิบายความสัมพันธ์จากสถานะปัจจุบันและสัญลักษณ์ใต้หัวอ่านบนเทปไปยังสถานะถัดไปด้วย clause
    • ตัวอย่างการอิมพลีเมนต์อยู่ที่ turing.pl

การเขียนโปรแกรมเชิงประกาศและการคิดแบบยึดความสัมพันธ์

  • Prolog เป็นภาษาเชิงประกาศที่แสดงว่า อะไรเป็นจริงได้บ้าง สำหรับคำตอบที่สนใจ มากกว่าจะบอกวิธีหาคำตอบ
  • คุณลักษณะนี้ช่วยให้เขียนสเปกที่กระชับ ชัดเจน และใช้ได้ทั่วไป
  • ความสัมพันธ์ระหว่างลิสต์กับความยาวเขียนได้ดังนี้
list_length([], 0).
list_length([_|Ls], N) :-
        N #> 0,
        N #= N0 + 1,
        list_length(Ls, N0).
  • ในระบบ Prolog บางตัวอาจต้องใส่ไลบรารีเพิ่มเติมเพื่อใช้เลขคณิตจำนวนเต็มเชิงประกาศ
  • นิยามนี้สามารถอ่านแบบเชิงประกาศได้ดังนี้
    • ลิสต์ว่าง [] มีความยาวเป็น 0
    • ถ้า Ls มีความยาว N0 และ N เท่ากับ N0 + 1 แล้ว [_|Ls] จะมีความยาว N และความสัมพันธ์นี้จะเป็นจริงก็ต่อเมื่อ N มากกว่า 0
  • ความสัมพันธ์เดียวกันนี้ใช้ได้หลาย โหมด
    • list_length("abc", L) จะคืนค่า L = 3
    • list_length(Ls, 3) จะหาลิสต์ที่มีความยาว 3 ในรูป Ls = [_A,_B,_C]
    • list_length(Ls, L) จะแสดงคำตอบทั่วไปตั้งแต่ลิสต์ว่างไปจนถึงลิสต์ที่มีความยาวเพิ่มขึ้นเรื่อย ๆ
  • โดยทั่วไป Prolog จะรายงานคำตอบทั้งหมดด้วย backtracking
  • length/2 ถูกรวมอยู่ในร่าง Prologue for Prolog และมีให้เป็น predicate แบบ built-in ที่มีความหมายเดียวกันใน Prolog เกือบทุกอิมพลีเมนเตชัน

Prolog ในฐานะการเขียนโปรแกรมเชิงตรรกะ

  • ในกลุ่มภาษาเชิงประกาศมีทั้งภาษาฟังก์ชันนัลและภาษา logic programming
  • ฟังก์ชันเป็นกรณีพิเศษของความสัมพันธ์ และการเขียนโปรแกรมเชิงฟังก์ชันนัลอาจมองได้ว่าเป็นรูปแบบที่จำกัดกว่าของการเขียนโปรแกรมเชิงตรรกะ
  • Prolog มีรากฐานมาจาก logic
  • โปรแกรม Prolog แบบบริสุทธิ์ประกอบด้วยเซตของ Horn clause
  • การทำงานสามารถมองได้ว่าเป็นกรณีพิเศษของ resolution
  • ด้วยความเชื่อมโยงกับตรรกะเชิงรูปนัย จึงสามารถใช้ declarative debugging โดยอาศัยคุณสมบัติเชิงตรรกะของโปรแกรมได้
    • เมื่อเพิ่มข้อจำกัด เซตคำตอบจะมีได้แต่ลดลง
    • เมื่อเพิ่ม clause เซตคำตอบจะมีได้แต่ขยายออก
    • คุณสมบัตินี้ของโปรแกรม Prolog แบบบริสุทธิ์เรียกว่า monotonicity
  • GUPU system ของ Ulrich Neumerkel เป็นตัวอย่างการนำแนวคิดนี้ไปใช้

คุณสมบัติแบบ homoiconic ที่ทำให้จัดการโปรแกรมเหมือนข้อมูลได้

  • โปรแกรม Prolog เองก็เป็น Prolog term ที่ถูกต้องเช่นกัน
  • คุณสมบัตินี้ทำให้โปรแกรม Prolog วิเคราะห์ แปลง และตีความโปรแกรม Prolog อื่นได้ง่าย
  • สามารถอ่าน Prolog term ได้ด้วย predicate แบบ built-in read/1 ดังนั้นจึงอ่าน Prolog clause ได้ด้วย
  • Prolog มีกลไก macro ที่ทรงพลังสำหรับเขียนโปรแกรมใหม่ในช่วงคอมไพล์
    • จึงสามารถอิมพลีเมนต์ ภาษาจำเพาะโดเมน ที่เหมาะกับงานมากขึ้นได้
  • list_length(Ls,N) และ N#>0 ดูต่างกันในเชิงสัญลักษณ์ แต่เป็นเพียงรูปที่อ่านง่ายกว่าเนื่องจาก Prolog มีตัวดำเนินการแบบ prefix, infix และ postfix
    • ตัวอย่างเช่น Prolog term +(a,b) สามารถเขียนในรูปตัวดำเนินการเป็น a+b ได้
    • เนื่องจาก abstract syntax มีความสม่ำเสมอ จึงอ่านและประมวลผล Prolog term ทุกแบบได้โดยไม่ขึ้นกับรูปแบบการเขียน
  • สามารถนิยามตัวดำเนินการที่ผู้ใช้กำหนดเองแบบไดนามิกให้เหมาะกับการใช้งานเฉพาะได้

ความเป็นพลวัตในรันไทม์และการขยายต่อ

  • โปรแกรม Prolog สามารถ สร้าง เรียกใช้ และแก้ไข ได้ง่ายในรันไทม์
  • คุณลักษณะนี้เพิ่มพลังการแสดงออก และทำให้อิมพลีเมนต์ higher-order predicate ที่รับ predicate อื่นเป็นอาร์กิวเมนต์ได้
  • เทคนิคที่มีความเป็นพลวัตสูงมากอย่าง adaptive parsing ก็สามารถอิมพลีเมนต์ได้
  • Prolog เหมาะกับการเขียนโปรแกรมที่ขยายได้ด้วยกฎที่ผู้ใช้กำหนดเองจากทั้งโปรแกรมเมอร์คนอื่นหรือผู้ใช้ทั่วไป
    • Proloxy และ Gerrit Code Review เป็นตัวอย่างของการจัดองค์ประกอบข้อกำหนดด้วยกฎ Prolog ที่อ่านง่ายและยืดหยุ่น
  • อินเทอร์พรีเตอร์สำหรับ Prolog แบบบริสุทธิ์สามารถนิยามได้ด้วยโค้ด Prolog เพียงสองบรรทัด
  • เนื้อหาที่เกี่ยวข้องกล่าวถึงใน A Couple of Meta-interpreters in Prolog

ขอบเขตการใช้งานที่หลากหลายและกลไกโดยนัย

  • ความเป็นเชิงความสัมพันธ์ของ Prolog ทำให้โปรแกรมมีความ ยืดหยุ่นและใช้งานได้ทั่วไป
  • คุณลักษณะนี้มีบทบาทสำคัญในการแทนความรู้สำหรับ การประมวลผลภาษา และฐานข้อมูล
  • ระบบ Prolog สมัยใหม่มีความสามารถตั้งแต่ logic puzzles แบบง่ายไปจนถึงแอปพลิเคชันขนาดใหญ่
  • ความอเนกประสงค์และพลังของ Prolog มีรากฐานมาจากกลไกโดยนัยอย่าง การค้นหา การรวมเป็นหนึ่งเดียว การทำดัชนีอาร์กิวเมนต์ และการแพร่กระจายข้อจำกัด
  • นักพัฒนาจึงใช้ประโยชน์จากกลไกเหล่านี้เพื่อมอบงานจำนวนมากให้กับเอนจิน Prolog จัดการ

1 ความคิดเห็น

 
GN⁺ 2023-09-14
ความคิดเห็นจาก Hacker News
  • ผมเห็นด้วยกับความรู้สึกตรงนี้แทบทั้งหมดเลย ตอนเรียนวิชา AI ที่มหาวิทยาลัยสามวิชา เราใช้ Prolog และครอบคลุมแทบทั้งเล่ม "AI: A Modern Approach" รวมถึงการเขียนโปรแกรม Prolog ซึ่งเป็นประสบการณ์ที่ บิดวิธีคิด จริง ๆ
    เวลาจะกลับมาคิดแบบ Prolog ต้องวอร์มอัปเสมอ และในเทอมนั้นผมถึงกับเขียนโค้ดสปาเกตตีที่มีกลิ่น Prolog อย่างน่ากลัวแม้ในภาษาอื่น ๆ ด้วย ข้อเสียใหญ่ที่สุดในตอนนั้นคือ การทำงานร่วมกับระบบอื่น ค่อนข้างยุ่งยาก ต้องยัด Prolog เข้าไปใน JVM หรือใช้ implementation ที่ฟีเจอร์น้อย หรือไม่ก็พึ่งพา C binding มันยอดเยี่ยมสำหรับงานเฉพาะทาง โดยเฉพาะปัญหา constraint satisfaction แต่พอมีเรื่องอย่างอินเทอร์เฟซผู้ใช้หรือการเข้าถึงไฟล์ซิสเต็มเข้ามาปน ผมมองว่าไม่ค่อยเหมาะ ตอนนั้น SWI ก็ยังตามหลังอยู่ และเราใช้โซลูชัน proprietary อย่าง Sicstus แต่ตอนที่กลับไปดูเมื่อไม่นานนี้ SWI ไล่ทัน implementation แบบ proprietary แล้ว ถ้าเป็นตอนนี้ผมน่าจะเลือก SWI ข้อสอบ Prolog เป็นสิ่งที่น่ากลัวที่สุดในมหาวิทยาลัย: ไลฟ์โค้ดดิ้ง 3 ข้อใน 60 นาที แล้วตามด้วยสอบปากเปล่า แต่ผมใช้เวลา 40 นาทีกับข้อง่าย แล้วแก้อีกสองข้อได้ในไม่กี่นาที เลยผ่านไปได้ด้วยดี วิชาต่อเนื่องมีงานให้ทำเอเจนต์เล่นเกมแล้วแข่งกันในทัวร์นาเมนต์ ซึ่งสนุกมาก และ "The Art of Prolog" กับ "The Craft of Prolog" ก็เป็นหนึ่งในหนังสือโปรแกรมมิงที่ดีที่สุดเท่าที่ผมเคยอ่านมา

    • ผมมองว่า The Art of Prolog เป็นคัมภีร์ของการเขียนโปรแกรมแบบ dynamic typing ร่วมกับ Concepts, Techniques, and Models of Computer Programming, Paradigms of AI Programming และ Structure and Interpretation of Computer Programs
      The Craft of Prolog ก็ยอดเยี่ยมเช่นกัน แต่มีบางบทที่ล้าสมัยแล้ว เพราะเฉพาะทางกับการเขียนโปรแกรมระบบ Prolog รุ่นเก่ามากเกินไป ไอเดียจำนวนมากของ Prolog ยังมีชีวิตอยู่ใน answer set programming และ Datalog และ Datalog ก็ยอดเยี่ยมสำหรับการสร้าง static analyzer ยุคใหม่: https://arxiv.org/abs/2012.10086
    • ผมยังจำสีหน้าของนักศึกษาปริญญาตรีที่เดินออกมาหลังคาบ Prolog แรกได้อยู่เลย ครึ่งหนึ่งเหมือนช็อก อีกครึ่งเหมือนกังวล
      จู่ ๆ ก็สงสัยว่า chatbot จะรับมือกับ Prolog ได้อย่างไร เคยเห็นมามากพอไหม? จะ อนุมาน ด้วยวิธีแบบนั้นได้หรือเปล่า?
    • ผมสงสัยว่าทำไมมันถึงยากขนาดนั้น ก็แค่ depth-first search ที่กลายเป็นภาษาไม่ใช่หรือ
  • Prolog เจ๋งมาก และแค่ความสนุกจากการได้สัมผัส paradigm การเขียนโปรแกรมที่ไม่คุ้นเคยก็ทำให้คุ้มที่จะเรียนแล้ว แนวคิดจำนวนมากถูกแสดงออกในวิธีที่แตกต่างไปโดยสิ้นเชิง และพอเข้าใจ paradigm แล้ว กลับทำให้หลายอย่างเรียบง่ายขึ้นมาก
    ตัวอย่างเช่น ใน Prolog โดยทั่วไปคุณไม่ได้จัดการ collection โดยตรง แต่ให้ข้อมูลว่ารายการใน collection คืออะไร แล้วปล่อยให้ implementation คิดหาเอง การวาด dependency tree ก็ทำได้ด้วยกฎ 3 ข้อ: entity คืออะไร, จะตัดสินความสัมพันธ์ระหว่าง entity X กับ Y อย่างไร, และจะแสดงมันอย่างไร อย่างไรก็ตาม เพราะมันยาก จึงโน้มน้าวให้คนมาเรียนหรือใช้ได้ยาก และผมยังหาวิธีผสานมันเข้ากับแอปอื่นแบบลื่นไหลไม่ได้ ผมรู้ว่า FFI เป็นทางเลือกหนึ่ง แต่ยังไม่มั่นใจว่าพร้อมสำหรับ production ในช่วงไม่กี่เดือนที่ผ่านมา ผมพยายามหา alternative ของ Prolog ที่ใกล้ความเป็น “production” มากขึ้น แต่ LispWorks หรือ Franz Allegro CL แพงเกินไปและไม่เป็นมิตรต่อการ integration เท่าไร ถ้ามีตัวอย่างการผสาน Prolog เข้ากับซอฟต์แวร์สมัยใหม่ได้ดี ผมอยากรู้จริง ๆ และเพราะ XPCE ไม่ทำงานบน Mac ผมก็ยังหาโซลูชัน GUI อยู่ด้วย Swish แบบ notebook ออนไลน์ก็น่าดู: https://swish.swi-prolog.org

    • ไม่ใช่คำตอบโดยตรง แต่ David Hovell เคยใช้ Prolog เพื่อบังคับความสอดคล้องของ การตั้งค่าเครือข่าย Windows NT
      ได้ยินมาว่าตอนนี้ถูกเอาออกแล้ว จึงไม่ใช่กรณี “สมัยใหม่” แต่เป็นตัวอย่างที่สวยงามมากของการนำ Prolog ไปใช้ ไล่อ่านจาก https://news.ycombinator.com/item?id=36821871 ไปยัง https://web.archive.org/web/20030218034509/http://www.resear... แล้วคุ้มค่ามาก ลิงก์ที่เกี่ยวข้อง: https://news.ycombinator.com/item?id=14046420
    • ไม่แน่ใจว่าอันนี้เข้าข่ายไหม แต่ submit predicate ของ Gerrit เคยตั้งค่าด้วย Prolog และตอนนี้มีกำหนดจะเลิกใช้แล้ว ผลิตภัณฑ์ภายในตัวหนึ่งที่เคยทำที่ Google ถูกสร้างขึ้นโดยมี knowledge base แบบ Datalog ที่ generated จากโค้ดเป็นศูนย์กลาง และสามารถ query โดยตรงหรือให้ UI สร้าง query ให้ได้
      ทั้งสองอย่างทำงานได้ค่อนข้างดี แต่ use case จำกัด ประสบการณ์ใช้ Prolog ที่มหาวิทยาลัยนั้นสนุก แต่ถ้าไม่ใช่ปัญหาที่มีรูปร่างเป็น Prolog โดยแก่นแท้ ผมก็ไม่อยากใช้ พอเริ่ม implement อะไรที่ซับซ้อนขึ้นมานิดเดียว abstraction ก็รั่วเป็นทาง และรู้สึกเหมือนกำลังสู้กับ อัลกอริทึม backtracking มากกว่าจะได้ใช้ประโยชน์จากจุดแข็งของภาษา
    • Racket มี Racklog
      Racklog คือการฝัง logic programming แบบ Prolog ลงใน Racket และคำว่า “ฝัง” หมายความว่าคุณไม่ได้เสีย Racket ไป คุณสามารถเขียนชิ้นส่วนโค้ดแบบ Prolog เคียงข้างกับโค้ด Racket ปกติได้ มันมีฟีเจอร์ Prolog ส่วนใหญ่ รวมถึง meta-logic และ predicate “set” ระดับสอง โดยตัดออกเฉพาะฟังก์ชันที่ทำได้ง่ายกว่าและมีประสิทธิภาพกว่าด้วย subexpression ของ Racket https://docs.racket-lang.org/racklog/index.html Racket ก็มี GUI และแทบทุกอย่างที่จำเป็นอยู่แล้ว
    • ช่วงนี้ผมก็พูดแบบเดียวกันกับ CUE มันเป็นเครื่องมือที่ค่อนข้าง เขย่าวิธีคิด แต่ให้วิธีใหม่ในการจัดการความซับซ้อนของ configuration และ schema
      CUE ใส่เข้าไปใน workflow เดิมได้ง่ายกว่ามาก จึงเหมาะกับการเปลี่ยนข้อดีของ logic programming ให้ใช้งานได้จริง https://cuelang.org | https://cuetorials.com
  • เป็นเวลาหลายปีที่ผมทำซอฟต์แวร์เพิ่มประสิทธิภาพซัพพลายเชนด้วย C++ และใช้ซอฟต์แวร์ constraint propagation ของ ILOG หรือ Solver ที่ตอนนี้ IBM เป็นเจ้าของ ตอนนั้นก็เคยพิจารณา BinProlog ด้วย เพราะมี range propagation ในตัว คอมไพล์เป็น native x86 ได้ และการทำงานร่วมกับ FFI ก็ค่อนข้างดี
    แต่สุดท้ายดูเหมือนจะถูก SWI Prolog กับ GNU toolchain เบียดไปอยู่ดี ส่วน GUI น่าจะต้องมองเป็นอีกสาขาความเชี่ยวชาญหนึ่งไปเลย และเราใช้เอ็นจินเรนเดอร์ canvas ของ C++ ที่ทำเอง กับเครื่องมือพัฒนา 4GL แบบบูรณาการที่น่ากลัวชื่อ “4D” หรือ “Fourth Dimension” https://www.tomshw.it/data/images/2/0/4/3/infor-advanced-sch...

  • ภาษา Shen ของ Mark Tarver มีการอิมพลีเมนต์ Prolog แบบสมบูรณ์อยู่ด้วย: https://shenlanguage.org/SD/Prolog.html
    ยังมีบทที่เกี่ยวข้องใน The Book of Shen ด้วย: https://shenlanguage.org/TBoS/tbos_359.html Tarver ยังเขียนหนังสือเกี่ยวกับ logic programming พร้อมซอฟต์แวร์อีกสองเล่มด้วย Logic, Proof and Computation: https://shenlanguage.org/lpc.html Programming the Logic Lab: https://shenlanguage.org/logiclab.html

    • ผมชอบ Shen แต่ยังไม่ได้ลงลึกจริงจัง เคยสมัครสมาชิกเวอร์ชัน Professional อยู่ครึ่งปี และชอบอิมพลีเมนต์ของ Shen ที่สร้างอยู่บนภาษาโปรแกรมมิงหลายภาษา
      pattern matching, การตรวจสอบชนิดแบบเลือกใช้ได้ และ Prolog ในตัวนั้นน่าทึ่ง ผู้สร้างถูกชุมชนที่กว้างกว่านั้นกันออกไปส่วนหนึ่งเพราะท่าทีทางการทูตของเขา แต่เขาเก่งมาก และการนำไปใช้ก็ยังคงเป็นกลุ่มเฉพาะและล้ำหน้ามาก ถ้ามีองค์กรอย่าง Mozilla หนุนหลัง ก็น่าจะดึงดูดคนทั่วไปได้มากกว่านี้เยอะ งานนำเสนอของ @deech ตอนนี้เก่าแล้วแต่ก็ยังยอดเยี่ยมและมีความหมาย: https://www.youtube.com/watch?v=lMcRBdSdO_U, https://www.youtube.com/watch?v=BUJNyHAeAc8 แต่ผมเป็นแฟนตัวยงของ APL/J/BQN ก็ฟังโดยเผื่อใจไว้ด้วยก็ได้
  • ยังจำได้ว่าเคยเรียน Prolog ในหลักสูตรปริญญา AI + วิทยาการคอมพิวเตอร์เมื่อราว 25 ปีก่อน ใช้เยอะในโมดูลประมวลผลภาษาธรรมชาติ
    ตอนแรกอึดอัดและหงุดหงิด แต่พอคุ้นแล้วกลับสนุกอย่างไม่น่าเชื่อ และเพราะถ้าจะทำซ้ำก็มีแต่ recursion เท่านั้น จึงยอดเยี่ยมมากสำหรับการเริ่มต้นเรียน recursion ด้วย

    • สิ่งหนึ่งที่ Prolog สอนผมคือ ครูที่ยืนอยู่ในมุมของนักเรียนได้ สำคัญแค่ไหน
      ที่มหาวิทยาลัย ผมเรียน Prolog จากนักคณิตศาสตร์ที่ส่วนใหญ่ใช้แต่ภาษาประเภทนั้น และสำหรับพวกเขา Prolog เป็นวิธีคิดที่เป็นธรรมชาติมาก ในทางกลับกัน สำหรับนักเรียนที่ส่วนใหญ่ใช้แต่ภาษาเชิงกระบวนคำสั่ง มันชวนสับสนและน่าหงุดหงิด และทุกคนพยายามเขียน Prolog เหมือนภาษาอื่นจนพันกันไปหมด จนกระทั่งวิชาที่สามหรือสี่ที่ใช้ Prolog หลังจากได้ศึกษาอัลกอริทึมเบื้องหลังแล้ว วิธีใช้งานมันให้ดีถึงค่อยเข้าหัว ต่อมาผมช่วยนักศึกษาปริญญาตรีคนหนึ่งที่ลำบากกับ Prolog ประเด็นสำคัญคือไม่ใช่การพยายามทำให้ Prolog เคลื่อนที่เหมือนภาษาเดิม ๆ แต่เป็นการเปลี่ยนวิธีคิดในการแก้ปัญหาให้เข้ากับโลกของ Prolog หลังคุยกันอยู่นานพอสมควร ก็มีช่วงเวลาที่เข้าใจขึ้นมาจริง ๆ และเขาก็ทำงานส่งได้อย่างยอดเยี่ยม
    • ผมก็คล้ายกัน ตอนแรกพยายามเขียน imperative code ด้วยไวยากรณ์ของ Prolog เลยอึดอัดและหงุดหงิด
      แต่พอ paradigm ใหม่คลิกเข้าที่ในหัวแล้ว ก็กลายเป็นชอบมันมาก แค่ช่วงเวลาที่เข้าใจนั้นก็ทำให้คุ้มค่าที่ได้เรียนวิชานั้นแล้ว
    • น่าจะพูดว่า “ยอดเยี่ยมมากสำหรับการเริ่มต้นเรียน recursion เพราะมันเป็นวิธีเดียวที่จะ recurse” จะตรงกว่า
    • เมื่อไม่กี่ปีก่อน ในหลักสูตรปริญญาตรีวิทยาการคอมพิวเตอร์ก็ยังได้เรียน Prolog อยู่เหมือนกัน แม้จะไม่ใช่ส่วนใหญ่ เป็นเพียงองค์ประกอบเล็ก ๆ ของวิชา AI แต่ก็ยังสนุกดี
  • คอมเมนต์อื่น ๆ พูดถึง Prolog โดยรวม แต่ผมอยากบอกว่า The Power of Prolog เป็นชุด tutorial ที่ค่อนข้างยอดเยี่ยม
    วิดีโอก็คุ้มค่าที่จะดู และ Markus ก็รักษาความสนใจของผู้ชมกับผู้อ่านไว้ได้ดี

    • ในฐานะคนที่เคยผิดหวังกับ Prolog ตอนแรก แล้วภายหลังได้ “เข้าใจแจ่มแจ้ง” ผมขอแนะนำให้เริ่มจากวิดีโอของ Markus เรื่อง Preparing Prolog: https://www.metalevel.at/prolog/videos/preparing_prolog
      วิดีโอนี้ทำให้ผมยอมรับ Prolog ว่าเป็นความเคลื่อนไหวที่ยังดำเนินอยู่และก้าวหน้าในวงการโปรแกรมมิง
  • Prolog เป็นภาษาที่งดงาม ผมเคยเขียนมาเป็นหมื่น ๆ บรรทัดสำหรับการให้เหตุผลเชิงคณิตศาสตร์ การให้เหตุผลแบบอิงกฎ และอื่น ๆ และมันเข้ากับโดเมนเหล่านั้นได้อย่างสมบูรณ์แบบ อีกทั้งทำงานกับมันก็สนุกมาก
    สำหรับแอปพลิเคชันประเภทอื่นมีปัญหาสองอย่าง อย่างแรก paradigm ต่างกันมากจนเข้ากับ ไลบรารีและภาษาอื่น ได้ไม่ดี อย่างที่สอง การทำ GUI ที่ดีแทบเป็นไปไม่ได้ ซึ่งก็เพราะมันไม่เข้ากับ paradigm เช่นกัน

    • ผมเคยมีส่วนร่วมในการเขียนส่วน interoperability กับ Go ของ GoLog และการ interface กับภาษาอื่นก็ไม่ได้ยากเป็นพิเศษ
      โดยทั่วไป ฝั่ง Prolog จะมอง external interface เหมือน predicate ที่ทุก argument ถูก ground แล้ว ส่วนฝั่งภายนอกจะโต้ตอบกับ Prolog เหมือนจัดการฐานข้อมูล SQL คือส่ง query แยก query ขอ solution เพิ่ม หรือขับเคลื่อน backtracking การโต้ตอบแบบนี้อาจเรียกว่า “ไม่น่าสนใจ” ได้ แต่มันทำงานแบบนั้นเพราะไลบรารีไม่ได้ใช้ประโยชน์จากฟีเจอร์ที่มีประโยชน์ของ Prolog จริง ๆ ถ้าต้องการ ก็สร้าง interoperability layer ที่หนาขึ้นได้ และรวมฟังก์ชันไลบรารีหลายตัวให้เป็น interface แบบ predicate เดียวในฝั่ง Prolog จากนั้นให้เรียก subroutine เฉพาะตามโหมดการ instantiate ของ argument ได้ แต่นี่ก็ไม่ได้ต่างจากการนำ C library ไปเปิดให้ภาษาเชิงวัตถุอย่าง Python ใช้ โดยผูกฟังก์ชัน C หลายตัวเข้าด้วยกันให้ดูเหมือน accessor ของ property หรือ method ของ data structure มากนัก
  • ผมใช้ Prolog อย่างจริงจังกับงานวิเคราะห์ข้อมูล ตอนแรกต้องมีช่วงที่ผลักดันตัวเองให้ทำทุกอย่างที่ทำได้ด้วย Prolog เพื่อทำความเข้าใจวิธีเปลี่ยนคำถามให้เป็น ปัญหาเชิงสัญลักษณ์

เพราะ Prolog รองรับการคำนวณเชิงวิทยาศาสตร์และการจัดการสตริงได้แย่มาก แต่ถ้าผ่านขั้นนั้นไปแล้ว วิธีแก้ปัญหาด้วย Prolog มักจะสง่างามกว่าทางเลือกที่ดีรองลงมา นอกจากนี้ เพราะเป็นพาราไดม์เชิงตรรกะ จึงคุ้มค่าที่จะใช้เวลาทำความเข้าใจว่า การพิสูจน์ด้วยการปฏิเสธ + การทำให้เป็นหนึ่งเดียว = การเขียนโปรแกรมเชิงตรรกะ ได้อย่างไร ในบรรดาภาษาโปรแกรมที่ผมเคยเรียนมา นี่เป็นภาษาที่เปิดมุมมองได้มากที่สุดอย่างไม่ต้องสงสัย

  • การรองรับการจัดการสตริงของ Prolog ถือว่าดีทีเดียว มีภาษาแบบสมัยใหม่ที่ได้รับความนิยมไม่กี่ภาษาที่มีสิ่งอย่าง DCG มาให้เป็นพื้นฐาน
    Prolog มาตรฐานไม่มี regex ติดตั้งมาให้ในตัว แต่ implementation ยอดนิยมมักมีไลบรารีสำหรับเรื่องนี้ ถ้าต้องทำงานกับสตริงเยอะ ๆ และต้องเลือกระหว่าง C กับ Prolog ผมเลือก Prolog แน่นอน ถ้าเป็น Python กับ Prolog ก็ขึ้นอยู่กับงาน
  • น่าสนใจนะ ช่วยยกตัวอย่างได้ไหมว่าเอาไปใช้กับการวิเคราะห์ข้อมูลอย่างไร?
  • มีการคุยกันไปแล้วเมื่อ 1 ปีก่อน: https://news.ycombinator.com/item?id=31641014
    ไม่ว่าอย่างไร ก็เป็นไซต์ที่ยอดเยี่ยม และดีใจที่หัวข้อนี้กลับมาถูกหยิบขึ้นมาอีก
  • โค้ด 10 บรรทัดที่ผมเขียนเพื่อ implement การค้นหากราฟ A* ด้วย Prolog เป็นโค้ด 10 บรรทัดที่ยากที่สุดในชีวิตผม
  • ตอนเรียนมหาวิทยาลัย ผมเคยลงเรียนวิชา Prolog ต้อง implement ตัวแก้ Sudoku แล้วก็ติดอยู่จุดหนึ่ง
    ก่อนหน้านั้นผมเคยเขียนตัวแก้ด้วย Java มาก่อน เลยพยายามย้ายโค้ดนั้นมาเป็น Prolog แต่ใช้ไม่ได้เลย สุดท้ายจึงเริ่มใหม่ตั้งแต่ต้น เขียนโค้ด Prolog ง่าย ๆ เพื่อตรวจว่า Sudoku ถูกต้องหรือไม่ แล้วก็รู้ว่าถ้ารัน predicate เหล่านั้น ก็สามารถแก้ Sudoku ได้ด้วย แบบนั้นเองจึงทำตัวแก้เสร็จในไม่ถึง 10 บรรทัด มันเป็นช่วงเวลาแบบยูเรกาอย่างแท้จริง และ Prolog ทรงพลังมาก แต่ในงานจริงกลับถูกใช้น้อยเกินไปอย่างไม่เป็นธรรม โชคดีที่ผมยังมีโอกาสได้ลองใช้ Datalog กับ OWL