"อารัมภบท" เป็นภาษาโปรแกรมหรือพื้นฐานของปัญญาประดิษฐ์ การเขียนโปรแกรมลอจิก พื้นฐานของภาษา Prolog ใช้ที่ไหน?

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

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

อารัมภบทมีเอกลักษณ์ในธรรมชาติ มันปรากฏขึ้นเนื่องจากความบังเอิญอันแสนสุข (โครงสร้างลึกลับของโลก) กาลครั้งหนึ่งในทศวรรษที่ 60 ทฤษฎีการพิสูจน์ทฤษฎีบทอัตโนมัติกำลังพัฒนาอย่างรวดเร็ว และโรบินสันเสนออัลกอริธึมการแก้ปัญหาที่ทำให้สามารถพิสูจน์ทฤษฎีบทที่แท้จริงใดๆ (ได้มาจากสัจพจน์) ในเวลาอันจำกัด (ซึ่งไม่เป็นเช่นนั้น) เป็นที่รู้จัก). ดังที่ปรากฎในภายหลัง นี่เป็นวิธีแก้ปัญหาที่ดีที่สุดสำหรับปัญหาทั่วไป เป็นไปไม่ได้ที่จะพิสูจน์ทฤษฎีบทในการดำเนินการจำนวนจำกัด กล่าวง่ายๆ ก็คือ อัลกอริธึมคือการแวะผ่านช่วงกว้างก่อนของกราฟ (โดยทั่วไปแล้วไม่มีที่สิ้นสุด) โดยธรรมชาติแล้ว ความสามารถในการคาดการณ์การทำงานของอัลกอริธึมนั้นแทบจะเท่ากับ 0 ดังนั้น นี่จึงไม่เหมาะสำหรับภาษาการเขียนโปรแกรมเลย และในขณะนั้น คาลมาโรว์ก็พบปัญหาที่แคบลงอย่างเห็นได้ชัด ต้องขอบคุณการพิสูจน์ทฤษฎีบทบางข้อที่ดูเหมือนเป็นการดำเนินการตามขั้นตอนของโปรแกรม เป็นที่น่าสังเกตว่ากลุ่มของทฤษฎีบทที่พิสูจน์ได้นั้นค่อนข้างกว้างและสามารถใช้ได้กับกลุ่มของปัญหาที่ตั้งโปรแกรมได้อย่างดี นั่นคือวิธีที่ Prolog เกิดขึ้นในปี 1972

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


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

วิธีอ่านโปรแกรมอารัมภบทอย่างถูกต้อง

โปรแกรมการอ่านเป็นเรื่องง่ายมาก เนื่องจากภาษามีสัญลักษณ์และคำสำคัญพิเศษน้อยมาก และแปลเป็นภาษาธรรมชาติได้อย่างง่ายดาย ข้อผิดพลาดหลักของโปรแกรมเมอร์คือเขาต้องการจินตนาการทันทีว่าโปรแกรมทำงานอย่างไร และไม่อ่านสิ่งที่โปรแกรมอธิบาย ดังนั้นสำหรับฉันแล้วดูเหมือนว่าการฝึกสมองที่ไม่มีเมฆของคนธรรมดาจะง่ายกว่าโปรแกรมเมอร์มาก
แนวคิด
ในภาษามี 2 แนวคิด ภาคแสดง(เงื่อนไข) และ วัตถุ(ยังเป็นตัวแปรและเงื่อนไขด้วย) ภาคแสดงแสดงเงื่อนไขบางอย่าง เช่น วัตถุสีเขียวหรือจำนวนเฉพาะ เป็นเรื่องปกติที่เงื่อนไขจะมีพารามิเตอร์อินพุต ตัวอย่างเช่น green_object (วัตถุ), prime_number(จำนวน). จำนวนพารามิเตอร์ในภาคแสดงจะกำหนดความสมบูรณ์ของภาคแสดง วัตถุ- คือ เทอม ค่าคงที่ และตัวแปร ค่าคงที่- นี่คือตัวเลขและสตริง ตัวแปร- แสดงวัตถุที่ไม่รู้จัก อาจเป็นวัตถุที่ถูกค้นหา และกำหนดให้เป็นเส้นด้วย ใหญ่ตัวอักษร ทิ้งเงื่อนไขไว้ก่อนแล้วพิจารณาโปรแกรมที่ง่ายที่สุด
โปรแกรม
โปรแกรมคือชุดกฎของแบบฟอร์ม ถ้าเงื่อนไข 1 และเงื่อนไข 2 และ... เงื่อนไขนั้นเป็นจริงอย่างเป็นทางการ กฎเหล่านี้จะรวมกันผ่าน AND แต่เป็นไปไม่ได้ที่จะได้รับความขัดแย้ง เนื่องจากไม่มีการปฏิเสธเชิงตรรกะใน Prolog และมีเพียงเพรดิเคตเดียว (เงื่อนไข) เท่านั้นที่สามารถปรากฏในการเชื่อมโยง That

ตอบ:- B_1, B_2 กฎ % อ่านว่า: ถ้า B_1 และ B_2 แล้ว A
Odd_prime(ตัวเลข) :- สำคัญ(ตัวเลข), คี่(ตัวเลข)
% ถ้า "Number" เป็นจำนวนเฉพาะและเป็นคี่ ดังนั้น "Number" จึงเป็น Odd_prime

อย่างที่คุณเห็น ชื่อตัวแปรมีขอบเขต - นี่คือกฎ กฎดังกล่าวถูกต้องตามหลักคณิตศาสตร์: สำหรับตัวแปรใด ๆ - "ตัวเลข" หากเป็นจำนวนเฉพาะและคี่ก็จะเป็นจำนวนเฉพาะเท่านั้น ในทำนองเดียวกัน สามารถใช้ถ้อยคำใหม่ได้ดังนี้ หากมี “ตัวเลข” ที่เป็นเลขคี่และจำนวนเฉพาะ แสดงว่ามันคือเลขคี่_ไพรม์ ดังนั้นชื่อตัวแปรจึงมีความสำคัญมาก! หากทางด้านซ้าย (ก่อน:-) เราแทนที่ Number ด้วย Number2 กฎจะเปลี่ยนความหมาย: สำหรับ Number2 และ Number ใดๆ หาก Number เป็นจำนวนเฉพาะและเป็นคี่ จากนั้น Number2 จะเป็นคี่ธรรมดา ปรากฎว่าตัวเลขทั้งหมดเป็นจำนวนเฉพาะเท่านั้น! นี่เป็นข้อผิดพลาดที่พบบ่อยที่สุดใน Prolog

