อ่าน 24 นาที
บทนำ
Prolog เป็น ภาษา การเขียนโปรแกรมเชิงตรรกะ ที่มีต้นกำเนิดมาจาก ปัญญาประดิษฐ์ การ พิสูจน์ทฤษฎีบทอัตโนมัติ และ ภาษาศาสตร์เชิง คำนวณ [ 1 ] [ 2 ] [ 3 ]
บทนำ
| บทนำ | |
|---|---|
| กระบวนทัศน์ | ตรรกะ |
| ออกแบบโดย | อลัน โคลเมอราเออร์ |
| ปรากฏครั้งแรก | พ.ศ. 2515 |
| เวอร์ชันเสถียร | ส่วนที่ 1: เนื้อหาหลักทั่วไป - ฉบับที่ 1 (มิถุนายน 2538 ) ส่วนที่ 2: โมดูล - ฉบับที่ 1 (มิถุนายน 2543 ) ส่วนที่ 3: กฎไวยากรณ์ของอนุประโยคเจาะจง (มิถุนายน 2568 ) |
| วินัยในการพิมพ์ | ไม่มีประเภทข้อมูล (ประเภทข้อมูลเดียวของมันคือ "term") |
| นามสกุลไฟล์ | .pl, .pro,.P |
| เว็บไซต์ | ส่วนที่1 : www.iso.org/standard/21413.html ส่วนที่2 |
| การนำไปใช้งานหลักๆ | |
| Amzi! Prolog , B-Prolog , Ciao , ECLiPSe , GNU Prolog , LPA Prolog , Poplog , P# , Quintus Prolog , Scryer Prolog , SICStus , Strawberry , SWI-Prolog , Tau Prolog , tuProlog , WIN-PROLOG XSB , YAP . | |
| ภาษาถิ่น | |
| ISO Prolog , Edinburgh Prolog | |
| ได้รับอิทธิพลจาก | |
| นักวางแผน | |
| ได้รับอิทธิพล | |
| CHR , Clojure , Datalog , Erlang , Epilog , KL0 , KL1 , Logtalk , Mercury , Oz , Strand , Visual Prolog | |
Prologเป็น ภาษา การเขียนโปรแกรมเชิงตรรกะที่มีต้นกำเนิดมาจากปัญญาประดิษฐ์การพิสูจน์ทฤษฎีบทอัตโนมัติและภาษาศาสตร์เชิงคำนวณ[ 1 ] [ 2 ] [ 3 ]
Prolog มีรากฐานมาจากตรรกะลำดับที่หนึ่งซึ่งเป็นตรรกะเชิงรูปธรรม แตกต่างจาก ภาษาโปรแกรมอื่นๆ หลาย ภาษา Prolog มีจุดประสงค์หลักเป็น ภาษา โปรแกรมเชิงประกาศ : โปรแกรมคือชุดของข้อเท็จจริงและกฎซึ่งกำหนดความสัมพันธ์การคำนวณจะเริ่มต้นโดยการเรียกใช้คำถามกับโปรแกรม[ 4 ]
Prolog เป็นหนึ่งในภาษาการเขียนโปรแกรมเชิงตรรกะภาษาแรกๆ[ 5 ]และยังคงเป็นภาษาประเภทนี้ที่ได้รับความนิยมมากที่สุดในปัจจุบัน โดยมีการใช้งานทั้งแบบฟรีและเชิงพาณิชย์หลายเวอร์ชัน ภาษานี้ถูกนำไปใช้ในการพิสูจน์ทฤษฎีบท [ 6 ] ระบบผู้เชี่ยวชาญ[ 7 ] การเขียนเทอมใหม่[ 8 ] ระบบประเภท[ 9 ] การวางแผนอัตโนมัติ[ 10 ]และการตอบคำถาม[ 11 ] [ 12 ] [ 13 ]รวมถึงสาขาการใช้งานดั้งเดิมที่ตั้งใจไว้คือการประมวลผลภาษาธรรมชาติ[ 14 ] [ 11 ]
Prolog เป็น ภาษาโปรแกรมอเนกประสงค์ ที่สมบูรณ์แบบตามทฤษฎีบททัวริง ซึ่งเหมาะอย่างยิ่งสำหรับแอปพลิเคชันการประมวลผลความรู้เชิงอัจฉริยะ
ประวัติศาสตร์
| ปี | เอ็กซ์-มาร์เซย์ | มาตรฐาน ISO/IEC |
|---|---|---|
| พ.ศ. 2515 | บทนำ 0 | ไม่มีข้อมูล |
| พ.ศ. 2516 | บทนำ I | ไม่มีข้อมูล |
| พ.ศ. 2525 | บทนำ II | ไม่มีข้อมูล |
| 1990 | บทนำที่ 3 | ไม่มีข้อมูล |
| พ.ศ. 2538 | ไม่มีข้อมูล | 13211-1:1995 |
| พ.ศ. 2539 | บทนำ IV | ไม่มีข้อมูล |
| 2000 | ไม่มีข้อมูล | 13211-2:2000 |
| 2007 | ไม่มีข้อมูล | 13211-1:1995/Cor 1:2007 |
| 2012 | ไม่มีข้อมูล | 13211-1:1995/Cor 2:2012 |
| 2017 | ไม่มีข้อมูล | 13211-1:1995/Cor 3:2017 |
| 2025 | ไม่มีข้อมูล | 13211-3:2025 |

