วิธีการใช้ล่ามอารัมภบทในภาษาที่ใช้งานได้จริง?


25

มีการอ้างอิงที่ชัดเจนด้วยการใช้รหัสหลอกเกี่ยวกับวิธีดำเนินการเกี่ยวกับการใช้ล่าม Prolog ในภาษาที่ใช้งานได้จริงหรือไม่? สิ่งที่ฉันได้พบจนถึงตอนนี้ดูเหมือนจะจัดการเฉพาะกับภาษาที่จำเป็นเท่านั้นเป็นเพียงการสาธิตของ Prolog ที่นำมาใช้ในตัวเองหรือไม่มีอัลกอริทึมที่เป็นรูปธรรมที่จะใช้สำหรับการตีความ ฉันจะซาบซึ้งมากกับคำตอบ


4
การใช้ Prolog (ชุด Princeton ในสาขาวิทยาศาสตร์คอมพิวเตอร์) โดย Patrice Boizumault มีการนำ Lisp มาใช้
Will Ness

ดูคำตอบนี้สำหรับวิธีการที่ค่อนข้างใหม่
เท็จ

คำตอบ:


24

ตั้งแต่Prolog = Syntactic Unification + การโยงย้อนกลับ + REPL

ทั้งสามส่วนสามารถพบได้ในปัญญาประดิษฐ์: โครงสร้างและกลยุทธ์สำหรับการแก้ปัญหาที่ซับซ้อนโดย George F. Luger ในฉบับที่สี่ของหนังสือทั้งสามส่วนมีการใช้งานในLISPในส่วนที่ 15.8 การเขียนโปรแกรมลอจิกใน LISP เขายังใส่รหัสเดิมลงในหนังสือเล่มอื่นของเขาด้วย แต่ฉันไม่มีทั้งหมดที่จะสังเกตได้ที่นี่ สำหรับหนังสือของเขาที่สามารถพบได้ที่นี่

แหล่งอื่นที่มีทั้งหมดสามส่วนสามารถพบได้ในกระบวนทัศน์ของการเขียนโปรแกรมปัญญาประดิษฐ์: กรณีศึกษาใน Common LISPโดย Peter Norvig ดูบทที่ 11, การเขียนโปรแกรมลอจิกและ 12, การรวบรวมโปรแกรมลอจิก สำหรับหนังสือของเขาที่สามารถพบได้ที่นี่

อีกแหล่งหนึ่งคือโครงสร้างและการตีความของโปรแกรมคอมพิวเตอร์โดย Hal Abelson, Jerry Sussman และ Julie Sussman ดูหัวข้อ 4.4 การเขียนโปรแกรมลอจิก เว็บไซต์สำหรับหนังสือเล่มนี้คือที่นี่และรหัสสำหรับหนังสือเล่มนี้เป็นที่นี่

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

สำหรับ Prolog รุ่นหนึ่งให้ใช้ REPL น้อยกว่าทำใน OCaml ดูรหัสและแหล่งข้อมูลสำหรับ "คู่มือตรรกะเชิงปฏิบัติและการใช้เหตุผลอัตโนมัติ" - prolog.ml

แปลรหัสหนังสือไป F # สามารถพบได้ที่นี่ แปลรหัสหนังสือเพื่อ Haskell สามารถพบได้ที่นี่

ในแง่ของการค้นหารหัสอัลกอริทึมการรวมนั้นง่ายที่สุดในการค้นหาจากนั้นการใช้งานที่มีการผูกมัดด้านหลังฝังอยู่ในแอปพลิเคชัน การค้นหาการนำ Prolog ไปใช้งานได้อย่างสมบูรณ์ในภาษาที่ใช้งานได้ด้วย REPL นั้นยากที่สุด ส่วนใหญ่รหัสไม่ได้อยู่ในรูปแบบสำหรับใช้โดยตรงภายใน PROLOG; มันถูกปรับแต่งอย่างหนักเพื่อเพิ่มประสิทธิภาพดังนั้นคุณอาจพบรหัส แต่มันจะไม่คุ้มค่ากับราคาที่จะแซวชิ้นส่วนที่คุณต้องการ คำแนะนำของฉันคือการอ่านหนังสือของ Luger และสร้างมันขึ้นมาใหม่ในภาษาที่คุณเลือกแม้ว่าจะหมายถึงการติดตั้งและเรียนรู้ LISP และการแปลเพื่อทำเช่นนั้น

แก้ไข

เนื่องจากนี่เป็นคำถามที่ซ้ำกันจากStackOverflowและ OP เป็นของใหม่และในความคิดเห็นพูดว่า:

เพื่อให้บริบทเพิ่มเติมฉันพยายามใช้การอนุมานประเภท แต่คุณลักษณะที่สลับซับซ้อนในระบบประเภทของภาษาของฉัน (ประเภทที่ขึ้นอยู่กับประเภทการปรับแต่งการพิมพ์เชิงเส้นเพื่อตั้งชื่อสามัญน้อยกว่าสองสาม) ทำให้ฉันรู้สึกว่ามันจะ มีประโยชน์ในการอนุมานประเภทของฉันจากอัลกอริธึมที่ใช้ Prolog เพื่อให้ได้อัลกอริทึมทั่วไป ฉันจะทราบว่าฉันสอนตัวเองทั้งหมดดังนั้นความรู้ของฉันจึงขาดไปในหลาย ๆ ด้าน

ฉันจะขยายที่นี่ แต่ตระหนักถึง OP ควรถามคำถามใหม่

สำหรับสิ่งบทนำบางคนเห็นว่าการดำเนินการอนุมานชนิด

หนังสือที่ดีที่สุดที่ฉันรู้จักในเรื่องนี้คือประเภทและภาษาการเขียนโปรแกรมโดย Benjamin C. Pierce เว็บไซต์ของหนังสือเล่มนี้คือที่นี่ ทรัพยากรที่มีการเชื่อมโยงกับโค้ด OCaml เป็นที่นี่ และเพิ่งเริ่มต้น แต่การแปลส่วนใหญ่ที่สมบูรณ์ของการนี้เพื่อ F # เป็นที่นี่

ประเภทที่อ้างถึง: pg 462 ประเภทการปรับแต่ง: pg 207 ตรรกะเชิงเส้นและระบบพิมพ์: หน้า 109


1
Guy Coder คุณเป็นสุภาพบุรุษและเป็นนักวิชาการ! ความช่วยเหลือของคุณมีประโยชน์มากที่สุดและฉันไม่สามารถขอบคุณได้มากพอที่ใช้เวลาตอบคำถามนี้จริง ๆ = D - ผู้ทำงานร่วมกันของ Jimster และเพื่อนเบื่องานวิจัย
Shenzao

ฉันขอขอบคุณอีกครั้งฉันได้รับหนังสือเหล่านี้แล้ว (นั่นคือก่อนหน้านี้ไม่ใช่ในการเดินทางไปร้านหนังสืออย่างรวดเร็ว)
Jimster

@Jimster รหัส Norvig ของดีและชัดเจนพอดีในหน้า IIRC จำไม่ได้ แต่ถ้ามันบริสุทธิ์
Will Ness


ที่น่าสนใจ: unify_P3.pyซึ่งเป็นส่วนหนึ่งของการบ้าน 2
Guy Coder

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.