ตอบ:- B_1, B_2 กฎ % อ่านว่า: ถ้า B_1 และ B_2 แล้ว A Odd_prime(Number) :- prime(Number), Odd(Number) % ถ้า "Number" เป็นจำนวนเฉพาะและเป็นคี่ ดังนั้น "Number" จึงเป็น Odd_prime

ตัวอย่าง - จำนวนสมบูรณ์
perfect_number(N) :- หมายเลข(N), sum_of_divisors_without_number(N, SumofDivisors), เท่ากับ(Sum_ofDivisors, H) perfect_number(1) เท่ากับ (วัตถุ, วัตถุ) sum_of_divisors_without_number(1, 1) sum_of_divisors_without_number(หมายเลข, ผลรวม) :- number_previous(หมายเลข, ก่อนหน้า), sum_of_divisors_of_number_to_number(หมายเลข, ผลรวม, ก่อนหน้า) sum_of_number_divisors_to_number(หมายเลข, 1, 1) sum_of_number_divisors_to_number(ตัวเลข, ผลรวม, ตัวหาร) :- หารด้วย (ตัวเลข, ตัวหาร), number_previous(ตัวหาร, ก่อนหน้า), sum_of_number_divisors_to_number(ตัวเลข, SumPrev, ก่อนหน้า), เพิ่ม(SumPrev, ตัวหาร, ผลรวม) sum_of_number_divisors_to_number(ตัวเลข, ผลรวม, ตัวหาร) :- not_divisible_by(ตัวเลข, ตัวหาร), number_previous(ตัวหาร, ก่อนหน้า), sum_of_number_divisors_to_number(ตัวเลข, ผลรวม, ก่อนหน้า)

ขั้นแรก มาอ่านอย่างเป็นทางการว่ากฎหมายถึงอะไร:

  1. ถ้า “H” เป็นตัวเลข และสำหรับ “H” และ “SumDivisors” จะตรงตามเงื่อนไข sum_divisors_without_number หรืออีกนัยหนึ่ง SumDivisors คือผลรวมของตัวหารของตัวเลข “H” และ “H” เท่ากับ “SumDivisors” แล้ว “H” จึงเป็นจำนวนสมบูรณ์
  2. 1 เป็นจำนวนสมบูรณ์ กฎเกณฑ์อาจไม่มีเงื่อนไข ซึ่งในกรณีนี้จะเรียกว่าข้อเท็จจริง
  3. ทุกวัตถุ "O" เท่ากับ "O" โดยหลักการแล้ว มีเพรดิเคตมาตรฐาน "=" แต่คุณสามารถแทนที่ด้วยเพรดิเคตของคุณเองได้ทั้งหมด
  4. ความจริงที่ว่า sum_of_divisors_without_the จำนวน 1 เท่ากับ 1
  5. หากผลรวมของตัวหาร "Number" จนถึงตัวเลขก่อนหน้า "Number" เท่ากับ "Sum" แล้วนี่คือ sum_of_divisors_without_number ดังนั้นจึงแสดงว่าผลรวมของตัวหารของ X น้อยกว่าหรือเท่ากับ Y เนื่องจาก X หารด้วย X ลงตัว เราจึงหา Y = X - 1
  6. ต่อไป เพรดิเคต 3 ตัวจะกำหนดผลรวมของตัวหารที่น้อยกว่าหรือเท่ากับ Y (ตัวหาร) กรณีที่ 1 Y เท่ากับ 1 กรณีที่ 2 Number หารด้วย Y ลงตัว แล้ว sum_of_divisors(X, Y) = sum_of_divisors(X, Y- 1) + Y และกรณีที่ 3 ตัวเลขหารด้วย Y ไม่ได้ ดังนั้น sum_of_divisors(X, Y) = sum_of_divisors(X, Y-1)
โปรแกรมก็เหมือนกับชุดของคำจำกัดความ
มีวิธีที่สองในการอ่านกฎเหล่านี้ โดยใช้หลักคณิตศาสตร์น้อยลงและเป็นธรรมชาติมากขึ้น โดยยึดตาม "คำจำกัดความ" คุณจะสังเกตเห็นว่าใน Prolog กฎทั้งหมดทางด้านซ้าย (ในส่วนนั้น) มีเพียงเงื่อนไขเดียวเท่านั้น ซึ่งโดยพื้นฐานแล้วคือ "คำจำกัดความ" ของเงื่อนไขนี้
ตัวอย่างเช่น กฎข้อที่ 1 คือคำจำกัดความของจำนวนสมบูรณ์ "H" เป็นจำนวนสมบูรณ์ เมื่อ "H" เป็นตัวเลขและผลรวมของตัวหารของ "H" เท่ากับ "H" ภาคแสดงที่เหมือนกันจะถูกจัดกลุ่มตามชื่อโดยใช้เงื่อนไข “หรือ” กล่าวคือ คุณสามารถเพิ่มเข้าไปในคำจำกัดความได้: “H” เป็นจำนวนสมบูรณ์เมื่อ.. หรือเมื่อ “H” เป็น 1

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

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