ชื่อPrologถูกเลือกโดย Philippe Roussel ตามคำแนะนำของภรรยาของเขา โดยเป็นคำย่อของProgrammation en logique (ภาษาฝรั่งเศสแปลว่าการเขียนโปรแกรมด้วยตรรกะ ) [ 15 ]มันถูกสร้างขึ้นราวปี 1972 โดยAlain Colmerauerร่วมกับ Philippe Roussel จากกลุ่มปัญญาประดิษฐ์ของคณะวิทยาศาสตร์ Luminyแห่งมหาวิทยาลัย Aix-Marseille IIประเทศฝรั่งเศส มันมีพื้นฐานมาจาก การตีความ เชิง กระบวนการของ Horn clausesของRobert Kowalskiและได้รับแรงบันดาลใจส่วนหนึ่งจากความปรารถนาที่จะประสานการใช้ตรรกะในฐานะภาษาการแสดงความรู้เชิงประกาศกับการแสดงความรู้เชิงกระบวนการที่ได้รับความนิยมในอเมริกาเหนือในช่วงปลายทศวรรษ 1960 และต้นทศวรรษ 1970 ตามที่Robert Kowalski กล่าว ระบบ Prolog ระบบแรกได้รับการพัฒนาในปี 1972 โดย Colmerauer และ Phillipe Roussel [ 16 ] [ 17 ] [ 18 ]การใช้งาน Prolog ครั้งแรกคือตัวแปลภาษาที่เขียนด้วยภาษา Fortranโดย Gerard Battani และ Henri Meloni David HD Warrenได้นำตัวแปลภาษานี้ไปที่มหาวิทยาลัย Edinburghและได้นำส่วนหน้าทางเลือกมาใช้ ซึ่งต่อมาได้กำหนดไวยากรณ์ " Edinburgh Prolog " ที่ใช้โดยการใช้งานสมัยใหม่ส่วนใหญ่ Warren ยังได้นำคอมไพเลอร์ตัวแรกสำหรับ Prolog มาใช้ โดยสร้าง DEC-10 Prolog ที่ทรงอิทธิพลร่วมกับ Fernando Pereira ต่อมา Warren ได้ขยายแนวคิดเบื้องหลัง DEC-10 Prolog เพื่อสร้างWarren Abstract Machine ( WAM )
นักวิจัย AI ในยุโรปนิยมใช้ Prolog ในขณะที่ชาวอเมริกันนิยมใช้Lispซึ่งรายงานว่าก่อให้เกิดการถกเถียงเชิงชาตินิยมมากมายเกี่ยวกับข้อดีของภาษา[ 19 ]การพัฒนา Prolog ในยุคปัจจุบันส่วนใหญ่มาจากแรงผลักดันของโครงการ Fifth Generation Computer Systems (FGCS) ซึ่งได้พัฒนา Prolog เวอร์ชันหนึ่งชื่อKernel Languageสำหรับระบบปฏิบัติการแรก
เดิมที Pure Prolog ถูกจำกัดให้ใช้เฉพาะตัว พิสูจน์ทฤษฎีบท การแก้ปัญหาที่มีHorn clausesในรูปแบบ:
H :- B 1 , ..., B n .
การประยุกต์ใช้โปรแกรมพิสูจน์ทฤษฎีบทจะถือว่าข้อความดังกล่าวเป็นกระบวนการ:
เพื่อแสดง/แก้ H, แสดง/แก้ B 1และ ... และB n
อย่างไรก็ตาม ในเวลาต่อมา Prolog บริสุทธิ์ได้รับการขยายเพิ่มเติมเพื่อรวมการปฏิเสธในรูปแบบของความล้มเหลวซึ่งเงื่อนไขเชิงลบในรูปแบบ not(B i ) จะแสดงออกมาโดยการพยายามและล้มเหลวในการแก้ปัญหาเงื่อนไขเชิงบวก B iที่ สอดคล้องกัน
การพัฒนาต่อยอดของ Prolog ในภายหลังโดยทีมงานดั้งเดิมได้นำ ความสามารถ ในการเขียนโปรแกรมเชิงตรรกะแบบมีข้อจำกัด มาใช้ ในการใช้งานได้
ผลกระทบ
แม้ว่า Prolog จะถูกใช้กันอย่างแพร่หลายในการวิจัยและการศึกษา[ 20 ]แต่ Prolog และภาษาการเขียนโปรแกรมเชิงตรรกะอื่นๆ ก็ไม่ได้มีผลกระทบอย่างมีนัยสำคัญต่ออุตสาหกรรมคอมพิวเตอร์โดยทั่วไป[ 21 ]แอปพลิเคชันส่วนใหญ่มีขนาดเล็กเมื่อเทียบกับมาตรฐานอุตสาหกรรม โดยมีเพียงไม่กี่แอปพลิเคชันที่มีโค้ดเกิน 100,000 บรรทัด[ 21 ] [ 22 ]การเขียนโปรแกรมขนาดใหญ่ถือว่าซับซ้อน เนื่องจากคอมไพเลอร์ Prolog บางตัวไม่รองรับโมดูล และยังมีปัญหาความเข้ากันได้ระหว่างระบบโมดูลของคอมไพเลอร์ Prolog หลักๆ[ 23 ]การพกพาโค้ด Prolog ข้ามการใช้งานก็เป็นปัญหาเช่นกัน แต่การพัฒนาตั้งแต่ปี 2007 หมายความว่า: "การพกพาภายในตระกูลการใช้งาน Prolog ที่ได้มาจาก Edinburgh/Quintus นั้นดีพอที่จะช่วยให้สามารถรักษาแอปพลิเคชันในโลกแห่งความเป็นจริงที่พกพาได้" [ 24 ]
ซอฟต์แวร์ที่พัฒนาด้วย Prolog ได้รับการวิพากษ์วิจารณ์ว่ามีประสิทธิภาพการทำงานต่ำกว่าภาษาโปรแกรมทั่วไป โดยเฉพาะอย่างยิ่ง กลยุทธ์การประเมินแบบไม่แน่นอนของ Prolog อาจเป็นปัญหาเมื่อเขียนโปรแกรมการคำนวณแบบแน่นอน หรือแม้กระทั่งเมื่อใช้ "ความไม่แน่นอนแบบไม่สนใจ" (ซึ่งเลือกเพียงครั้งเดียวแทนที่จะย้อนกลับไปพิจารณาความเป็นไปได้ทั้งหมด) อาจต้องใช้ cuts และโครงสร้างภาษาอื่นๆ เพื่อให้ได้ประสิทธิภาพที่ต้องการ ซึ่งทำลายจุดเด่นหลักอย่างหนึ่งของ Prolog คือความสามารถในการรันโปรแกรม "ไปข้างหน้าและข้างหลัง" [ 25 ]
Prolog ไม่ใช่ภาษาเชิงประกาศโดยสมบูรณ์: เนื่องจากโครงสร้างต่างๆ เช่นตัวดำเนินการ cutการอ่านโปรแกรม Prolog ในเชิงกระบวนการจึงจำเป็นต่อการทำความเข้าใจ[ 26 ]ลำดับของข้อความในโปรแกรม Prolog มีความสำคัญ เนื่องจากกลยุทธ์การดำเนินการของภาษานั้นขึ้นอยู่กับลำดับดังกล่าว[ 27 ]ภาษาการเขียนโปรแกรมเชิงตรรกะอื่นๆ เช่นDatalog เป็นภาษาเชิงประกาศอย่างแท้จริง แต่มีข้อจำกัดของภาษา ส่งผลให้โปรแกรม Prolog ที่ใช้งานได้จริงจำนวนมากถูกเขียนขึ้นเพื่อให้สอดคล้องกับลำดับ การค้นหาแบบ depth-firstของ Prolog มากกว่าที่จะเป็นโปรแกรมเชิงตรรกะเชิงประกาศโดยสมบูรณ์[ 25 ]
ใช้ในอุตสาหกรรม
Prolog ถูกนำมาใช้ในWatson Watson ใช้ซอฟต์แวร์ DeepQA ของ IBM และเฟรมเวิร์ก Apache UIMA (Unstructured Information Management Architecture) ระบบนี้เขียนด้วยภาษาต่างๆ รวมถึง Java, C++และ Prolog และทำงานบน ระบบปฏิบัติการ SUSE Linux Enterprise Server 11 โดยใช้ เฟรมเวิร์ก Apache Hadoopเพื่อให้การประมวลผลแบบกระจาย Prolog ถูกใช้สำหรับการจับคู่รูปแบบบนโครงสร้างต้นไม้การวิเคราะห์ภาษาธรรมชาติ นักพัฒนาได้กล่าวว่า: "เราต้องการภาษาที่สามารถแสดงกฎการจับคู่รูปแบบบนโครงสร้างต้นไม้การวิเคราะห์และคำอธิบายประกอบอื่นๆ (เช่น ผลลัพธ์การจดจำเอนทิตีที่มีชื่อ) ได้อย่างสะดวก และเทคโนโลยีที่สามารถดำเนินการตามกฎเหล่านี้ได้อย่างมีประสิทธิภาพ เราพบว่า Prolog เป็นตัวเลือกที่เหมาะสมที่สุดสำหรับภาษานี้เนื่องจากความเรียบง่ายและความสามารถในการแสดงออก " [ 11 ] Prolog กำลังถูกใช้ในแพลตฟอร์มการพัฒนา Low-Code GeneXusซึ่งมุ่งเน้นไปที่ AI ฐานข้อมูลกราฟโอ เพนซอร์ส TerminusDBถูกนำไปใช้ใน Prolog [ 28 ] TerminusDB ได้รับการออกแบบมาเพื่อการสร้างและดูแลกราฟ ความรู้ ร่วมกัน
ไวยากรณ์และความหมาย
ใน Prolog ตรรกะของโปรแกรมจะแสดงในรูปของความสัมพันธ์ และการคำนวณจะเริ่มต้นโดยการเรียกใช้แบบสอบถามบนความสัมพันธ์เหล่านี้ ความสัมพันธ์และแบบสอบถามถูกสร้างขึ้นโดยใช้ประเภทข้อมูลเดียวของ Prolog คือเทอม[ 4 ] ความสัมพันธ์ถูกกำหนดโดยข้อความย่อยเมื่อได้รับแบบสอบถาม กลไกของ Prolog จะพยายามหาการหักล้างการแก้ไข ของแบบสอบถามที่ถูกปฏิเสธ หากแบบสอบถามที่ถูกปฏิเสธสามารถหักล้างได้ กล่าวคือ พบการกำหนดค่าสำหรับตัวแปรอิสระทั้งหมดที่ทำให้การรวมกันของข้อความย่อยและเซตเดี่ยวที่ประกอบด้วยแบบสอบถามที่ถูกปฏิเสธเป็นเท็จ แสดงว่าแบบสอบถามดั้งเดิมพร้อมกับการกำหนดค่าที่พบนั้นเป็นผลลัพธ์เชิงตรรกะของโปรแกรม สิ่งนี้ทำให้ Prolog (และภาษาการเขียนโปรแกรมเชิงตรรกะอื่นๆ) มีประโยชน์อย่างยิ่งสำหรับฐานข้อมูลคณิตศาสตร์เชิงสัญลักษณ์และแอปพลิเคชันการแยกวิเคราะห์ภาษา เนื่องจาก Prolog อนุญาตให้มี述语ที่ไม่บริสุทธิ์ การตรวจสอบค่าความจริงของ述语พิเศษบางอย่างอาจมีผลข้าง เคียงโดยเจตนา เช่น การพิมพ์ค่าลงบนหน้าจอ ด้วยเหตุนี้ โปรแกรมเมอร์จึงได้รับอนุญาตให้ใช้การเขียนโปรแกรมเชิงคำสั่ง แบบดั้งเดิมในระดับหนึ่ง เมื่อรูปแบบตรรกะไม่สะดวก Prolog มีส่วนย่อยที่เป็นตรรกะล้วนๆ เรียกว่า "Prolog บริสุทธิ์" รวมถึงคุณสมบัติอื่นๆ ที่อยู่นอกเหนือตรรกะอีกจำนวนหนึ่ง
ประเภทข้อมูล
ประเภทข้อมูลเดียวของ Prolog คือเทอมเทอมอาจเป็นอะตอมตัวเลขตัวแปรหรือเทอมประกอบ [ หมายเหตุ1 ]
- อะตอมคือชื่อสัญลักษณ์ที่ขึ้นต้นด้วยตัวอักษรพิมพ์เล็กหรืออยู่ในเครื่องหมายอัญประกาศ ตัวอย่างของอะตอมได้แก่, , , ,และ.
xred'Taco''some atom''p(a)' - ตัวเลขอาจเป็นจำนวนทศนิยมหรือจำนวนเต็มระบบ Prolog หลักส่วนใหญ่รองรับจำนวนเต็มที่มีความยาวไม่จำกัด
- ตัวแปรถูกกำหนดโดยสตริงที่ประกอบด้วยตัวอักษร ตัวเลข และเครื่องหมายขีดล่าง โดยเริ่มต้นด้วยตัวอักษรพิมพ์ใหญ่หรือเครื่องหมายขีดล่างตัวพิมพ์ใหญ่ ตัวแปรมีความคล้ายคลึงกับตัวแปรในตรรกศาสตร์ตรงที่เป็นตัวแทนสำหรับคำศัพท์ใดๆ
- เทอมประกอบ (Compound term)ประกอบด้วยอะตอมที่เรียกว่า "ฟังก์ชันเตอร์" (functor) และ "อาร์กิวเมนต์" จำนวนหนึ่ง ซึ่งก็คือเทอมอีกตัวหนึ่ง เทอมประกอบมักเขียนในรูปฟังก์ชันเตอร์ ตามด้วยรายการเทอมอาร์กิวเมนต์ที่คั่นด้วยเครื่องหมายจุลภาค ซึ่งอยู่ในวงเล็บ จำนวนอาร์กิวเมนต์เรียกว่าอาร์ริตี (arity ) ของเทอม อะตอมสามารถถือได้ว่าเป็นเทอมประกอบที่มีอาร์ริตีเป็นศูนย์ ตัวอย่างของเทอมประกอบคือ
person_friends(zelda,[tom,jim]).
กรณีพิเศษของคำประสม:
- รายการ(List)คือกลุ่มของคำที่เรียงลำดับ โดยใช้เครื่องหมายวงเล็บเหลี่ยมแทน คั่นด้วยเครื่องหมายจุลภาค หรือในกรณีที่เป็นรายการว่าง จะใช้เครื่องหมายจุด (.) แทน
[]เช่น[1,2,3,4]หรือ[red,green,blue]. - สตริง : ลำดับของอักขระที่ล้อมรอบด้วยเครื่องหมายอัญประกาศเทียบเท่ากับรายการรหัสอักขระ (ตัวเลข) รายการอักขระ (อะตอมที่มีความยาว 1) หรืออะตอม ขึ้นอยู่กับค่าของแฟล็ก Prolog ตัวอย่าง
double_quotesเช่น"to be, or not to be"[ 29 ]
กฎและข้อเท็จจริง
โปรแกรม Prolog อธิบายความสัมพันธ์ที่กำหนดโดยใช้ข้อความย่อย (clauses) Prolog บริสุทธิ์ถูกจำกัดให้ใช้เฉพาะข้อความย่อยแบบ Hornเท่านั้น ข้อความย่อยแบบ Horn สองประเภทที่ใช้ในการกำหนดโปรแกรม Prolog ได้แก่ กฎ (rules) และข้อเท็จจริง (facts) กฎมีรูปแบบดังนี้
ศีรษะ:- ลำตัวและอ่านได้ว่า "ส่วนหัวเป็นจริงถ้าส่วนเนื้อหาเป็นจริง" ส่วนเนื้อหาของกฎประกอบด้วยการเรียกใช้述语 (predicate) ซึ่งเรียกว่าเป้าหมาย ของกฎ ตัว ดำเนินการตรรกะ ในตัว,/2(หมายถึงตัวดำเนินการที่มี อาร์กิวเมนต์ 2 ตัว และชื่อ,) แสดงถึงการเชื่อมโยงเป้าหมาย และ;/2แสดงถึงการแยกเป้าหมายการเชื่อมโยงและการแยกเป้าหมายสามารถปรากฏได้เฉพาะในส่วนเนื้อหาเท่านั้น ไม่สามารถปรากฏในส่วนหัวของกฎได้
ประโยคที่มีเนื้อหาว่างเปล่าเรียกว่าข้อเท็จจริงตัวอย่างของข้อเท็จจริงคือ:
มนุษย์( โสกราตีส)ซึ่งเทียบเท่ากับกฎ:
มนุษย์( โสกราตีส) :- ถูกต้องเงื่อนไขในตัวนั้นtrue/0เป็นจริงเสมอ
จากข้อเท็จจริงข้างต้น เราอาจตั้งคำถามได้ว่า:
โสกราตีสเป็นมนุษย์หรือไม่?
?- มนุษย์( โสกราตีส) ใช่มนุษย์คืออะไร?
?- มนุษย์( X ) . X = โสกราตีสประโยคย่อยที่มีเนื้อหาเรียกว่ากฎตัวอย่างของกฎคือ:
มนุษย์( X ) :- มนุษย์( X )ถ้าเราเพิ่มกฎนั้นเข้าไป แล้วถามว่าอะไรบ้างที่เป็นสิ่งมีชีวิตที่ต้องตาย?
?- มนุษย์( X ) X = โสกราตีส述語และโปรแกรม
เพรดิเคต (หรือนิยามกระบวนการ ) คือกลุ่มของประโยคย่อยที่มีหัวประโยคชื่อเดียวกันและจำนวนสมาชิกเท่ากัน เราใช้สัญลักษณ์ชื่อ/จำนวนสมาชิกเพื่ออ้างถึงเพรดิเคตโปรแกรมตรรกะคือเซตของเพรดิเคต ตัวอย่างเช่น โปรแกรม Prolog ต่อไปนี้ ซึ่งกำหนดความสัมพันธ์ในครอบครัวบางอย่าง มีเพรดิเคตสี่ตัว:
แม่_ลูก( ทรูด, แซลลี่)พ่อลูก( ทอม, แซลลี่) พ่อลูก( ทอม, เอริกา) พ่อลูก( ไมค์, ทอม)พี่น้อง( X , Y ) :- พ่อแม่ลูก( Z , X ), พ่อแม่ลูก( Z , Y ), ไม่( X = Y )parent_child ( X , Y ) :- father_child ( X , Y ). parent_child ( X , Y ) :- mother_child ( X , Y ).ภาคแสดงfather_child/2มีสามประโยคย่อย ซึ่งทั้งหมดเป็นข้อเท็จจริง และภาคแสดงparent_child/2มีสองประโยคย่อย ซึ่งทั้งสองเป็นกฎ
เนื่องจากลักษณะเชิงสัมพันธ์ของ述语 (predicate) ในตัวหลายๆ ตัว จึงสามารถใช้งานได้หลายทิศทาง ตัวอย่างเช่นlength/2สามารถใช้เพื่อกำหนดความยาวของลิสต์ ( length(List, L)โดยกำหนดลิสต์List) และเพื่อสร้างโครงร่างลิสต์ที่มีความยาวที่กำหนด ( โดยกำหนดลิสต์ ) length(X, 5)และเพื่อสร้างทั้งโครงร่างลิสต์และความยาวพร้อมกัน ( โดยกำหนดลิสต์ length(X, L)) ในทำนองเดียวกันappend/3สามารถใช้เพื่อรวมสองลิสต์เข้าด้วยกัน ( append(ListA, ListB, X)โดยกำหนดลิสต์ListAและListB) และเพื่อแบ่งลิสต์ที่กำหนดออกเป็นส่วนๆ ( append(X, Y, List)โดยกำหนดลิสต์List) ด้วยเหตุนี้ ชุด述语จากไลบรารีที่มีขนาดค่อนข้างเล็กจึงเพียงพอสำหรับโปรแกรม Prolog จำนวนมาก
Prolog เป็นภาษาโปรแกรมอเนกประสงค์ที่มี述语 (predicate) ในตัวหลากหลายชนิด สำหรับใช้ในการทำกิจกรรมประจำวัน เช่นการรับ/ส่งข้อมูลการใช้กราฟิก และการสื่อสารกับระบบปฏิบัติการ 述语เหล่านี้ไม่ได้มีความหมายเชิงสัมพันธ์ และมีประโยชน์เฉพาะในส่วนของผลข้างเคียงที่เกิดขึ้นกับระบบเท่านั้น ตัวอย่างเช่น 述语write/1จะแสดงคำศัพท์บนหน้าจอ
ลูปและการเรียกซ้ำ
อัลกอริทึมแบบวนซ้ำสามารถนำไปใช้ได้โดยใช้เงื่อนไขแบบเรียกซ้ำ[ 30 ]
พิจารณาparent_child/2เงื่อนไขที่กำหนดไว้ในโปรแกรมความสัมพันธ์ในครอบครัวข้างต้น โปรแกรม Prolog ต่อไปนี้กำหนด ความสัมพันธ์ บรรพบุรุษ :
บรรพบุรุษ( X , Y ) :- พ่อแม่ลูก( X , Y ). บรรพบุรุษ( X , Y ) :- พ่อแม่ลูก( X , Z ), บรรพบุรุษ( Z , Y ).ประโยคนี้แสดงว่า X เป็นบรรพบุรุษของ Y ถ้า X เป็นพ่อแม่ของ Y หรือ X เป็นพ่อแม่ของบรรพบุรุษของ Y ประโยคนี้เป็นแบบเรียกซ้ำเพราะนิยามโดยใช้ตัวมันเอง (มีการเรียกใช้述语 (predicate ancestor/2) ในส่วนของประโยคย่อยที่สอง)
การประหารชีวิต
การทำงานของโปรแกรม Prolog เริ่มต้นจากการที่ผู้ใช้ป้อนเป้าหมายเดียวที่เรียกว่าคำถาม (query) ในเชิงตรรกะ กลไกของ Prolog จะพยายามหา การ หักล้าง (refutation) ของคำถามที่ถูกปฏิเสธ วิธีการหักล้างที่ Prolog ใช้เรียกว่าการหักล้างแบบ SLD (Self- Demand-Limiting) หากสามารถหักล้างคำถามที่ถูกปฏิเสธได้ แสดงว่าคำถามนั้น พร้อมกับการผูกตัวแปรที่เหมาะสม เป็นผลลัพธ์เชิงตรรกะของโปรแกรม ในกรณีนั้น การผูกตัวแปรที่สร้างขึ้นทั้งหมดจะถูกรายงานไปยังผู้ใช้ และถือว่าคำถามนั้นสำเร็จ ในทางปฏิบัติ กลยุทธ์การทำงานของ Prolog สามารถคิดได้ว่าเป็นการขยายความของการเรียกฟังก์ชันในภาษาอื่นๆ ข้อแตกต่างประการหนึ่งคือ ส่วนหัวของข้อความหลายส่วนสามารถตรงกับการเรียกที่กำหนดได้ ในกรณีนั้น ระบบจะสร้างจุดเลือก (choice-point) รวมเป้าหมายเข้ากับส่วนหัวของข้อความของทางเลือกแรก และดำเนินการต่อด้วยเป้าหมายของทางเลือกแรกนั้น หากเป้าหมายใดล้มเหลวในระหว่างการทำงานของโปรแกรม การผูกตัวแปรทั้งหมดที่เกิดขึ้นนับตั้งแต่จุดเลือกครั้งล่าสุดจะถูกยกเลิก และการทำงานจะดำเนินต่อไปด้วยทางเลือกถัดไปของจุดเลือกนั้น กลยุทธ์การทำงานนี้เรียกว่าการย้อนกลับ ตามลำดับเวลา (chronological backtracking ) ตัวอย่างเช่น จากโปรแกรมความสัมพันธ์ในครอบครัวที่กำหนดไว้ข้างต้น คำถามต่อไปนี้จะถูกประเมินว่าเป็นจริง:
?- พี่น้อง( แซลลี่, เอริกา) ใช่วิธีการได้มาซึ่งผลลัพธ์มีดังนี้: ในขั้นต้น ส่วนหัวของประโยคที่ตรงกับคำถามsibling(sally, erica)มีเพียงส่วนแรกเท่านั้น ดังนั้นการพิสูจน์คำถามจึงเทียบเท่ากับการพิสูจน์เนื้อหาของประโยคนั้นโดยมีการผูกตัวแปรที่เหมาะสมไว้ กล่าวคือ การเชื่อมโยง เป้าหมาย(parent_child(Z, sally), parent_child(Z, erica))ถัดไปที่จะต้องพิสูจน์คือเป้าหมายทางซ้ายสุดของการเชื่อมโยงนี้ กล่าวคือparent_child(Z, sally)มีส่วนหัวของประโยคสองส่วนที่ตรงกับเป้าหมายนี้ ระบบจะสร้างจุดเลือกและลองทางเลือกแรกซึ่งมีเนื้อหาเป็นfather_child(Z, sally)เป้าหมายนี้สามารถพิสูจน์ได้โดยใช้ข้อเท็จจริงfather_child(tom, sally)ดังนั้นจึงมีการสร้างการผูกตัวแปรZ = tomและเป้าหมายถัดไปที่จะต้องพิสูจน์คือส่วนที่สองของการเชื่อมโยงข้างต้น: parent_child(tom, erica)อีกครั้ง สิ่งนี้สามารถพิสูจน์ได้โดยใช้ข้อเท็จจริงที่สอดคล้องกัน เนื่องจากเป้าหมายทั้งหมดสามารถพิสูจน์ได้ คำถามจึงสำเร็จ เนื่องจากคำถามไม่มีตัวแปร จึงไม่มีการรายงานการผูกตัวแปรใดๆ ให้กับผู้ใช้ คำถามที่มีตัวแปร เช่น:
?- พ่อ_ลูก( พ่อ, ลูก).แสดงรายการคำตอบที่ถูกต้องทั้งหมดเกี่ยวกับการย้อนกลับ
โปรดสังเกตว่าด้วยโค้ดที่ระบุไว้ข้างต้น การค้นหา?- sibling(sally, sally).ก็สำเร็จเช่นกัน หากต้องการ สามารถเพิ่มเป้าหมายเพิ่มเติมเพื่ออธิบายข้อจำกัดที่เกี่ยวข้องได้
การปฏิเสธ
ฟังก์ชัน述语 (predicate) ในตัวของ Prolog \+/1ให้การปฏิเสธเป็นความล้มเหลวซึ่งช่วยให้สามารถใช้ เหตุผล แบบไม่เป็นไปตามลำดับได้เป้าหมาย\+ illegal(X)ในกฎ
ถูกกฎหมาย( X ) :- \+ ผิดกฎหมาย( X )การประเมินจะเป็นดังนี้: Prolog พยายามพิสูจน์illegal(X)ถ้าสามารถหาหลักฐานพิสูจน์เป้าหมายนั้นได้ เป้าหมายเดิม (เช่น\+ illegal(X)) จะล้มเหลว ถ้าหาหลักฐานพิสูจน์ไม่ได้ เป้าหมายเดิมจะสำเร็จ ดังนั้น\+/1ตัวดำเนินการนำหน้าจึงเรียกว่าตัวดำเนินการ "พิสูจน์ไม่ได้" เนื่องจากคำถาม?- \+ Goal.จะสำเร็จถ้าเป้าหมายพิสูจน์ไม่ได้ การปฏิเสธแบบนี้จะสมเหตุสมผลถ้าอาร์กิวเมนต์เป็น"พื้นฐาน" (เช่น ไม่มีตัวแปร) ความถูกต้องจะหายไปถ้าอาร์กิวเมนต์มีตัวแปรและกระบวนการพิสูจน์เสร็จสมบูรณ์ โดยเฉพาะอย่างยิ่ง คำถามนี้?- legal(X).ไม่สามารถใช้เพื่อแจงนับสิ่งต่างๆ ที่ถูกต้องทั้งหมดได้
การเขียนโปรแกรมด้วยภาษาโปรล็อก
ใน Prolog การโหลดโค้ดเรียกว่าการปรึกษาหารือ Prolog สามารถใช้งานแบบโต้ตอบได้โดยการป้อนคำถามที่พรอมต์ Prolog ?-หากไม่มีคำตอบ Prolog จะเขียนnoหากมีคำตอบอยู่ก็จะถูกพิมพ์ออกมา หากมีคำตอบหลายคำตอบสำหรับคำถามนั้น สามารถขอคำตอบเหล่านั้นได้โดยการป้อนเครื่องหมายเซมิโคลอน;มีแนวทางปฏิบัติที่ดีในการเขียนโปรแกรมเพื่อปรับปรุงประสิทธิภาพ ความอ่านง่าย และความสามารถในการบำรุงรักษาของโค้ด[ 31 ]
ต่อไปนี้เป็นตัวอย่างโปรแกรมที่เขียนด้วยภาษา Prolog
สวัสดีโลก
ตัวอย่างการสอบถามข้อมูลพื้นฐานในภาษา Prolog ยอดนิยมสองภาษา:
| สวีไอ-โปรล็อก | จีเอ็นยู โปรล็อก |
|---|---|
?- เขียน( 'Hello World!' ), nl . Hello World ! true .?- | | ?- เขียน( 'Hello World!' ), nl . Hello World !ใช่| ?- |
การเปรียบเทียบนี้แสดงให้เห็นว่าข้อความแจ้งเตือน ("?-" เทียบกับ "| ?-") และสถานะการแก้ไข ("true" เทียบกับ "yes", "false" เทียบกับ "no") อาจแตกต่างกันไปในแต่ละการใช้งาน Prolog
การเพิ่มประสิทธิภาพคอมไพเลอร์
การคำนวณใดๆ ก็สามารถแสดงออกมาในรูปของลำดับการเปลี่ยนสถานะได้ ตัวอย่างเช่นคอมไพเลอร์ที่ทำการปรับแต่งประสิทธิภาพด้วยการปรับแต่งสามรอบ สามารถนำไปใช้ได้ในรูปของความสัมพันธ์ระหว่างโปรแกรมเริ่มต้นกับรูปแบบที่ได้รับการปรับแต่งแล้ว:
program_optimized ( Prog0 , Prog ) :- optimization_pass_1 ( Prog0 , Prog1 ), optimization_pass_2 ( Prog1 , Prog2 ), optimization_pass_3 ( Prog2 , Prog ).หรือเทียบเท่าโดยใช้สัญลักษณ์ DCG :
program_optimized --> optimization_pass_1 , optimization_pass_2 , optimization_pass_3 .เรียงลำดับเร็ว
อั ลกอริทึมการเรียงลำดับ แบบควิกซอร์ต (QuickSort)ซึ่งเชื่อมโยงรายการกับเวอร์ชันที่เรียงลำดับแล้ว:
partition ([], _ , [], []). partition ([ X | Xs ], Pivot , Smalls , Bigs ) :- ( X @< Pivot -> Smalls = [ X | Rest ], partition ( Xs , Pivot , Rest , Bigs ) ; Bigs = [ X | Rest ], partition ( Xs , Pivot , Smalls , Rest ) ).quicksort ([]) --> []. quicksort ([ X | Xs ]) --> { partition ( Xs , X , Smaller , Bigger ) }, quicksort ( Smaller ), [ X ], quicksort ( Bigger ).รูปแบบการออกแบบของ Prolog
รูปแบบการออกแบบคือโซลูชันทั่วไปที่นำกลับมาใช้ซ้ำได้สำหรับปัญหาที่เกิดขึ้นบ่อยในการออกแบบซอฟต์แวร์รูปแบบการออกแบบบางอย่างใน Prolog ได้แก่ โครงร่าง เทคนิค[ 32 ] [ 33 ]คำพูด ติดปาก [ 34 ]แผนผังโปรแกรม[ 35 ]แผนผังคำอธิบายตรรกะ[ 36 ]และ การ เขียนโปรแกรมลำดับสูง[ 37 ]
การเขียนโปรแกรมระดับสูง
述语ลำดับสูงคือ述语ที่รับ述语อื่นหนึ่งตัวขึ้นไปเป็นอาร์กิวเมนต์ แม้ว่าการสนับสนุนการเขียนโปรแกรมลำดับสูงจะทำให้ Prolog อยู่นอกขอบเขตของตรรกะลำดับแรก ซึ่งไม่อนุญาตให้มีการกำหนดปริมาณเหนือ述语[ 38 ]ปัจจุบัน ISO Prolog มี述语ลำดับสูงในตัวบางอย่าง เช่นcall/1, call/2, call/3, findall/3, setof/3, และ[ 39bagof/3 ] นอกจากนี้ เนื่องจากสามารถสร้างและประเมินเป้าหมาย Prolog ที่กำหนดเองได้ในขณะรันไทม์ จึงง่ายต่อการเขียน述语ลำดับสูง เช่น ซึ่ง ใช้述语ที่กำหนดเองกับสมาชิกแต่ละตัวของรายการที่กำหนด และซึ่งกรององค์ประกอบที่ตรงตาม述语ที่กำหนด รวมถึงอนุญาตให้ใช้curryingได้ ด้วย [ 37 ]maplist/2sublist/3
ในการแปลงคำตอบจากรูปแบบการแสดงผลเชิงเวลา (การแทนที่คำตอบในการย้อนกลับ) ไปเป็นรูปแบบการแสดงผลเชิงพื้นที่ (เทอม) ภาษา Prolog มี述语 (predicate) ต่างๆ ที่รวบรวมคำตอบทั้งหมดสำหรับการแทนที่คำถามที่กำหนดไว้ในรายการ ซึ่งสามารถนำไปใช้กับการสร้างรายการแบบเข้าใจง่าย (list comprehension ) ได้ ตัวอย่างเช่นจำนวนสมบูรณ์เท่ากับผลรวมของตัวหารแท้ของพวกมัน:
perfect ( N ) :- ระหว่าง( 1 , inf , N ), U คือN // 2 , findall ( D , ( ระหว่าง( 1 , U , D ), N mod D =:= 0 ), Ds ), sumlist ( Ds , N ).วิธีนี้สามารถใช้ในการแจกแจงจำนวนสมบูรณ์ และตรวจสอบว่าจำนวนนั้นเป็นจำนวนสมบูรณ์หรือไม่
อีกตัวอย่างหนึ่งคือ ตัวบ่งชี้maplistจะใช้ตัวบ่งชี้Pกับตำแหน่งที่สอดคล้องกันทั้งหมดในคู่ของรายการ:
maplist ( _ , [], []). maplist ( P , [ X | Xs ], [ Y | Ys ]) :- call ( P , X , Y ), maplist ( P , Xs , Ys ).เมื่อPเงื่อนไขที่ว่าสำหรับทุกค่าXจะP(X,Y)รวมเข้าYกับค่าที่ไม่ซ้ำกันเพียงค่าเดียวmaplist(P, Xs, Ys)จะเทียบเท่ากับการใช้ ฟังก์ชัน mapใน การ เขียน โปรแกรมเชิงฟังก์ชันเช่นYs = map(Function, Xs)
รูปแบบการ เขียน โปรแกรมระดับสูงใน Prolog นั้นได้รับการพัฒนาขึ้นครั้งแรกในHiLogและλProlog
โมดูล
สำหรับการเขียนโปรแกรมในขนาดใหญ่ Prolog มีระบบโมดูลซึ่งอยู่ในมาตรฐาน ISO [ 40 ] อย่างไรก็ตาม แม้ว่าระบบ Prolog ส่วนใหญ่จะรองรับการจัดโครงสร้างโค้ดเป็นโมดูล แต่แทบไม่มีการใช้งานใดที่ยึดตามส่วนของโมดูลในมาตรฐาน ISO เลย ในทางกลับกัน ระบบ Prolog ส่วนใหญ่ได้ตัดสินใจที่จะสนับสนุน ระบบโมดูล Quintus / SICStus เป็น มาตรฐานโมดูลโดยพฤตินัยอย่างไรก็ตาม ตัวบ่งชี้อำนวยความสะดวกเพิ่มเติมเกี่ยวกับโมดูลนั้นมีให้โดยการใช้งานบางอย่างเท่านั้น และมักมีความแตกต่างเล็กน้อยในความหมาย[ 41 ]
บางระบบเลือกที่จะนำแนวคิดโมดูลมาใช้โดยการคอมไพล์ จากซอร์สโค้ดไปยังซอร์สโค้ดพื้นฐานใน ISO Prolog เช่นเดียวกับLogtalk [ 23 ] GNU Prolog ในตอนแรกเบี่ยงเบนจากโมดูล ISO โดยเลือกใช้การเขียนโปรแกรมตรรกะตามบริบทแทนซึ่งการโหลดและยกเลิกการโหลดหน่วย (โมดูล) สามารถทำได้แบบไดนามิก[ 42 ] Ciaoออกแบบระบบโมดูลที่เข้มงวด ซึ่งในขณะที่เข้ากันได้กับ มาตรฐาน โดยพฤตินัยที่ใช้โดยระบบ Prolog อื่นๆ นั้น เอื้อต่อการวิเคราะห์แบบคงที่ที่แม่นยำ รองรับการซ่อนเทอม และอำนวยความสะดวกในการเขียนโปรแกรมในขนาดใหญ่[ 43 ] XSBใช้แนวทางที่แตกต่างออกไปและนำเสนอระบบโมดูลแบบอะตอม[ 44 ]ระบบ Prolog สองระบบหลังนี้อนุญาตให้ควบคุมการมองเห็นของเทอมนอกเหนือจากการมองเห็นของเพรดิเคต[ 41 ]
การแยกวิเคราะห์
มีสัญลักษณ์พิเศษที่เรียกว่า ไวยากรณ์ประโยคกำหนด ( definite clause grammars ) กฎที่กำหนดโดยใช้-->/2แทนที่จะใช้:-/2จะถูกขยายโดยพรีโปรเซสเซอร์ ( expand_term/2ซึ่งเป็นฟังก์ชันที่คล้ายกับมาโครในภาษาอื่นๆ) ตามกฎการเขียนใหม่ที่ตรงไปตรงมาไม่กี่ข้อ ส่งผลให้ได้ประโยค Prolog ทั่วไป ที่สำคัญที่สุด การเขียนใหม่นี้จะเพิ่มอาร์กิวเมนต์อีกสองตัวให้กับภาคแสดง ซึ่งสามารถใช้เพื่อเชื่อมโยงสถานะโดยปริยาย คล้ายกับโมนาดในภาษาอื่นๆ ไวยากรณ์ประโยคกำหนดมักใช้ในการเขียนตัวแยกวิเคราะห์หรือตัวสร้างรายการ เนื่องจากยังให้ส่วนต่อประสานที่สะดวกสำหรับรายการความแตกต่างด้วย
นักตีความเชิงอภิปรัชญาและการสะท้อนคิด
Prolog เป็น ภาษา โฮโมไอโคนิกและมีฟังก์ชันการทำงานมากมายสำหรับการเขียนโปรแกรมเชิงสะท้อน (reflection) กลยุทธ์การดำเนินการโดยปริยายของมันทำให้สามารถเขียนตัวประเมินแบบเมตาเซอร์คิวลาร์ ที่กระชับ (เรียกอีกอย่างว่าเมตาอินเตอร์พรีเตอร์ ) สำหรับโค้ด Prolog บริสุทธิ์ได้:
แก้( true ). แก้(( Subgoal1 , Subgoal2 )) :- แก้( Subgoal1 ), แก้( Subgoal2 ). แก้( Head ) :- clause ( Head , Body ), แก้( Body ).โดยที่trueแทนการเชื่อมประโยคที่ว่างเปล่า และclause(Head, Body)รวมเข้ากับประโยคย่อยในฐานข้อมูลในรูปHead :- Bodyแบบ
เนื่องจากโปรแกรม Prolog นั้นเป็นลำดับของเทอม Prolog ( :-/2เป็นตัวดำเนินการ แบบอินฟิกซ์ ) ซึ่งสามารถอ่านและตรวจสอบได้ง่ายโดยใช้กลไกในตัว (เช่นread/1) จึงเป็นไปได้ที่จะเขียนตัวแปลแบบกำหนดเองที่เสริม Prolog ด้วยคุณสมบัติเฉพาะโดเมน ตัวอย่างเช่น Sterling และ Shapiro นำเสนอตัวแปลแบบเมตาที่ทำการอนุมานด้วยความไม่แน่นอน ซึ่งนำมาแสดงไว้ที่นี่โดยมีการแก้ไขเล็กน้อย: [ 45 ] : 330
solve ( true , 1 ) :- !. solve (( Subgoal1 , Subgoal2 ), Certainty ) :- !, solve ( Subgoal1 , Certainty1 ), solve ( Subgoal2 , Certainty2 ), Certainty is min ( Certainty1 , Certainty2 ). solve ( Goal , 1 ) :- builtin ( Goal ), !, Goal . solve ( Head , Certainty ) :- clause_cf ( Head , Body , Certainty1 ), solve ( Body , Certainty2 ), Certainty is Certainty1 * Certainty2 .ตัวแปลนี้ใช้ตารางของเพรดิเคต Prolog ในตัวในรูปแบบ[ 45 ] : 327
ฟังก์ชันในตัว( A คือB ). ฟังก์ชันในตัว( อ่าน( X )). % เป็นต้นและข้อความที่แสดงเป็นclause_cf(Head, Body, Certainty). เมื่อพิจารณาจากสิ่งเหล่านั้นแล้ว สามารถเรียกได้ว่าsolve(Goal, Certainty)เป็นการดำเนินการGoalและได้รับความแน่นอนในระดับหนึ่งเกี่ยวกับผลลัพธ์
ความสมบูรณ์แบบของทัวริง
ภาษา Prolog บริสุทธิ์นั้นสร้างขึ้นจากส่วนย่อยของ ตรรกะประพจน์ลำดับที่หนึ่งที่เรียกว่าHorn clausesซึ่งเป็น ภาษาที่สมบูรณ์แบบในเชิงทัวริง (Turing-complete ) สามารถแสดงให้เห็นได้ว่า Prolog นั้นสมบูรณ์แบบในเชิงทัวริงโดยการใช้ Prolog ในการจำลองเครื่องจักรทัวริง:
turing ( Tape0 , Tape ) :- perform ( q0 , [], Ls , Tape0 , Rs ), reverse ( Ls , Ls1 ), append ( Ls1 , Rs , Tape ).ดำเนินการ( qf , Ls , Ls , Rs , Rs ) :- !. ดำเนินการ( Q0 , Ls0 , Ls , Rs0 , Rs ) :- สัญลักษณ์( Rs0 , Sym , RsRest ), ครั้งเดียว( กฎ( Q0 , Sym , Q1 , NewSym , Action )), การกระทำ( Action , Ls0 , Ls1 , [ NewSym | RsRest ], Rs1 ), ดำเนินการ( Q1 , Ls1 , Ls , Rs1 , Rs ).สัญลักษณ์([], b , []). สัญลักษณ์([ Sym | Rs ], Sym , Rs ).การกระทำ( ซ้าย, Ls0 , Ls , Rs0 , Rs ) :- ซ้าย( Ls0 , Ls , Rs0 , Rs ). การกระทำ( อยู่, Ls , Ls , Rs , Rs ). การกระทำ( ขวา, Ls0 , [ Sym | Ls0 ], [ Sym | Rs ], Rs ).ซ้าย([], [], Rs0 , [ b | Rs0 ]). ซ้าย([ L | Ls ], Ls , Rs , [ L | Rs ]).ตัวอย่างง่ายๆ ของเครื่องจักรทัวริงนั้นระบุได้จากข้อเท็จจริงดังต่อไปนี้:
กฎ( q0 , 1 , q0 , 1 , ขวา). กฎ( q0 , b , qf , 1 , อยู่).เครื่องนี้ทำการเพิ่มค่าตัวเลขทีละหนึ่งในรูปแบบการเข้ารหัสแบบเอกภาค: มันวนลูปไปเรื่อยๆ จนกว่าจะมีเซลล์ที่มีค่าเป็น "1" ครบจำนวน และเพิ่มค่า "1" เข้าไปที่ท้ายสุด ตัวอย่างคำสั่งและผลลัพธ์:
?- turing ([ 1 , 1 , 1 ], Ts ). Ts = [ 1 , 1 , 1 , 1 ] ;สิ่งนี้แสดงให้เห็นว่าการคำนวณใดๆ ก็สามารถแสดงออกมาในรูปแบบประกาศได้ โดยเป็นลำดับของการเปลี่ยนสถานะ ซึ่งในภาษาโปรล็อกจะแสดงให้เห็นเป็นความสัมพันธ์ระหว่างสถานะที่สนใจที่ต่อเนื่องกัน
การดำเนินการ