อ่างน้ำร้อน
อ่างน้ำร้อนมีคำจำกัดความแบบเรียกซ้ำเป็นชุดของวัตถุที่มีชื่อ คำศัพท์ = "ชื่อ"(วัตถุ, วัตถุ, ...) ตัวอย่าง บุคคล("ชื่อ", "นามสกุล"), "+"(1, 2), บุคคล(ที่อยู่("ที่อยู่บางแห่ง"), นามสกุล("นามสกุล"), โทรศัพท์("โทรศัพท์")). หากเราพิจารณาคำศัพท์หนึ่งๆ เป็นแนวคิดทางคณิตศาสตร์ คำนั้นก็คือฟังก์ชัน หรือถ้าให้เจาะจงกว่านั้นคือฟังก์ชัน นั่นคือ “+”(1, 2) หมายความว่ามีวัตถุที่เท่ากับ 1+2 นี่ไม่ได้หมายความว่า 1+2 = 3 เลย ใน Prolog นิพจน์นี้ไม่เป็นความจริง เช่นเดียวกับในกลุ่มของเศษโมดูโล 2 ที่ไม่มี 3 เลย อีกครั้ง จากมุมมองทางคณิตศาสตร์ ตัวแปรเชื่อมโยงกันด้วยคำว่า For All และหากคำนั้นมีอยู่ในคำสั่ง คำว่า (ฟังก์ชัน) จะถูกนำมาใช้เพื่อจุดประสงค์นี้ สำหรับจำนวนใดๆ จะมีจำนวนแฟกทอเรียล: แฟกทอเรียล(X, ข้อเท็จจริง(X))

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

ตัวอย่าง - เลขคณิตจำนวนเต็ม
แนท(0) nat(หมายเลข(หมายเลข)) :- nat(หมายเลข) บวก(0, ตัวเลข, ตัวเลข) บวก(หมายเลข(N1), N2, หมายเลข(Res)) :- บวก(N1, N2, Res) คูณ (0, ตัวเลข, 0) คูณ (หมายเลข (Ch1), Ch2, Res2): - คูณ (Ch1, Ch2, Res), บวก (Res, Ch2, Res2)
  1. คำจำกัดความของคุณสมบัติ nat (จำนวนธรรมชาติ) 0 เป็นจำนวนธรรมชาติ ถ้า Number เป็นธรรมชาติก็จะมีหมายเลขอ็อบเจ็กต์ (Number) ซึ่งเป็นจำนวนธรรมชาติด้วย ในทางคณิตศาสตร์ คำว่า "ตัวเลข" แสดงถึงฟังก์ชัน +1 จากมุมมองของการเขียนโปรแกรม "หมายเลข" เป็นโครงสร้างข้อมูลแบบเรียกซ้ำ ต่อไปนี้เป็นองค์ประกอบ: หมายเลข (0) หมายเลข (หมายเลข (0)) หมายเลข (หมายเลข (หมายเลข(0))).
  2. อัตราส่วนบวกคือ 0 + จำนวน = จำนวน ถ้า Ch1 + Ch2 = Res ดังนั้น (Ch1+1) + Ch2 = (Res+1)
  3. อัตราส่วนในการคูณคือ 0 * จำนวน = 0 ถ้า Ch1 * Ch2 = Res และ Res + Ch2 = Res2 ดังนั้น (Ch1+1) * Ch2 = Res2
แน่นอนว่าข้อความเหล่านี้เป็นจริงสำหรับเลขคณิตธรรมดา แต่ทำไมเราไม่รวมข้อความที่ชัดเจนแบบเดียวกับ Number + 0 = Number คำตอบนั้นง่าย: ความซ้ำซ้อนนั้นแย่มากไม่ว่าจะด้วยคำจำกัดความใดก็ตาม ใช่ สิ่งนี้สามารถช่วยในการคำนวณ ซึ่งเป็นการปรับให้เหมาะสมก่อนเวลาอันควร แต่ผลข้างเคียงอาจมีความขัดแย้งในคำจำกัดความ ผลลัพธ์ที่ไม่ชัดเจนของคำสั่ง และการวนซ้ำของล่าม

Prolog เข้าใจเพรดิเคตอย่างไรและพิสูจน์ข้อความได้อย่างไร

แน่นอนว่าการอ่านโปรแกรมช่วยให้เข้าใจสไตล์ Prolog แต่ก็ไม่ได้ทำให้ชัดเจนว่าเหตุใดจึงใช้คำจำกัดความเหล่านี้ได้ ตัวอย่างที่ให้ไว้ข้างต้นไม่สามารถเรียกได้ว่าเป็นโปรแกรมที่มีคุณสมบัติครบถ้วน เนื่องจากมีจุดเริ่มต้นไม่เพียงพอ จุดเริ่มต้นของ Prolog คือการสืบค้น ซึ่งคล้ายคลึงกับการสืบค้นกับฐานข้อมูล SQL หรือคล้ายคลึงกับการเรียกใช้ฟังก์ชันหลักในการเขียนโปรแกรมเชิงฟังก์ชัน ตัวอย่างคำค้นหา: nat(Number) - ค้นหาจำนวนธรรมชาติ บวก (0, 0, ผลลัพธ์) - ค้นหาผลลัพธ์ของการบวก 0 และ 0 ในตัวแปร Result, nat(0) - ตรวจสอบว่า 0 เป็นจำนวนธรรมชาติหรือไม่ ฯลฯ .

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

ลองดูตัวอย่างคำขอ บวก(0, 0, ผลลัพธ์) :
1. เราพบการจับคู่ (ประเภทของการจับคู่รูปแบบ ความละเอียด) ของคำขอนี้โดยมีส่วนด้านซ้ายของกฎข้อใดข้อหนึ่ง สำหรับแบบสอบถามนี้ ให้บวก (0, ตัวเลข, ตัวเลข) ลองเชื่อมโยงอาร์กิวเมนต์คิวรีทั้งหมดกับกฎทีละรายการแล้วรับ: 0 = 0, 0 = ตัวเลข, ผลลัพธ์ = ตัวเลข สมการเหล่านี้เกี่ยวข้องกับตัวแปร 2 ตัว (ตัวเลขและผลลัพธ์) การแก้สมการเหล่านั้นทำให้เราได้ Number = Result = 0 เนื่องจากกฎนี้ไม่มีเงื่อนไข เราจึงได้รับคำตอบสำหรับคำถามที่ถาม คำตอบ: ใช่และผลลัพธ์ = 0

ขอ แนท(หมายเลข) :
1. เราค้นหาการจับคู่ครั้งแรกกับกฎ ซึ่งก็คือกฎ nat(0) โดยการแก้สมการโดยการโต้ตอบ หรืออีกนัยหนึ่งคือ เมื่อหาความละเอียด เราจะได้ Number = 0 คำตอบ: ใช่ และ Number = 0

ขอ บวก(ผลลัพธ์, 0, หมายเลข (0)) :
1. ค้นหาวิธีแก้ปัญหาด้วยกฎบวก (0, ตัวเลข, ตัวเลข): ​​ผลลัพธ์ = 0, 0 = ตัวเลข, ตัวเลข (0) = ตัวเลข, แต่ (!) ตัวเลข = 0 = ตัวเลข (0) - เป็นไปไม่ได้เนื่องจาก 0 คือ หมายเลขเดียวกัน (0) ดังนั้นเราจึงหาข้อยุติด้วยกฎเกณฑ์ต่อไปนี้
2. ค้นหาความละเอียดด้วยกฎบวก (หมายเลข (N1), N2, หมายเลข (Res)) เราจะได้ตัวเลข (N1) = ผลลัพธ์, N2 = 0, จำนวน (Res) = จำนวน (0) ดังนั้น Res = 0 กฎนี้มีเงื่อนไขที่เราต้องตรวจสอบโดยคำนึงถึงผลลัพธ์ของการแก้ปัญหา (ค่าตัวแปร) บวก(Ch1, Ch2, Res) -> บวก(Ch1, 0, 0) เราจดจำค่าของตัวแปรบนสแต็กและสร้างคำขอใหม่ บวก(H1, 0, 0)
3*. การแก้ปัญหาแบบสอบถาม บวก(X1, 0, 0) เราค้นหาความละเอียดด้วยเครื่องหมายบวก (0, ตัวเลข, ตัวเลข) และรับ X1 = 0 และตัวเลข = 0
4. เรากลับตามสแต็กไปยังตัวแปรก่อนหน้า Result = number(N1) = number(0) พบคำตอบหมายเลข (0) ดังนั้นเครื่อง prolog จึงสามารถแก้สมการ X + 0 = 1 ได้

การรวบรวมกฎอย่างมีความสามารถในภาษา Prolog เป็นสิ่งที่ยากมาก แต่ถ้าคุณเขียนกฎเหล่านั้นให้กะทัดรัด คุณไม่เพียงจะได้รับคำตอบและวิธีแก้ปัญหาโดยตรงเท่านั้น แต่ยังได้รับคำตอบย้อนกลับด้วย

ตัวอย่างคำขอ บวก(ตัวเลข, ตัวเลข, ตัวเลข) : คำตอบคือ ใช่ จำนวน = 0

ตัวอย่างคำขอ บวก(0, 0, 0) : คำตอบคือไม่ ในความพยายามครั้งแรก ความละเอียดทั้งหมดไม่บรรลุผล

ตัวอย่างคำขอ บวก(ตัวเลข, ตัวเลข, ตัวเลข(ตัวเลข)) : คำตอบคือ ใช่ จำนวน = 1 กำลังแก้สมการ X + X = X + 1

ลองส่งออกสำหรับการคูณ (ตัวเลข, ตัวเลข (0), ตัวเลข (0)) ซึ่งจะต้องกดตัวแปรลงบนสแต็ก 2 ครั้งแล้วคำนวณแบบสอบถามใหม่ สาระสำคัญของเครื่อง Prolog คือคุณสามารถทิ้งผลลัพธ์ที่ 1 ได้ จากนั้น Prolog จะกลับสู่สถานะก่อนหน้าและคำนวณต่อ ยกตัวอย่างคำขอ แนท(หมายเลข) อันดับแรกจะใช้กฎที่ 1 และเอาต์พุต 0 จากนั้นใช้กฎที่ 2 + กฎที่ 1 และเอาต์พุตตัวเลข (0) คุณสามารถทำซ้ำและรับลำดับอนันต์ของจำนวนธรรมชาติทั้งหมด อีกตัวอย่างหนึ่งขอ บวก(ตัวเลข, ตัวเลข(0), ตัวเลข2) จะสร้างลำดับของคู่คำตอบทั้งหมดของสมการ X + 1 = Y

บทสรุป

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

ในบทความถัดไป ฉันอยากจะพูดถึงวิธีแก้ไขปัญหาในการคัดแยก ลำดับของการถ่ายเลือด มารยาทที่ไม่เหมาะสม และปัญหาเชิงตรรกะอื่น ๆ ที่รู้จักกันดี ส่วนใครที่ไม่พอใจก็อยากนำเสนอ งานต่อไป (คนแรกที่ไขรางวัลได้):
เขียนภาคแสดงซึ่งจะสร้างลำดับอนันต์ของจำนวนธรรมชาติ เริ่มต้นด้วย 3 ซึ่งควรเป็นตัวเลขมาตรฐานใน Prolog การดำเนินการที่ดำเนินการโดยใช้ภาคแสดง: X คือ 3 + 1 => X=4

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

ในเดือนตุลาคม พ.ศ. 2524 กระทรวงการค้าระหว่างประเทศและอุตสาหกรรมของญี่ปุ่นได้ประกาศจัดตั้งองค์กรวิจัย - สถาบันศูนย์วิจัยเทคโนโลยีคอมพิวเตอร์รุ่นใหม่ เป้าหมายของโครงการนี้คือการสร้างระบบประมวลผลข้อมูลบนฐานความรู้ สันนิษฐานว่าระบบเหล่านี้จะให้ความสะดวกในการจัดการเนื่องจากความสามารถในการสื่อสารกับผู้ใช้โดยใช้ภาษาธรรมชาติ ระบบเหล่านี้ควรจะเป็นการเรียนรู้ด้วยตนเอง ใช้ความรู้ที่สะสมอยู่ในหน่วยความจำเพื่อแก้ไขปัญหาประเภทต่างๆ ให้คำแนะนำแก่ผู้ใช้ และผู้ใช้ไม่จำเป็นต้องเป็นผู้เชี่ยวชาญด้านวิทยาการคอมพิวเตอร์ สันนิษฐานว่าบุคคลจะสามารถใช้คอมพิวเตอร์รุ่นที่ 5 ได้อย่างง่ายดายพอๆ กับเครื่องใช้ไฟฟ้าในครัวเรือน เช่น โทรทัศน์ เครื่องบันทึกเทป และเครื่องดูดฝุ่น ไม่นานหลังจากโครงการของญี่ปุ่น โครงการในอเมริกาและยุโรปก็เริ่มต้นขึ้น

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

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

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