ไอโซโปรล็อก
มาตรฐานทางเทคนิค ของ องค์การระหว่างประเทศว่าด้วยการมาตรฐาน (ISO) Prolog ประกอบด้วยสองส่วน ISO/IEC 13211-1 [ 39 ] [ 46 ]ซึ่งตีพิมพ์ในปี 1995 มีจุดมุ่งหมายเพื่อกำหนดมาตรฐานการปฏิบัติที่มีอยู่ของการใช้งานองค์ประกอบหลักของ Prolog จำนวนมาก โดยได้ชี้แจงแง่มุมของภาษาที่ก่อนหน้านี้คลุมเครือและนำไปสู่โปรแกรมที่พกพาได้ มีการแก้ไขเพิ่มเติมสามรายการ ได้แก่ Cor.1:2007 [ 47 ] Cor.2:2012 [ 48 ]และ Cor.3:2017 [ 49 ] ISO/IEC 13211-2 [ 39 ]ซึ่งตีพิมพ์ในปี 2000 เพิ่มการสนับสนุนโมดูลให้กับมาตรฐาน มาตรฐานนี้ได้รับการดูแลโดย กลุ่มทำงาน ISO/IEC JTC1 / SC22 /WG17 [ 50 ] ANSI X3J17 เป็นกลุ่มที่ปรึกษาทางเทคนิคของสหรัฐอเมริกาสำหรับมาตรฐานนี้[ 51 ]
การรวบรวม
เพื่อประสิทธิภาพ โดยทั่วไปโค้ด Prolog จะถูกคอมไพล์เป็นโค้ดเครื่องนามธรรม ซึ่งมักได้รับอิทธิพลจากชุดคำสั่งWarren Abstract Machine ที่ใช้รีจิสเตอร์ [ 52 ]การใช้งานบางอย่างใช้การตีความแบบนามธรรมเพื่อดึงข้อมูลประเภทและโหมดของเพรดิเคตในเวลาคอมไพล์ หรือคอมไพล์เป็นโค้ดเครื่องจริงเพื่อประสิทธิภาพสูง[ 53 ]การคิดค้นวิธีการใช้งานที่มีประสิทธิภาพสำหรับโค้ด Prolog เป็นสาขาการวิจัยที่กำลังดำเนินอยู่ในชุมชนการเขียนโปรแกรมเชิงตรรกะ และมีการใช้วิธีการดำเนินการอื่นๆ ในการใช้งานบางอย่าง ซึ่งรวมถึงการแปลงข้อความเป็นไบนารีและเครื่อง เสมือนแบบใช้สแต็ก
การเรียกซ้ำแบบหาง
โดยทั่วไป ระบบ Prolog จะใช้เมธอดการเพิ่มประสิทธิภาพที่รู้จักกันดีที่เรียกว่าการเพิ่มประสิทธิภาพการเรียกแบบหาง (tail call optimization)สำหรับ述语เชิงกำหนดที่แสดงการเรียกซ้ำแบบหางหรือโดยทั่วไปแล้ว การเรียกแบบหาง: เฟรมสแต็กของข้อความจะถูกทิ้งก่อนที่จะทำการเรียกในตำแหน่งหาง ดังนั้น 述语เชิงกำหนดที่มีการเรียกซ้ำแบบหางจึงถูกดำเนินการด้วยพื้นที่สแต็กคงที่ เช่นเดียวกับลูปในภาษาอื่นๆ
การจัดทำดัชนีคำศัพท์
การค้นหาข้อความที่สามารถรวมเข้ากับคำในแบบสอบถามได้นั้นใช้เวลาเชิงเส้นตามจำนวนข้อความการจัดทำดัชนีคำใช้โครงสร้างข้อมูลที่ช่วยให้การค้นหาใช้เวลาน้อยกว่าเชิงเส้น[ 54 ]การจัดทำดัชนีมีผลต่อประสิทธิภาพของโปรแกรมเท่านั้น ไม่มีผลต่อความหมาย Prolog ส่วนใหญ่ใช้การจัดทำดัชนีเฉพาะคำแรกเท่านั้น เนื่องจาก1การจัดทำดัชนีในทุกคำมีค่าใช้จ่ายสูง แต่เทคนิคที่ใช้คำที่เข้ารหัสฟิลด์หรือรหัสคำที่ซ้อนทับกันช่วยให้การจัดทำดัชนีทั่วทั้งแบบสอบถามและส่วนหัวทำได้อย่างรวดเร็ว[ 55 ] [ 56 ]
การแฮช
ระบบ Prolog บางระบบ เช่นWIN-PROLOG และ SWI-Prolog ได้นำการแฮชมาใช้เพื่อช่วยจัดการกับชุดข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพมากขึ้น ซึ่งมักจะส่งผลให้ประสิทธิภาพเพิ่มขึ้นอย่างมากเมื่อ ทำงาน กับคลังข้อมูลขนาดใหญ่ เช่นWordNet
การจัดโต๊ะ
ระบบ Prolog บางระบบ ( B-Prolog , XSB , SWI-Prolog , YAPและCiao ) ใช้ เมธอด memoizationที่เรียกว่าtablingซึ่งช่วยให้ผู้ใช้ไม่ต้องจัดเก็บผลลัพธ์ระหว่างกลางด้วยตนเอง Tabling เป็นการแลกเปลี่ยนระหว่างพื้นที่และเวลา กล่าวคือ เวลาในการประมวลผลสามารถลดลงได้โดยการใช้หน่วยความจำมากขึ้นเพื่อจัดเก็บผลลัพธ์ระหว่างกลาง: [ 57 ] [ 58 ]
เป้าหมายย่อยที่พบในการประเมินแบบสอบถามจะถูกเก็บรักษาไว้ในตาราง พร้อมกับคำตอบของเป้าหมายย่อยเหล่านี้ หากพบเป้าหมายย่อยอีกครั้ง การประเมินจะใช้ข้อมูลจากตารางซ้ำแทนที่จะทำการแก้ไขกับเงื่อนไขโปรแกรมอีกครั้ง[ 59 ]
การสร้างตารางสามารถขยายได้ในหลายทิศทาง สามารถรองรับ述语แบบเรียกซ้ำผ่านการแก้ปัญหา SLGหรือการสร้างตารางเชิงเส้น ในระบบ Prolog แบบมัลติเธรด ผลลัพธ์ของการสร้างตารางอาจถูกเก็บไว้เป็นส่วนตัวสำหรับเธรดใดเธรดหนึ่ง หรือแบ่งปันระหว่างทุกเธรด และในการสร้างตารางแบบเพิ่มขึ้น การสร้างตารางอาจตอบสนองต่อการเปลี่ยนแปลงได้
การนำไปใช้ในฮาร์ดแวร์
ในระหว่างโครงการระบบคอมพิวเตอร์รุ่นที่ห้ามีความพยายามที่จะนำ Prolog ไปใช้ในฮาร์ดแวร์โดยมีเป้าหมายเพื่อให้ได้การประมวลผลที่เร็วขึ้นด้วยสถาปัตยกรรมเฉพาะ[ 60 ] [ 61 ] [ 62 ]นอกจากนี้ Prolog ยังมีคุณสมบัติหลายประการที่อาจช่วยให้เร่งความเร็วได้ด้วยการประมวลผลแบบขนาน[ 63 ]แนวทางล่าสุดคือการคอมไพล์โปรแกรม Prolog ที่จำกัดไปยังอาร์เรย์เกตที่ตั้งโปรแกรมได้ [ 64 ] อย่างไรก็ตามความก้าวหน้าอย่างรวดเร็วในฮาร์ดแวร์อเนกประสงค์ได้แซงหน้าสถาปัตยกรรมเฉพาะทางอย่างต่อเนื่อง
ในปี พ.ศ. 2525 คอมพิวเตอร์ทำงานที่ความเร็วประมาณ 10,000 ถึง 100,000 การอนุมานเชิงตรรกะต่อวินาที (LIPS) FGCS วางแผนที่จะผลิตคอมพิวเตอร์ที่ทำงานที่ความเร็ว 0.1 ถึง 1 GLIPS [ 65 ]เอกสารของสถาบันเทคโนโลยีคอมพิวเตอร์ยุคใหม่ประเมินว่า 1 LIP ต้องใช้การดำเนินการประมาณ 100 ครั้งบนคอมพิวเตอร์ทั่วไป แผนคือการผลิตเครื่องจักรที่มีโปรเซสเซอร์ 1,000 ตัวที่ความเร็ว 1 GLIPS ในตอนท้ายของโครงการ (ในปี พ.ศ. 2535) ซึ่งหมายความว่าอย่างน้อย 1 MLIPS ต่อโปรเซสเซอร์[ 66 ]
Segaได้นำ Prolog มาใช้กับSega AI Computerซึ่งวางจำหน่ายในตลาดญี่ปุ่นในปี 1986 Prolog ถูกใช้สำหรับการอ่าน ข้อมูลป้อนเข้าที่ เป็นภาษาธรรมชาติในภาษาญี่ปุ่นผ่านทางทัชแพด[ 67 ]
ส่วนขยาย
มีการพัฒนาการใช้งานต่างๆ จากภาษา Prolog เพื่อขยายความสามารถในการเขียนโปรแกรมเชิงตรรกะในหลายทิศทาง ซึ่งรวมถึงประเภทข้อมูล โหมดการเขียนโปรแกรมเชิงตรรกะแบบมีข้อจำกัด (CLP) การเขียนโปรแกรมเชิง ตรรกะแบบเชิงวัตถุ การทำงาน พร้อมกันตรรกะเชิงเส้น การเขียนโปรแกรม เชิงฟังก์ชันและตรรกะลำดับสูงรวมถึงความสามารถในการทำงานร่วมกับฐานความรู้
ประเภท
Prolog เป็นภาษาที่ไม่มีประเภท ความพยายามในการแนะนำและขยาย Prolog ด้วยประเภทเริ่มต้นขึ้นในช่วงทศวรรษ 1980 [ 68 ] [ 69 ]และยังคงดำเนินต่อไปจนถึงปี 2008 [ 70 ]ข้อมูลประเภทมีประโยชน์ไม่เพียงแต่เพื่อความปลอดภัยของประเภท เท่านั้น แต่ยังรวมถึงการให้เหตุผลเกี่ยวกับโปรแกรม Prolog ด้วย[ 71 ]
โหมดต่างๆ
| ตัวระบุโหมด | การตีความ |
|---|---|
+ | nonvarเมื่อเข้ามา |
- | varเมื่อเข้ามา |
? | ไม่ได้ระบุ |
ไวยากรณ์ของ Prolog ไม่ได้ระบุว่าอาร์กิวเมนต์ใดของ述语เป็นอินพุตและอาร์กิวเมนต์ใดเป็นเอาต์พุต[ 72 ]อย่างไรก็ตาม ข้อมูลนี้มีความสำคัญและขอแนะนำให้รวมไว้ในคำอธิบาย[ 73 ]โหมดต่างๆ ให้ข้อมูลที่มีค่าเมื่อพิจารณาโปรแกรม Prolog [ 71 ]และยังสามารถใช้เพื่อเร่งความเร็วในการดำเนินการได้อีกด้วย[ 74 ]
ข้อจำกัด
การเขียนโปรแกรมตรรกะข้อจำกัดขยาย Prolog เพื่อรวมแนวคิดจาก ความพึงพอใจ ของข้อจำกัด[ 75 ] [ 76 ]โปรแกรมตรรกะข้อจำกัดอนุญาตให้มีข้อจำกัดในส่วนของข้อความ เช่น: A(X,Y) :- X+Y>0.เหมาะสำหรับปัญหาการเพิ่มประสิทธิภาพเชิงการจัดเรียง ขนาดใหญ่ [ 77 ]และจึงมีประโยชน์สำหรับการใช้งานในสภาพแวดล้อมทางอุตสาหกรรม เช่น การจัดตารางเวลาอัตโนมัติและการกำหนดตารางการผลิตระบบ Prolog ส่วนใหญ่มาพร้อมกับตัวแก้ข้อจำกัดอย่างน้อยหนึ่งตัวสำหรับโดเมนจำกัด และมักจะมีตัวแก้สำหรับโดเมนอื่นๆ เช่นจำนวนตรรกยะด้วย
การวางแนววัตถุ
Flora-2เป็นระบบการแสดงความรู้และการให้เหตุผลเชิงวัตถุที่ใช้ตรรกะF-logicและผสานรวมHiLog , ตรรกะการทำธุรกรรมและการให้เหตุผลที่สามารถหักล้างได้
Logtalkเป็นภาษาการเขียนโปรแกรมเชิงตรรกะแบบเชิงวัตถุที่สามารถใช้การใช้งาน Prolog ส่วนใหญ่เป็นคอมไพเลอร์เบื้องหลังได้ ในฐานะที่เป็นภาษาแบบหลายกระบวนทัศน์ มันจึงรองรับทั้งต้นแบบ (prototypes) และคลาส (classes)
Oblogเป็นส่วนขยายขนาดเล็ก พกพาได้ และเชิงวัตถุของ Prolog พัฒนาโดย Margaret McDougall จาก EdCAAD มหาวิทยาลัยเอดินบะระ
Objlogเป็นภาษาที่ใช้โครงสร้างเฟรม โดยผสมผสานออบเจ็กต์และ Prolog II จาก CNRS เมืองมาร์เซย์ ประเทศฝรั่งเศส
Prolog++ได้รับการพัฒนาโดยLogic Programming Associatesและเปิดตัวครั้งแรกในปี 1989 สำหรับพีซีระบบ MS-DOS ต่อมาได้เพิ่มการรองรับแพลตฟอร์มอื่นๆ และเปิดตัวเวอร์ชันที่สองในปี 1995 หนังสือเกี่ยวกับ Prolog++ โดย Chris Moss ได้รับการตีพิมพ์โดย Addison-Wesley ในปี 1994
Visual Prologเป็นภาษาแบบหลายพาราดิกม์ที่มีทั้งอินเทอร์เฟซ คลาส การใช้งาน และนิพจน์วัตถุ
กราฟิก
ระบบ Prolog ที่มีไลบรารีกราฟิกได้แก่SWI-Prolog [ 78 ] Visual Prolog , WIN-PROLOGและB- Prolog
ความพร้อมกัน
Prolog-MPI เป็นส่วนขยายSWI-Prolog แบบโอเพนซอร์ส สำหรับการประมวลผลแบบกระจายผ่านMessage Passing Interface [ 79 ] นอกจากนี้ยังมีภาษาการเขียนโปรแกรม Prolog แบบขนานต่างๆ อีกด้วย[ 80 ]
การเขียนโปรแกรมเว็บ
การใช้งาน Prolog บางอย่าง โดยเฉพาะVisual Prolog , SWI-PrologและCiaoรองรับ การ เขียนโปรแกรมเว็บฝั่งเซิร์ฟเวอร์ พร้อมการสนับสนุนโปรโตคอลเว็บHTMLและXML [ 81 ]นอกจากนี้ยังมีส่วนขยายเพื่อรองรับ รูปแบบ เว็บเชิงความหมายเช่นResource Description FrameworkและWeb Ontology Language [ 82 ] [ 83 ] Prologยังได้รับการเสนอแนะให้เป็นภาษาฝั่งไคลเอ็นต์ อีกด้วย [ 84 ]ยิ่งไปกว่านั้น Visual Prolog ยังรองรับJSON -RPCและWebsockets
อื่น
- F-logicขยายขีดความสามารถของ Prolog ด้วยเฟรม/ออบเจ็กต์สำหรับการแสดงความรู้
- ตรรกศาสตร์ธุรกรรมเป็นการต่อยอดจากภาษาโปรล็อกด้วยทฤษฎีเชิงตรรกะของตัวดำเนินการอัปเดตที่เปลี่ยนแปลงสถานะ โดยมีทั้งความหมายเชิงแบบจำลองและเชิงกระบวนการ
- OW Prologถูกสร้างขึ้นเพื่อแก้ปัญหาการขาดกราฟิกและส่วนติดต่อผู้ใช้ของ Prolog
อินเทอร์เฟซสำหรับภาษาอื่นๆ
มีเฟรมเวิร์กที่สามารถเชื่อมต่อระหว่าง Prolog กับภาษาอื่นๆ ได้:
- LPA Intelligence Server ช่วยให้สามารถฝัง LPA Prolog สำหรับ Windows ลงในภาษาโปรแกรมอื่นๆ ได้ รวมถึง: C , C++ , C# , Java , Visual Basic , Delphi , .NET , Lua , Pythonและอื่นๆ โดยใช้ประโยชน์จากชนิดข้อมูลสตริงเฉพาะที่ LPA Prolog จัดเตรียมไว้ให้
- อินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชัน ( API ) ของ Logic Server อนุญาตให้ขยายและฝัง Prolog ในภาษา C , C++ , Java , Visual Basic , Delphi , .NETและภาษาหรือสภาพแวดล้อมใด ๆ ที่สามารถเรียกใช้ไฟล์ .dll หรือ .so ได้ API นี้ถูกนำไปใช้ใน Amzi! Prolog + Logic Server แล้ว แต่ข้อกำหนด API สามารถนำไปใช้กับระบบอื่น ๆ ได้เช่นกัน
- JPL เป็นตัวเชื่อมต่อแบบสองทิศทางระหว่าง Java และ Prolog ซึ่งมาพร้อมกับ SWI-Prolog โดยค่าเริ่มต้น ทำให้ Java และ Prolog สามารถเรียกซึ่งกันและกันได้ (แบบเรียกซ้ำ) เป็นที่ทราบกันดีว่ามีระบบรองรับการทำงานพร้อมกันที่ดี และอยู่ระหว่างการพัฒนาอย่างต่อเนื่อง
- InterProlog เป็นไลบรารีการเขียนโปรแกรมที่เชื่อมต่อระหว่างJavaและ Prolog โดยใช้งานการเรียกใช้述语/method แบบสองทิศทางระหว่างทั้งสองภาษา สามารถแมปอ็อบเจ็กต์ Java ไปเป็นเทอม Prolog และในทางกลับกันได้ ช่วยให้สามารถพัฒนาส่วนติดต่อผู้ใช้แบบกราฟิกและฟังก์ชันอื่นๆ ใน Java ในขณะที่ปล่อยให้การประมวลผลตรรกะอยู่ในเลเยอร์ Prolog รองรับXSBและSWI- Prolog
- Provaนำเสนอการผสานรวมไวยากรณ์ดั้งเดิมกับ Java การส่งข้อความของเอเจนต์ และกฎการตอบสนอง Prova วางตำแหน่งตัวเองเป็นระบบสคริปต์แบบใช้กฎ (RBS) สำหรับมิดเดิลแวร์ ภาษาดังกล่าวสร้างความก้าวหน้าใหม่ในการผสมผสาน การ เขียน โปรแกรม เชิงคำสั่งและเชิงประกาศ
- PROL คือเครื่องมือประมวลผล Prolog แบบฝังตัวสำหรับ Java ประกอบด้วย IDE ขนาดเล็กและไลบรารีบางส่วน
- GNU Prolog สำหรับ Java คือการนำ ISO Prolog มาใช้ในรูปแบบไลบรารี Java (gnu.prolog)
- Ciaoมีอินเทอร์เฟซสำหรับเชื่อมต่อกับภาษา C, C++ , Java และฐานข้อมูลเชิงสัมพันธ์
- C#-Prolog คือตัวแปลภาษา Prolog ที่เขียนด้วยภาษา C# (แบบจัดการหน่วยความจำ) สามารถผสานรวมเข้ากับโปรแกรม C# ได้อย่างง่ายดาย คุณลักษณะเด่น ได้แก่ ตัวแปลภาษาที่เชื่อถือได้และค่อนข้างเร็ว อินเทอร์เฟซบรรทัดคำสั่ง อินเทอร์เฟซสำหรับ Windows มี DCG ในตัว รองรับ XML และ SQL และสามารถขยายเพิ่มเติมได้ ซอร์สโค้ดทั้งหมดมีให้ใช้งาน รวมถึงตัวสร้างตัวแยกวิเคราะห์ที่สามารถใช้สำหรับเพิ่มส่วนขยายเฉพาะทางได้
- tuProlog เป็นระบบ Prolog ที่มีน้ำหนักเบาสำหรับแอปพลิเคชันและโครงสร้างพื้นฐานแบบกระจาย ออกแบบมาโดยตั้งใจให้มีแกนหลักที่เรียบง่าย เพื่อให้สามารถกำหนดค่าได้ทั้งแบบคงที่หรือแบบไดนามิกโดยการโหลด/ยกเลิกการโหลดไลบรารีของ述语 (predicate) tuProlog รองรับการเขียนโปรแกรมแบบหลายพาราดิกม์โดยธรรมชาติ ทำให้มีรูปแบบการผสานรวมที่ราบรื่นและไร้รอยต่อระหว่าง Prolog และภาษาเชิงวัตถุหลัก ๆ ได้แก่ Java สำหรับ tuProlog เวอร์ชัน Java และภาษาใด ๆ ที่ใช้ .NET (C#, F#...) สำหรับ tuProlog เวอร์ชัน .NET
- Janus เป็นอินเทอร์เฟซแบบสองทิศทางระหว่าง Prolog และ Python โดยใช้พรีมิทีฟระดับต่ำแบบพกพา เดิมทีได้รับการพัฒนาสำหรับ XSB โดย Anderson และ Swift [ 85 ]แต่ได้รับการนำมาใช้เป็นโครงการริเริ่มร่วมกันโดยทีม XSB, Ciao และ SWI-Prolog
ดูเพิ่มเติม
- การเปรียบเทียบการใช้งาน Prolog
- การสร้างแบบจำลองเชิงตรรกะและภาษาศาสตร์วิธีการสร้างระบบฐานความรู้โดยใช้ภาษาโปรล็อก
- การเขียนโปรแกรมแบบชุดคำตอบแนวทางการเขียนโปรแกรมเชิงตรรกะแบบประกาศอย่างสมบูรณ์
- สมาคมการเขียนโปรแกรมเชิงตรรกะ
ภาษาที่เกี่ยวข้อง
- ภาษาGödelเป็นการนำตรรกะข้อจำกัดแบบขนานมา ใช้ในรูปแบบที่มีการกำหนดประเภทข้อมูลอย่างเข้มงวด โดยสร้างขึ้นบนพื้นฐานของSICStus Prolog
- Visual Prologซึ่งเดิมชื่อ PDC Prolog และ Turbo Prolog เป็น ภาษา Prolog ที่มีการกำหนดประเภทข้อมูลอย่างเข้มงวด และเน้นการเขียนโปรแกรมเชิงวัตถุ ซึ่งแตกต่างจาก Prolog มาตรฐานมาก ในชื่อ Turbo Prolog นั้น บริษัท Borland เป็นผู้จำหน่าย แต่ปัจจุบันได้รับการพัฒนาและจำหน่ายโดยบริษัท Prolog Development Center (PDC) จากประเทศเดนมาร์ก ซึ่งเป็นผู้ผลิตดั้งเดิม
- Datalogเป็นส่วนย่อยของ Prolog โดยมีข้อจำกัดอยู่ที่ความสัมพันธ์ที่สามารถแบ่งชั้นได้ และไม่อนุญาตให้ใช้พจน์ประกอบ ซึ่งแตกต่างจาก Prolog ตรงที่ Datalog ไม่ใช่ภาษาที่ สมบูรณ์แบบใน เชิงทัวริง (Turing-complete )
- Mercuryเป็นภาษาที่แตกแขนงมาจาก Prolog โดยมุ่งเน้นไปที่งานวิศวกรรมซอฟต์แวร์ขนาดใหญ่ ด้วยระบบประเภทข้อมูลแบบคงที่และแบบพหุรูป รวมถึงระบบโหมดและความแน่นอน
- GraphTalk เป็นการนำ Abstract Machine ของ Warren มาพัฒนาต่อยอดในรูปแบบที่เป็นกรรมสิทธิ์ โดยมีคุณสมบัติเชิงวัตถุเพิ่มเติม
- ในบางแง่ Prolog เป็นส่วนย่อยของPlannerแนวคิดใน Planner ได้รับการพัฒนาต่อยอดในภายหลังในScientific Community Metaphor
- AgentSpeakเป็นภาษา Prolog เวอร์ชันหนึ่งสำหรับการเขียนโปรแกรมเพื่อกำหนดพฤติกรรมของเอเจนต์ในระบบที่มีเอเจนต์หลายตัว
- Erlangเริ่มต้นจากการใช้งานที่อิงตาม Prolog และยังคงรักษาไวยากรณ์แบบรวม (unification-based syntax) ของ Prolog เอาไว้เป็นส่วนใหญ่
- Pilogเป็นภาษาเชิงประกาศที่สร้างขึ้นบนพื้นฐานของPicoLispซึ่งมีความหมายเหมือนกับ Prolog แต่ใช้ไวยากรณ์ของ Lisp
- λPrologเป็นส่วนขยายของ Prolog หลักที่มีคุณสมบัติการกำหนดประเภทแบบพหุรูป การเขียนโปรแกรมแบบโมดูลาร์ และการเขียนโปรแกรมลำดับสูง รวมถึงการสนับสนุนโดยตรงสำหรับเทอมที่มีตัวดำเนินการผูกตัวแปรผ่านไวยากรณ์ที่เรียกว่า λ-tree และการรวมรูปแบบลำดับสูง
หมายเหตุ
- ^ศัพท์เฉพาะของ Prolog แตกต่างจากศัพท์เฉพาะของ ตรรกศาสตร์ศัพท์เฉพาะของ Prolog (ขึ้นอยู่กับบริบท) อาจเป็นศัพท์เฉพาะหรือสูตรอะตอมในตรรกศาสตร์ ในศัพท์เฉพาะของตรรกศาสตร์มาตรฐาน อะตอมหมายถึงสูตรอะตอมส่วนอะตอมของ Prolog (ขึ้นอยู่กับบริบท) อาจเป็นค่าคงที่ สัญลักษณ์ฟังก์ชัน หรือสัญลักษณ์ภาคแสดงของตรรกศาสตร์
อ่านเพิ่มเติม
- แบล็กเบิร์น, แพทริค; บอส, โยฮัน; สตรีกนิทซ์, คริสตินา (2006). เรียนรู้ Prolog ตอนนี้เลย!สำนักพิมพ์วิทยาลัยISBN 978-1-904987-17-8เก็บถาวรจากต้นฉบับเมื่อวันที่ 26 สิงหาคม 2550 เรียกดูเมื่อวันที่ 2 ธันวาคม 2551
- อีวาน บราทโก , การเขียนโปรแกรม Prolog สำหรับปัญญาประดิษฐ์ , ฉบับที่ 4, 2012, ISBN 978-0-321-41746-6เอกสารประกอบ หนังสือและซอร์สโค้ด
- William F. Clocksin, Christopher S. Mellish: การเขียนโปรแกรมในภาษา Prolog: การใช้มาตรฐาน ISO Springer, ฉบับพิมพ์ครั้งที่ 5, 2003, ISBN 978-3-540-00678-7( ฉบับนี้ปรับปรุงให้เป็นไปตามมาตรฐาน ISO Prolog แล้ว ฉบับก่อนหน้านี้อธิบายถึงมาตรฐาน Edinburgh Prolog)
- William F. Clocksin: Clause and Effect. Prolog Programming for the Working Programmer . Springer, 2003, ISBN 978-3-540-62971-9.
- Michael A. Covington , Donald Nute, Andre Vellino, การเขียนโปรแกรม Prolog อย่างละเอียด , 1996, ISBN 0-13-138645-X.
- Michael A. Covington, การประมวลผลภาษาธรรมชาติสำหรับโปรแกรมเมอร์ Prolog , 1994, ISBN 978-0-13-629213-5
- MS Dawe และ CMDawe, Prolog for Computer Sciences , Springer Verlag 1992.
- ISO/IEC 13211: เทคโนโลยีสารสนเทศ – ภาษาโปรแกรม – Prologองค์การมาตรฐานสากล , เจนีวา
- เฟลิกซ์ คลูซเนียก และ สตานิ สลาฟ สปาโควิช (โดยมีส่วนร่วมของ ยานุส เอส. บีน) โปรล็อกสำหรับโปรแกรมเมอร์ สำนักพิมพ์ Academic Press Inc. (ลอนดอน) ปี 1985 และ 1987 ( มี ให้ใช้งานภายใต้ ใบ อนุญาต Creative Commonsที่sites.google.com/site/prologforprogrammers/ )
ISBN 0-12-416521-4. - ริชาร์ด โอ'คีฟ , ศิลปะแห่งคำนำหน้า , ISBN 0-262-15039-5.
- Robert Smith, John Gibson, Aaron Sloman : 'การสนับสนุนเครื่องเสมือนสองระดับของ POPLOG สำหรับภาษาเชิงโต้ตอบ' ในResearch Directions in Cognitive Science Volume 5: Artificial Intelligence , บรรณาธิการD. Sleemanและ N. Bernsen, Lawrence Erlbaum Associates, หน้า 203–231, 1992
- Leon SterlingและEhud Shapiro , ศิลปะแห่ง Prolog: เทคนิคการเขียนโปรแกรมขั้นสูง , 1994, ISBN 0-262-19338-8.
- David HD Warren, Luis M. Pereira และ Fernando Pereira, Prolog - ภาษาและการใช้งานร่วมกับ Lisp. เอกสารจดหมายเหตุ ACM SIGART Bulletin ฉบับที่ 64. รายงานการประชุมสัมมนาเรื่องปัญญาประดิษฐ์และภาษาโปรแกรมมิ่ง ปี 1977, หน้า 109–115.
ลิงก์ภายนอก
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ บทนำ
Prolog เป็น ภาษา การเขียนโปรแกรมเชิงตรรกะ ที่มีต้นกำเนิดมาจาก ปัญญาประดิษฐ์ การ พิสูจน์ทฤษฎีบทอัตโนมัติ และ ภาษาศาสตร์เชิง คำนวณ [ 1 ] [ 2 ] [ 3 ]
ประวัติศาสตร์
ชื่อ Prolog ถูกเลือกโดย Philippe Roussel ตามคำแนะนำของภรรยาของเขา โดยเป็นคำย่อของ Programmation en logique (ภาษาฝรั่งเศสแปลว่า การเขียนโปรแกรมด้วย ตรรกะ ) [ 15 ] มันถูกสร้างขึ้นราวปี 1972 โดย Alain Colmerauer ร่วมกับ Philippe Roussel จาก กลุ่มปัญญาประดิษฐ์...
ผลกระทบ
แม้ว่า Prolog จะถูกใช้กันอย่างแพร่หลายในการวิจัยและการศึกษา [ 20 ] แต่ Prolog และภาษาการเขียนโปรแกรมเชิงตรรกะอื่นๆ ก็ไม่ได้มีผลกระทบอย่างมีนัยสำคัญต่ออุตสาหกรรมคอมพิวเตอร์โดยทั่วไป [ 21 ] แอปพลิเคชันส่วนใหญ่มีขนาดเล็กเมื่อเทียบกับมาตรฐานอุตสาหกรรม...
ใช้ในอุตสาหกรรม
Prolog ถูกนำมาใช้ใน Watson Watson ใช้ซอฟต์แวร์ DeepQA ของ IBM และเฟรมเวิร์ก Apache UIMA (Unstructured Information Management Architecture) ระบบนี้เขียนด้วยภาษาต่างๆ รวมถึง Java, C++ และ Prolog และทำงานบน ระบบปฏิบัติการ SUSE Linux Enterprise Server 11 โดยใช้...