ชื่อภาษา "Prolog" มาจากคำว่า การเขียนโปรแกรมลอจิก(PROgrammation en LOGique เป็นภาษาฝรั่งเศส และ PROgramming ใน LOGic เป็นภาษาอังกฤษ)

อารัมภบทมีพื้นฐานอยู่บนสาขาของตรรกะทางคณิตศาสตร์เช่น แคลคูลัสในภาคแสดง. พื้นฐานของมันคือขั้นตอนการพิสูจน์ทฤษฎีบท วิธีการแก้ปัญหาสำหรับ ประโยคแตร. การบรรยายครั้งต่อไปจะเน้นในหัวข้อนี้

ในประวัติศาสตร์ของการเกิดขึ้นและการพัฒนาของภาษา Prolog สามารถแยกแยะขั้นตอนต่อไปนี้ได้

ในปีพ.ศ. 2508 ในบทความเรื่อง "A machine cient logic based on the Resolution Principle" ซึ่งตีพิมพ์ในวารสาร ACM ฉบับที่ 12 เจ. โรบินสันได้นำเสนอวิธีการสำหรับการค้นหาการพิสูจน์ทฤษฎีบทโดยอัตโนมัติในแคลคูลัสภาคแสดงลำดับที่ 1 ที่เรียกว่า " หลักการแก้ปัญหา" งานนี้สามารถอ่านได้ในการแปล: Robinson J. ตรรกะเชิงเครื่องจักรอิงจาก หลักการลงมติ// คอลเลกชันไซเบอร์เนติกส์ - ฉบับที่ 7 (1970) ในความเป็นจริง แนวคิดสำหรับวิธีนี้ถูกเสนอโดย Herbrand ในปี 1931 เมื่อยังไม่มีคอมพิวเตอร์ (Herbrand, "Une methode de demo", These, Paris, 1931) โรบินสันแก้ไขวิธีนี้เพื่อให้เหมาะสมกับการใช้งานอัตโนมัติ การใช้คอมพิวเตอร์ และนอกจากนี้ ยังได้พัฒนาอัลกอริธึมการรวมที่มีประสิทธิภาพซึ่งเป็นพื้นฐานของวิธีการของเขา

ในปี 1973 "กลุ่มปัญญาประดิษฐ์" นำโดย Alain Colmeroe ได้สร้างโปรแกรมที่มหาวิทยาลัย Marseille ซึ่งออกแบบมาเพื่อพิสูจน์ทฤษฎีบท โปรแกรมนี้ใช้เพื่อสร้างระบบประมวลผลข้อความภาษาธรรมชาติ โปรแกรมพิสูจน์ทฤษฎีบทเรียกว่า Prolog (จาก Programmation en Logique) มันทำหน้าที่เป็นต้นแบบสำหรับอารัมภบท ตำนานเล่าว่าผู้เขียนชื่อนี้คือภรรยาของอลัน โคลเมโร โปรแกรมนี้เขียนด้วยภาษา Fortran และทำงานค่อนข้างช้า

งานของ Robert Kowalski มีความสำคัญอย่างยิ่งต่อการพัฒนาการเขียนโปรแกรมลอจิก ตรรกะภาคแสดงยังไง ภาษาโปรแกรม"(Kowalski R. Predicate Logic as Programming Language. IFIP Congress, 1974) ซึ่งเขาแสดงให้เห็นว่าเพื่อที่จะบรรลุประสิทธิภาพ เราต้องจำกัดตัวเองให้ใช้ชุด ประโยคแตร. เป็นที่รู้กันว่า Kowalski และ Colmeroe ทำงานร่วมกันในช่วงฤดูร้อนปีหนึ่ง

ในปี 1976 Kowalski ร่วมกับเพื่อนร่วมงานของเขา Maarten van Emden เสนอแนวทางสองประการในการอ่านข้อความโปรแกรมลอจิก: ขั้นตอนและการประกาศ แนวทางเหล่านี้จะกล่าวถึงในการบรรยายครั้งที่สาม

ในปี 1977 ในเมืองเอดินบะระ Warren และ Pereira ได้สร้างคอมไพเลอร์ Prolog ที่มีประสิทธิภาพมากสำหรับคอมพิวเตอร์ DEC-10 ซึ่งทำหน้าที่เป็นต้นแบบสำหรับการใช้งาน Prolog ในภายหลัง ที่น่าสนใจคือ

การบรรยายเน้นการแก้ปัญหาโดยใช้กราฟพื้นที่รัฐ พื้นที่สถานะอธิบายไว้ในรูปแบบของชุดของสถานะ - จุดยอดของกราฟ ชุดของการเปลี่ยนจากรัฐหนึ่งไปอีกรัฐหนึ่ง - ส่วนโค้งของกราฟ ชุดของสถานะเริ่มต้น และชุดของสถานะสุดท้าย การแก้ปัญหาจะแสดงเป็นเส้นทางบนกราฟพื้นที่รัฐที่เชื่อมต่อสถานะเริ่มต้นกับสถานะสุดท้าย หากพื้นที่สถานะของปัญหามีขนาดเล็ก ก็จะพบวิธีแก้ปัญหาที่ดีที่สุดทั้งหมดโดยใช้การค้นหาเชิงลึกเป็นอันดับแรก ในปัญหาเกี่ยวกับพื้นที่รัฐขนาดใหญ่ จะมีการคำนวณวิธีแก้ปัญหาที่ดีที่สุดเพียงวิธีเดียวเท่านั้นผ่านการค้นหาแบบกว้างก่อน ตัวแก้ปัญหาแบบสากลใช้กับปัญหา รัฐในงานที่แตกต่างกันสามารถอยู่ในโดเมนที่แตกต่างกันได้ เพื่อจดจำวิธีแก้ปัญหาที่ดีที่สุดที่พบ จึงมีการใช้ varM "ตัวแปรตัวแปร" คอมไพเลอร์จะค้นหาประเภทที่จำเป็นเอง Visual Prolog เวอร์ชัน 7.5 ยังไม่ได้เผยแพร่ มีการวางแผนเผยแพร่ในปี 2014 แต่ยังไม่ทราบวันที่แน่นอน Visual Prolog 7.4 พร้อมให้ทุกคนใช้งานได้แล้ว

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

การเขียนโปรแกรมที่จำเป็นในทางปฏิบัติกลับกลายเป็นว่ามีแนวโน้มมากขึ้น “Prolog” ประสบความสำเร็จในฐานะภาษาโปรแกรม แต่ไม่ได้เป็นพื้นฐานสำหรับปัญญาประดิษฐ์

การเขียนโปรแกรมคลาสสิกกับตรรกะ

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

ข้อเท็จจริงนี้ให้เหตุผลที่ลวงตามาโดยตลอดในการพิจารณาการสร้างเครื่องมือในการตัดสินใจให้เป็นเรื่องง่าย ด้วยการถือกำเนิดของ Prologue ดูเหมือนว่าปัญหาของปัญญาประดิษฐ์จะเป็นเรื่องของเทคโนโลยี และ Homo sapiens ก็เกิดกฎสามข้อของวิทยาการหุ่นยนต์ขึ้น อย่างไรก็ตามปัญญาประดิษฐ์ยังคงเป็นผีอยู่และกฎทั้งสามของหุ่นยนต์กลับกลายเป็นว่ามาจากเทพนิยาย - "ทำนี่ฉันไม่รู้ว่าอะไร"

การเขียนโปรแกรมในความหมายคลาสสิก (มักใช้คำว่า "ขั้นตอน" "ความจำเป็น" หรือ "การทำงาน") ได้พัฒนาและประสบความสำเร็จในการเอาชนะ "เวลาที่มีปัญหา" ของยุค 80-90 เมื่อมีภาษาการเขียนโปรแกรมมากมายนับไม่ถ้วน

การต่อสู้สาธิตระหว่าง “ปาสคาล” และ “ศรี” กินเวลายาวนานและโหดร้าย แต่จบลงอย่างเป็นกลางและเงียบๆ สิ่งที่เหลืออยู่คือแนวคิดเกี่ยวกับภาษาการเขียนโปรแกรมที่ดีและการใช้งานที่ประสบความสำเร็จหลายประการ

นี่ไม่ได้เป็นการบอกว่า Prolog ในฐานะภาษาการเขียนโปรแกรมยังไม่มีการพัฒนา แต่เขาไม่บรรลุเป้าหมายที่ตั้งไว้ วันนี้เราไม่เพียงแต่พูดได้ แต่ยังพิสูจน์ได้ว่า "อารัมภบท" เป็นภาษาวิชาการสำหรับ:

  • วัตถุประสงค์การเรียนรู้;
  • ตรรกะภาคแสดง;
  • คณิตศาสตร์;
  • แอปพลิเคชันที่แคบ

เป็นที่น่าสงสัยว่าการยืนยันนี้สามารถหักล้างได้ ปัญญาประดิษฐ์ไม่เพียงแต่ใช้กันอย่างแพร่หลายเท่านั้น แต่ยังเป็นเหตุการณ์ร้ายแรงที่เปลี่ยนแปลงโครงสร้างทางสังคมและภาพของโลกอย่างรุนแรงอีกด้วย

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

ความเป็นจริงตามวัตถุประสงค์คือ: ไม่ใช่ผู้ที่แข็งแกร่งที่สุดเท่านั้นที่รอดชีวิต แต่เป็นสิ่งที่อยู่ในความต้องการและเกี่ยวข้อง

"Prolog" เป็นภาษาโปรแกรมที่ประกาศ

การมีเครื่องมือในการอธิบายข้อเท็จจริงและกฎเกณฑ์เป็นสิ่งที่ดี แต่ประเด็นคืออะไร ข้อเท็จจริงและกฎเกณฑ์ที่ลงตัวกับฐานข้อมูลปกติ โปรแกรมเมอร์คลาสสิกที่มีคุณสมบัติเหมาะสมจะจัดเตรียมบทสนทนาเชิงโต้ตอบให้กับผู้ใช้ และโปรแกรมเมอร์จะแก้ปัญหาของเขา

หากจำเป็น โปรแกรมเมอร์จะปรับแต่งบทสนทนา และผู้ใช้จะเสริมฐานข้อมูลข้อเท็จจริงและกฎเกณฑ์ ตัวเลือกที่ใช้งานได้จริงและผ่านการทดสอบมานานหลายทศวรรษสำหรับการนำปัญหาที่ได้รับการแก้ไขและแก้ไขแล้วจำนวนมากไปใช้งาน

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

"Prolog" เป็นภาษาโปรแกรมคือข้อเท็จจริง:

  • แม่ (มาเรีย, นาตาชา); - มาเรีย - แม่ของนาตาชา;
  • พ่อ (Evgeniy, Marina); - Evgeniy เป็นพ่อของ Marina

ที่นี่ข้อเท็จจริงก็เกินความจริงทันที: "Maria" และ "Marina" เป็นชื่อที่แตกต่างกัน ไม่มีอะไรขัดขวางคุณจากการเพิ่มข้อเท็จจริง:

  • พ่อ (ยูจีน, มาเรีย); - Evgeniy เป็นพ่อของ Maria

คำอธิบายเหล่านี้ช่วยให้กฎต่างๆ มีชีวิตชีวา:

  • ผู้ปกครอง(x,y)<- папа (x, y);
  • ผู้ปกครอง(x,y)<- мама (x, y);

แต่พวกเขาไม่อนุญาตให้เราสรุปว่าพ่อเป็นพ่อของมารีน่า และมารีน่าเป็นแม่ของมาเรีย ปัญหานี้สามารถแก้ไขได้ คุณสามารถเพิ่มกฎอีกหนึ่งข้อ เพิ่มข้อเท็จจริงอีกหนึ่งข้อ แต่ควรดำเนินการเหล่านี้กี่ครั้งในสถานการณ์จริง?

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

ครอบครัวอารัมภบท

ฝรั่งเศสถือเป็นบ้านเกิดของอารัมภบท และปี 1973 เป็นปีเกิด ความสนใจในภาษาได้รับการต่ออายุเป็นระยะ แต่ลดลงด้วยความมั่นคงที่น่าอิจฉา คำขวัญของภาษา: “ตรรกะภาคแสดงเป็นระดับประถมศึกษา! นี่เป็นวิธีอธิบายวิธีการคิด” - และยังคงเป็นคติประจำใจ

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

การเขียนโปรแกรมใดก็ตามเป็นเรื่องเกี่ยวกับข้อมูลและการประมวลผล โครงสร้างภาษาต้องอธิบายปัญหาที่กำลังแก้ไขอย่างถูกต้องที่สุดเท่าที่จะเป็นไปได้ ซึ่งเป็นสาเหตุที่การใช้งาน Prolog ที่รู้จักทั้งหมด: Turbo Prolog, Win Prolog, SWI Prolog, GNU Prolog, Visual Prolog และอื่นๆ มีนอกเหนือไปจากโครงสร้างที่ประกาศแล้ว นิพจน์ที่จำเป็นทั่วไป

เชื่อกันว่าตระกูล Prologue ได้รับการพัฒนาในองค์กรวิชาการและการวิจัย ดังนั้นจึงสามารถพูดได้เป็นภาษากลางในเชิงแนวคิดเท่านั้น อย่างไรก็ตาม ความจริงที่ว่าแนวคิดของ "Prolog" ยังมีชีวิตอยู่และกำลังพัฒนานั้นสามารถพิจารณาได้: ภาษานี้มีขอบเขตและเป็นที่ต้องการในงานบางประเภท

พื้นฐานของปัญญาประดิษฐ์

ความสนใจในปัญญาประดิษฐ์ไม่เคยลดลง พวกเขาเพิ่งเริ่มพูดถึงมันเมื่อโอกาสต่อไปเกิดขึ้น แต่ Prolog ไม่เคยเกี่ยวข้องกับปัญญาประดิษฐ์มากไปกว่าภาษาโปรแกรมคลาสสิกทั่วไป

ในช่วงปลายยุค 80 มีโครงการทางปัญญาที่แท้จริงที่เกี่ยวข้องและได้รับความนิยม "The Inventing Machine" มีความพยายามอย่างแท้จริงในการใช้ Prolog เพื่อสร้างฐานความรู้เชิงปฏิบัติขนาดใหญ่ (ข้อมูล) เกี่ยวกับการประดิษฐ์ กฎหมายทางกายภาพ เคมี และกฎหมายอื่น ๆ

ไม่บรรลุผล ต้องเขียนข้อเท็จจริงและกฎเกณฑ์มากเกินไปใน Prolog ในฐานะภาษาโปรแกรมซึ่งมีความจำเป็นซ้ำซาก ในขณะเดียวกัน ผลิตภัณฑ์ซอฟต์แวร์ที่ประสบความสำเร็จจำนวนมากได้ถูกนำไปใช้ควบคู่ไปกับภาษาธรรมดา

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

ระบบทางปัญญานี้ไม่เพียง แต่ "เข้าใจ" ว่าแม่และพ่อคืออะไรและมาเรียแตกต่างจากมาริน่าอย่างไร แต่ยังกระโดดจากความรู้ที่ได้รับเกี่ยวกับประเด็นเหล่านี้ไปยังลูกบอลและความแตกต่างจากลูกบาศก์ไปเป็นสีของ วัตถุและ... (!) สำหรับคณิตศาสตร์ระดับประถมศึกษา: การดำเนินการทางคณิตศาสตร์อย่างง่ายกลายเป็นความสามารถของเธอโดยอาศัยความรู้ที่ได้รับจากการแก้ปัญหาที่แตกต่างไปจากเดิมอย่างสิ้นเชิง

ไม่มีใครพูดได้ว่าการเขียนโปรแกรมแบบคลาสสิกนั้นล้ำหน้า Prolog ในแง่ของการเรียนรู้ขอบเขตของปัญญาประดิษฐ์ แต่มันให้ผลลัพธ์ที่แท้จริง

สำหรับความฉลาดในฐานะงาน เห็นได้ชัดว่าคำถามนี้ไม่ได้อยู่ที่ภาษา แต่อยู่ในแนวคิดของการนำไปปฏิบัติ ถ้าแอสเซมเบลอร์ปี 1991 สามารถ "กลายเป็นพื้นฐาน" สำหรับระบบอัจฉริยะของข่าวกรองสถานการณ์ได้ แสดงว่าปัญหาไม่ได้อยู่ที่ภาษาการนำไปใช้อย่างชัดเจน แต่อยู่ในแนวคิด

ภาษาโปรแกรมโปรล็อกเป็นหนึ่งในภาษาโปรแกรมลอจิกชั้นนำ สร้างสรรค์โดย Alain Colmerauer ในปี 1970 เป็นความพยายามที่จะสร้างภาษาโปรแกรมสำหรับผู้เริ่มต้นซึ่งทำให้สามารถแสดงตรรกะได้ แทนที่จะระบุอย่างรอบคอบถึงสิ่งที่คุณต้องการบรรลุด้วยคำแนะนำบนหน้าจอคอมพิวเตอร์

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

คำนำมีพื้นฐานมาจากแคลคูลัสภาคแสดง (หรือแม่นยำกว่าคือแคลคูลัสภาคแสดงลำดับแรก) แต่จำกัดอยู่เพียงสูตรของฮอร์น โปรแกรมอารัมภบทมีประสิทธิภาพในการพิสูจน์ทฤษฎีบทด้วยการประมาณครั้งแรก แนวคิดพื้นฐานของการรวม การเรียกซ้ำส่วนท้าย และการติดตาม

ชนิดข้อมูล

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

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

การใช้งาน Prolog ส่วนใหญ่ไม่ได้แยกความแตกต่างระหว่างจำนวนจริงและเศษส่วน

ตัวแปร

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

ตัวแปรที่ไม่ระบุตัวตนที่เรียกว่าจะถูกเขียนด้วยขีดล่างเดียว (_)

ข้อกำหนดเป็นวิธีเดียวที่ Prolog สามารถแสดงข้อมูลที่ซับซ้อนได้ คำนี้ประกอบด้วยส่วนหัว หรือที่เรียกว่าฟังก์ชัน (ซึ่งต้องเป็นอะตอม) และพารามิเตอร์ (ไม่จำกัดเฉพาะประเภท) จำนวนพารามิเตอร์หรือที่เรียกว่า ariities ของคำนี้มีความสำคัญ คำศัพท์ถูกกำหนดโดย head และ arity ซึ่งมักจะเขียนเป็น functor/arity
รายการ

รายการไม่ใช่ชนิดข้อมูลแบบสแตนด์อโลน เนื่องจากถูกกำหนดโดยการสร้างแบบเรียกซ้ำ (โดยใช้คำว่า /2 "."):

อะตอม - รายการว่าง

เพื่อความสะดวกของโปรแกรมเมอร์ รายการสามารถสร้างและทำลายได้หลายวิธี

ถ้า L เป็นรายการและ X เป็นองค์ประกอบ ดังนั้น "." (X,L) เป็นสมาชิกของรายการ องค์ประกอบแรก X ตามด้วยเนื้อหาของบริบท L จะถูกแสดงทางวากยสัมพันธ์เป็น

เพื่อความสะดวกของโปรแกรมเมอร์ รายการสามารถสร้างและทำลายได้หลายวิธี

รายการสินค้า:
คำนำขององค์ประกอบหนึ่ง:
องค์ประกอบหลายประการเบื้องต้น:
นามสกุลคำ: "."(abc, "."(1, "."(f(x), "."(Y, "."(g(A,rst), )))))

โดยทั่วไปสตริงจะเขียนเป็นลำดับของอักขระภายในเครื่องหมายคำพูด มักแสดงเป็นรายการรหัสอักขระ ASCII

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

โดยที่ "แมว" เป็นหัว และ "ทอม" เป็นอาร์กิวเมนต์ ต่อไปนี้เป็นตัวอย่างแบบสอบถามที่คุณสามารถเรียกใช้โดยใช้โปรแกรมแปล Prolog ตามข้อเท็จจริงนี้:

แมว(ทอม).
ใช่.

แมว(X)
X = ทอม;
เลขที่.

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

พ่อ(แซลลี่,แพท)
พ่อ(แพท,แซลลี่).

“พ่อ” ในทั้งสองกรณีคือหัวหน้า ส่วน “แซลลี่” และ “แพท” เป็นข้อโต้แย้ง อย่างไรก็ตาม ในกรณีแรก Sally อยู่ในอันดับที่หนึ่งในรายการข้อโต้แย้ง และ Pat อยู่ในอันดับที่สองและในทางกลับกัน กรณีแรกคือตัวอย่างของคำจำกัดความในลำดับ Verb Subject and Object แต่ในตัวอย่างที่สอง ลำดับคือ Verb Object Subject เนื่องจาก Prolog ไม่เข้าใจภาษาอังกฤษ ทั้งสองเวอร์ชันก็ใช้ได้ทั้งสองเวอร์ชัน แต่ถือเป็นรูปแบบการเขียนโปรแกรมที่ดีที่จะยึดติดกับสไตล์เดียวที่เรียกว่าแบบแผนในขณะที่เขียนโปรแกรมเดียว แทนที่จะต้องเขียนบางอย่างเช่น:

พ่อ(แพท,แซลลี่). พ่อ(เจสสิก้า,เจมส์)

เพรดิเคตบางตัวถูกสร้างขึ้นในภาษาและอนุญาตให้ Prolog ลดความน่าเบื่อหน่ายของกิจกรรมในแต่ละวัน (เช่น อินพุต/เอาท์พุตโดยใช้กราฟิกและการสื่อสารอื่น ๆ กับระบบปฏิบัติการ) ตัวอย่างเช่น เพรดิเคตการเขียนสามารถใช้เพื่อแสดงผลดังนี้:

เขียน ("สวัสดี")

จะแสดงคำว่า "สวัสดี" บนหน้าจอ

กฎ

คำสั่งประเภทที่สองใน Prolog คือกฎ กฎตัวอย่าง:

แสง (เปิด) :- สวิตช์ (เปิด)

":-" หมายถึง "ถ้า" กฎนี้หมายถึงแสง (เปิด) เป็นจริง (เปิด) หากสวิตช์ (เปิด) เป็นจริง (มิฉะนั้นหากสวิตช์เปิดอยู่ก็จะมีแสงสว่าง) กฎยังสามารถใช้ตัวแปรได้ ตัวแปรจะขึ้นต้นด้วยตัวพิมพ์ใหญ่ ในขณะที่ค่าคงที่จะขึ้นต้นด้วยอักษรตัวพิมพ์เล็ก ตัวอย่างเช่น,

พ่อ(X,Y) :- พ่อแม่(X,Y),ชาย(Y)

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

ซึ่งเทียบเท่ากับประกาศหลายฉบับ:

ตอบ:- ง. ข:- ง. ซีดี.

แต่คำแนะนำเช่น:

ซึ่งเทียบเท่ากับ "ถ้า c แล้ว a หรือ b" นี่เป็นเพราะข้อจำกัดที่กำหนดโดยสูตรของฮอร์น