อารัมภบทการเขียนโปรแกรมเชิงตรรกะของ Mova การเขียนโปรแกรม Mova Prolog (Prolog) บ่มภายใต้โปรแกรม

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

ฉันดูการตัดสินใจของงานที่ง่ายที่สุดบน Proloz

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

เหตุใดจึงมีโครงการดังกล่าวน้อย
- ถึงนักโปรแกรมเมอร์ จามรี volodyut Prologue น้อยมาก ไม่ใช่แค่กับคนที่ไม่ได้ฝึกโยคะ แต่กับคนที่ไม่หัดเขียน โปรแกรมใหม่. เหตุผลหลักคือคนไม่มีความเข้าใจที่ชัดเจน ในบางสถานการณ์เป็นการดีที่สุดที่จะชนะ บ่อยครั้ง เป็นไปได้ที่จะเขียนทุกอย่างในภาษาใหม่ รวมทั้งแป้นพิมพ์ลัดและเมาส์ โดยที่โค้ดจะออกมาเร็วกว่านี้ ต่ำกว่า C

ทำไมไม่มีโหมดสลีปใน Prolog?
- Vono є. นี่คือความเฉพาะเจาะจงของภาพยนตร์ที่คุณหลงรักในสื่อวิชาการไปแล้ว (ระบบ Prolog เพิ่มเติมถูกเขียนขึ้นในมหาวิทยาลัยต่างๆ และนอกจากนี้ ทางมหาวิทยาลัยจะเขียน Prologue ของคุณเองด้วยหรือไม่) ซึ่งใครๆ ก็พูดได้ ความทุกข์ทรมานและความซบเซาของภาพยนตร์ Varto หมายความว่าการนอนหลับไม่ค่อยดีนัก แต่จงรักภักดีมากกว่า: แทบทุกประเภทภาษารู้ภาษาของตนเองในภาษาสมัยใหม่ (Lisp, ML -> F#, Scala; Smalltalk -> Java, Scala (ตัวแทน), สคริปต์ -> Ruby ), อารัมภบท.

ฉันคิดว่าใครจะติด mirkuvan เชิงปรัชญาและคุณสามารถใส่ก้นจริงได้ :)

เช่น กดใบเสร็จเพื่อรับรางวัล

ก้น No. 1 - ค้นหาตัวเลขที่สมบูรณ์แบบ

แอปพลิเคชันใดต้องการภาคแสดง is/2 X คือ 3 + 1 * 2- คำนวณจำนวนคำที่ถนัดขวาและทำให้เกิดการเปลี่ยนแปลงของความชั่วร้าย แรงดึงดูด (!) และความแข็งคือ X = 7 วลีที่ดูเหมือนง่ายกว่า X = 7, X = 3 - ไม่มีวิธีแก้ปัญหา oskilka X สามารถเป็น 7 และ 3 ได้ในเวลาเดียวกัน
ดังนั้นเราจึงต้องการการสิ้นสุดของคำสั่งจากหัวข้อหน้า งานคือการเขียนเพรดิเคต ซึ่งจะสร้างจำนวนสองธรรมชาติทั้งหมด แกนของการตัดสินใจ:
จำนวนเต็ม(0). ints(X) :- ints(Y), X คือ Y + 1
อันที่จริงนี่คือเวอร์ชันที่ประกาศของภาคแสดงจำนวนเต็ม/1 มาตรฐาน ซึ่งแทนที่ว่าอาร์กิวเมนต์เป็นจำนวนเต็ม ปัญหาของเพรดิเคตมาตรฐานที่ win นั้นใช้ได้สำหรับการสื่อสารคือ: - integer (1) และไม่ถูกต้องสำหรับ comm integer (X)

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

อย่าพยายามอธิบายคำแนะนำสำหรับวิธีแก้ปัญหา ยอมรับว่าคุณรู้วิธีแก้ปัญหาแล้ว และงานของคุณมีแนวโน้มที่จะบิดเบือนว่าพบวิธีแก้ปัญหาแล้ว

ไม่น่าแปลกใจ แต่กลยุทธ์นี้ใช้ได้ผลอย่างน่าอัศจรรย์
%% คำนิยามการประกาศของจำนวนธรรมชาติ ints(0) ints(X) :- ints(Y), X คือ Y + 1. %% ตัวเลขที่ป้อน - ce 1) จำนวนธรรมชาติ 2) ผลรวมของจำนวนทั้งหมด perfect_number(X) :- ints(X), Y คือ X - 1 , คำนวณsum_divisors_till(Sum, X, Y), Sum = X. %% ตรวจสอบผลรวมของตัวหารที่ 1 อาร์กิวเมนต์ที่ 1 Sum, 2 – จำนวนสำหรับจำนวนตัวหารต่อตัวหาร, %% 3 – จำนวนถึงจำนวนตัวหารที่ตัวหารคำนวณsum_divisors_till(0, _NumberToDivide 0). คำนวณsum_divisors_till(Sum, NumberToDivide, Till) :- จนถึง > 0, Rem คือ NumberToDivide mod Till, Rem = 0, Ts คือ Till - 1, การคำนวณsum_divisors_till(SumPrev, NumberToDivide, Ts), ผลรวมคือการคำนวณsum_divisors Number_till(ผลรวม: - จนถึง > 0, Rem คือ NumberToDivide mod Till, Rem > 0, Ts คือ Till - 1, คำนวณsum_divisors_till(Sum, NumberToDivide, Ts)

เราแทรกข้อความเอาต์พุตลงในไฟล์ เรียกใช้ล่ามและคอมไพล์มัน (ผ่านอินพุต: -compile("path_to_file/perfect_numbers.pl")) :- perfect_number(X).ล่ามนั้นดูเหมือน ";" ชนิดของการโจมตี ขอแสดงความนับถือถาม may buti :- perfect_number(X), X > 6. จากนั้นผลลัพธ์ทั้งหมดจะมากขึ้นสำหรับ 6 เห็นได้ชัดว่าโปรแกรมทำงานไม่เต็มประสิทธิภาพ การยืนยันตัวเองสามารถทำให้ง่ายขึ้นด้วยตัวอย่างง่ายๆ ลองเลย

ตัวอย่างที่ 2 - การสร้างพีชคณิต

ในการจัดทำวิสัยทัศน์ของงานนั้น เราต้องเข้าใจรายการ รายการไม่ได้ ความเข้าใจพื้นฐานย้ายระหว่างรายการ เราสามารถวาดการเปรียบเทียบโดยตรงกับรายการลิงก์ใน C. มาดูการแต่งตั้งคำศัพท์เกี่ยวกับโครงสร้างแบบเรียกซ้ำของข้อมูล
%% รายการว่างอย่างมีนัยสำคัญเป็นวัตถุรายการ (ศูนย์) ไม่มี %% รายการขององค์ประกอบ 1 รายการอย่างมีนัยสำคัญ (t(1, ไม่มี)) %% รายการที่สำคัญขององค์ประกอบ 1, 2, 3 รายการ(t(1, t(2, t(3, ไม่มี)))) %% อธิบายตัวอย่างขั้นตอนการค้นหาในรายการ %% 1. ผลลัพธ์อยู่ในส่วนหัวของรายการ (องค์ประกอบที่ 1) %% _ - หมายความว่าเราจะไม่เปลี่ยนสมาชิก (X, t(Y, _)) :- X = Y. %% 2. ผลลัพธ์ไม่ใช่องค์ประกอบแรก แต่ย้ายไปยังส่วนท้ายของรายการหลังจากสมาชิกองค์ประกอบแรก(X, t(_, Tail)) :- สมาชิก(X, Tail)

มีคนบอกว่าการเรียกซ้ำมีความสำคัญเพียงใดและรายการไม่ได้ดูเหมือนวากยสัมพันธ์โดยเฉพาะใน Proloz: nil สามารถเขียนได้ , t(1, nil) - , t(1, t(2, nil)) - , t( 1, รายการย่อย) - , t(1, t(2, รายการย่อย)) - . ขอแนะนำให้ใช้วงจรวากยสัมพันธ์สำหรับรายการ เพื่อให้ชื่อภายในของคำสามารถแก้ไขได้ (ส่วนใหญ่มักเรียกว่า "")
%% 1. ผลลัพธ์จะถูกทำซ้ำที่ส่วนหัวของรายการ (องค์ประกอบที่ 1) member(X, ) %% 2. ผลลัพธ์ไม่ใช่องค์ประกอบแรก แต่ย้ายไปยังส่วนท้ายของรายการหลังจากสมาชิกองค์ประกอบแรก (X, [_| Tail]) :- สมาชิก(X, Tail)
มาดูงานสุดท้ายของการสร้างพีชคณิตกัน ทุกคนจำได้อย่างน่าอัศจรรย์ว่ามีการเรียงสับเปลี่ยนมากมาย n! สำหรับอัลกอริธึมโดยเฉลี่ย อัลกอริธึมเริ่มต้นหลังจากความพยายามและความทุกข์ทรมานหลังจากผ่านไป 20 ครั้ง ด้วยความรู้ของ Prolog อัลกอริทึมสามารถเขียนเป็น 2 hvilin หรือไม่เขียนในzagalі :)

จะสาบานกับ Prolose ได้อย่างไร? กฎกำลังเร่งขึ้นไม่ใช่โดยการมองหาวิธีแก้ปัญหา แต่โดยการตรวจสอบอีกครั้งว่ารู้จักวิธีแก้ปัญหา ภาคแสดง ดัด (ที่มา, การเรียงสับเปลี่ยน)- รายการเอาท์พุทแหล่งที่มา, การเปลี่ยนแปลง - การเปลี่ยนแปลง

%% ถ้ารายการที่ว่างเปล่าถูกลบออก จะใช้หนึ่ง perm(, ) perm( ) การเรียงสับเปลี่ยนรายการว่าง %% องค์ประกอบที่ 1 ของการเปลี่ยนแปลงเนื่องจากจะถูกลบออกจากรายการ %% เหตุใดองค์ประกอบที่ 1 ของการเรียงสับเปลี่ยนจึงถูกแยกออกจากรายการดั้งเดิม %% องค์ประกอบอื่นเกิดจากการดัด (ที่มา, ) :- member_list_exclude( Element , Source , SourceExcluded), ดัด (SourceExcluded, Tail) %% ย้อนกลับว่าองค์ประกอบอยู่ในรายการ และรายการที่ 2 เป็นรายการที่ไม่มีองค์ประกอบ (X, , L) member_list_exclude(X, , ) :- member_list_exclude(X, L, Ls)
ถาม :-perm(, X)สร้างการเปลี่ยนแปลงทั้งหมด Tsіkavo, sho ถามสมมาตร :-perm(X, )ข้อโต้แย้งที่ดีความจริง ซาปิตเดนมาร์กวางสายและตรวจสอบว่าคุณจำเป็นต้องจำ member_list_exclude และดัดเป็นสถานที่ที่ดัด

ก้นหมายเลข 3 - รุ่นทุกวัน

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

สมาชิก(X, ). สมาชิก(X, [_|L]) :- สมาชิก(X, L). รวมกัน(,). %% ตัวเลือกที่ 1: ย้ายองค์ประกอบที่ 1 ถัดจากรายการผลลัพธ์ comb(, ) :- comb(List, Tail) %% ตัวเลือกที่ 2: ไปที่ลำดับที่ถูกต้องของส่วนท้ายของรายการ %% จากนั้น 1 องค์ประกอบของรายการทางออกจะไม่ถูกย้ายไปยังหวีถัดไป([_|รายการ] หาง) :- หวี(รายการ ส่วนท้าย) .

ก้นหมายเลข 4 - การเรียงลำดับ

สามารถตรวจสอบก้นของเดนมาร์กได้ในรายงาน และเราจะพยายามเพิ่มประสิทธิภาพโซลูชันหลัก กระบวนการเขียนใน Prologue ดูเหมือนเป็นลำดับที่ใกล้เข้ามา: 1) คำอธิบายแรกของงานและการเลือกโซลูชันการแจงนับ 2) การเพิ่มประสิทธิภาพเชิงตรรกะโดยการจัดเรียงภาคแสดงในทางขวามือ 3) การเพิ่มประสิทธิภาพเชิงตรรกะของการแนะนำ ของการพลิกกลับอย่างง่าย ๆ หรือการกำจัดจิตใจ zayvih 4) การแนะนำฮิวริสติกและการเพิ่มประสิทธิภาพของครีม

ตัวเลือกที่ 1 การเรียงลำดับภายนอก: องค์ประกอบแรกของอาร์เรย์ที่เรียงลำดับได้น้อยที่สุด องค์ประกอบอื่น ๆ สามารถจัดเรียงได้ อาร์เรย์แรกคือวันหยุดสุดสัปดาห์ อาร์เรย์การจัดเรียงอื่นๆ คือวันหยุดสุดสัปดาห์

เรียงลำดับ(, ). sort(List, ) :- min_list_exclude(Min, List, Exclude), sort(Exclude, SortRest) %% ยกเว้นจำนวนขั้นต่ำซ้ำๆ เพื่อให้รายการมีหนึ่งหมายเลขที่จะไม่รวม min_list_exclude(M, [M], ) min_list_exclude(Min, , ExcludeRes) :- min_list_exclude(Ms, L, Exclude), find_result(result(M, L), result(Ms, ), result(Min, ExcludeRes)). %% ภาคแสดงเพิ่มเติมสำหรับการตั้งค่าเดิมพันด้วยคีย์ขั้นต่ำ find_result(ผลลัพธ์(M, L), ผลลัพธ์(Ms, _), ผลลัพธ์(M, L)):- M< Ms. find_result(result(M, _), result(Ms, Exclude), result(Ms, Exclude)):- Ms =< M.
สามารถสังเกตได้ว่าความซับซ้อนของอัลกอริธึมนี้เป็นสมการกำลังสอง และปัญหาหลักคือเราสามารถค้นหาองค์ประกอบขั้นต่ำได้อย่างง่ายดาย โดยไม่ต้องบันทึกข้อมูลพื้นฐานไว้พร้อม ๆ กัน
เป็นสิ่งสำคัญเช่นกันที่เรากำลังพยายามกำหนดองค์ประกอบแรกในอาร์เรย์ที่จัดเรียง

ตัวเลือกที่ 2 การเรียงลำดับ Shvidkeเมื่อมองปัญหาจากอีกด้านหนึ่ง เราสามารถลองกำหนดตำแหน่งขององค์ประกอบที่ 1 ของรายการในอาร์เรย์ที่เรียงลำดับ (การเรียกซ้ำไปยังอาร์เรย์ที่เรียงลำดับแล้วจะหยุดลง)

Sort_b(,). sort_b(, List) :- split(T, R, Less, Great), sort_b(Less, LessSort), sort_b(Great, GreatSort), append(LessSort, , List) %% แบ่งอาร์เรย์ด้วย 2 อาร์เรย์ที่ใหญ่ขึ้นและเล็กลง (_, ,, ) split(T, ,, Great) :- M< T, split(T,R, Less,Great). split(T, ,Less, ) :- M >= T, แยก(T, R, น้อย, ยิ่งใหญ่). %% เข้าร่วม 2 รายการต่อท้าย (, M, M) ผนวก (, ขวา, ) :- ผนวก (ซ้าย, ขวา, Res)
โปรดจำไว้ว่าเราได้ปรับปรุงผลลัพธ์ของการเรียงลำดับ เพื่อให้การเรียงลำดับดีกว่ากระเปาะ เพื่อปรับปรุงผลลัพธ์โดยทั่วไป เราสามารถเดาการเรียงลำดับตามลูกครอก เช่น O(n lg n) แต่น่าเสียดาย ดาน่า sorting zastosovna นั้นขึ้นอยู่กับอาร์เรย์น้อยกว่าและไม่ขึ้นอยู่กับเสียงของรายการซึ่งเราpratsyuєmo ตัวเลือกเดียวที่จะชนะโครงสร้างข้อมูลเพิ่มเติมสำหรับการบันทึกคือต้นไม้

ตัวเลือกที่ 3 การเรียงลำดับเพื่อขอความช่วยเหลือจากไบนารีทรี

สำหรับการเรียงลำดับแบบนี้ เรามาแปลรายการเอาท์พุตจากไบนารีทรี แล้วเราก็ไปรอบ ๆ ต้นไม้แห่งความชั่วร้าย ต้นไม้ถูกแทนด้วยคำแบบเรียกซ้ำ ต้นไม้ (วัตถุ, LeftSubTree, RightSubTree).
sort_tree(, ไม่มี) sort_tree(, ต้นไม้) :- sort_tree(L, LTree), บวก(X, LTree, ต้นไม้). %% เพิ่มองค์ประกอบให้กับ tree plus(X, nil, tree(X, nil, nil)) plus(X, tree(O, L, R), tree(O, ResL, R)) :- O >= X, plus(X, L, ResL). บวก(X, ต้นไม้(O, L, R), ต้นไม้(O, L, ResR)) :- O< X, plus(X, R, ResR). sort_t(X, Y) :- sort_tree(X, Tree), tree_list(Tree, Y). append_list(, L, L). append_list(, R, ) :- append_list(L, R, T). tree_list(nil, ). tree_list(tree(X, L, R), List) :- tree_list(L, ListL), tree_list(R, ListR), append_list(ListL, , List).

ตัวเลือกที่ 4 การเรียงลำดับสำหรับความช่วยเหลือของต้นไม้ไบนารีที่สมดุล

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

sort_btree(X, Y) : - sort_tree(X, ต้นไม้), tree_list(ต้นไม้, Y). tree_list(ไม่มี) tree_list(tree(X, L, R, _), List) :- tree_list(L, ListL), tree_list(R, ListR), append(ListL, , List). sort_tree(, ไม่มี) sort_tree(, ต้นไม้) :- sort_tree(L, LTree), plus_tree(X, LTree, ต้นไม้). construct_tree(A, AL, AR, tree(A, AL, AR, ADepth)) :- diff(AL, AR, _, ADepth) diff(AL, AR, ADiff, ADepth) :- depth_tree(ALs, AL), depth_tree(ARs, AR), ADiff คือ ALs - ARs, max_int(ALs, ARs, AD), ADepth คือ AD + 1 max_int(A , B, A) :- A > B. max_int(A, B, B) :- A =< B. append(, L, L). append(, R, ) :- append(L, R, T). depth_tree(0, nil). depth_tree(X, tree(_, _, _, X)). plus_tree(X, nil, tree(X, nil, nil, 1)). plus_tree(X, tree(O, L, R, _), Res) :- O >= X, plus_tree(X, L, ResL), diff(ResL, R, Diff, Dep), balance_tree(tree(O, ResL, R, Dep), Diff, Res). plus_tree(X, tree(O, L, R, _), Res) :- O< X, plus_tree(X, R, ResR), diff(L, ResR, Diff, Dep), balance_tree(tree(O, L, ResR, Dep), Diff, Res). %% No rotations balance_tree(Tree, ADiff, Tree) :- ADiff < 2, ADiff >-2. %% ยอดหมุนขวาเล็กน้อย balance_tree(tree(A, tree(B, BL, BR, _), AR, _), ADiff, Result) :- ADiff > 1, diff(BL, BR, BDiff, _), BDiff > = 0, construct_tree(A, BR, AR, ASubTree), construct_tree(B, BL, ASubTree, ผลลัพธ์). %% ยอดหมุนเวียนบิ๊ก right_tree(tree(A, tree(B, BL, BR, _), AR, _), ADiff, Result) :- ADiff > 1, diff(BL, BR, BDiff, _), BDiff< 0, BR = tree(C, CL, CR, _), construct_tree(B, BL, CL, BSubTree), construct_tree(A, CR, AR, ASubTree), construct_tree(C, BSubTree, ASubTree, Result). %% Small left rotation balance_tree(tree(A, AL, tree(B, BL, BR, _), _), ADiff, Result) :- ADiff < -1, diff(BL, BR, BDiff, _), BDiff =< 0, construct_tree(A, AL, BL, ASubTree), construct_tree(B, ASubTree, BR, Result). %% Big left rotation balance_tree(tree(A, AL, tree(B, BL, BR, _), _), ADiff, Result) :- ADiff < -1, diff(BL, BR, BDiff, _), BDiff >0, BL = tree(C, CL, CR, _), construct_tree(B, CR, BR, BSubTree), construct_tree(A, AL, CL, ASubTree), construct_tree(C, ASubTree, BSubTree, Result).
ก้นของเดนมาร์กไม่เหมาะสำหรับการนำไปใช้กับ Proloz แม้ว่าจะเป็นคำแถลงเกี่ยวกับแผนงานของภาระผูกพันระดับกลางก็ตาม สำหรับการฝึกอบรม คุณสามารถใช้การคัดแยกหรือการเรียงลำดับของ Bulbashkov ตามส่วนแทรก โดยต้องเสียค่าใช้จ่ายในการตัดสินของผู้อ่าน

ก้นหมายเลข 5 - คำสั่งเกี่ยวกับการถ่ายเลือด

ในภารกิจต่อไป เราจะพิจารณาปัญหาคลาสสิกเกี่ยวกับการเป็น และงานนี้มีความสมบูรณ์ยิ่งขึ้นและสวยงามยิ่งขึ้นด้วยการแสดงอารัมภบทของอารัมภบท Zagalny ตั้งค่า zavdannya: ให้deakієmnostiด้วยน้ำจำเป็นต้องถ่ายเทด้วยเส้นทางเพื่อกำจัดปริมาณน้ำในdeakіyєmnostі ส่วนก้นเราเอา 3 กลาเซียร์ความจุ 12 ลิตร 8 ลิตร 5 ลิตร ชวนให้นึกถึงบรรทัดที่ 1 ที่ 12 ลิตร และเราจะกำหนดลำดับการใช้ 6 ลิตร. สำหรับซัง ให้ลองใช้ virishiti tse shkilne zavdannya ด้วยปากกาและกระดาษ arkusha :)

เรามาสร้างอัลกอริธึมต่างๆ กันก่อน แล้วพยายามหยุดมันก่อนเริ่มงาน มาเขียนความคิดใหม่ในแง่ของ Prologue กัน อธิบายความสามารถเป็นคำ sosud(Id, ความจุสูงสุด, ความจุปัจจุบัน), ระบบอธิบายเป็นรายการความจุ Butt . ตอนนี้ขออธิบายแบบสอบถาม:

%% Solve_pr_wo(สถานะเริ่มต้น เป้าหมาย ขั้นตอน) :- Solve_pr_wo(, sosud(X, _, 6) ขั้นตอน)

ในการให้ความเคารพ เป้าหมายนั้น = sosud(_, _, 6) ดังนั้นจึงไม่สำคัญสำหรับเราว่าภาชนะของเขม่ามีความจุ 6 ลิตรเท่าใด

ตอนนี้ถ้าเราสามารถอธิบายทุกอย่างได้ เราก็สามารถอธิบายวิธีการได้ การแก้ไขโซลูชันโดยพิจารณาว่างานใดบ้างในขั้นตอนที่เปลี่ยนแปลง

%% สำหรับ otrimanya ฉันจะไม่ต้องการงานที่เหมาะสม %% หมายถึงหนึ่งในเรือรบที่อยู่ในรายการ Solv_pr_wo(State, Goal, ) :- member(Goal, State) %% การถ่ายเลือดครั้งแรกจากโสสุดไปยังโสสุด 2 และเลือก %% ของผู้ตัดสินคนแรก เรสโซสุด และเรสโซสุด 2 อีกคน %% ก้นเฉพาะของจระเข้: %% mv(sosud(1, 12, 12) -> sosud(2, 8, 0), sosud(1, 12, 4) -> sosud(2, 8, 8)). Solv_pr_wo(State, Goal, ) :- %% ในเทิร์นแรก ตรวจสอบโดเมนใหม่ว่ากรรมการ %% เดินในสายการผลิตอย่างมีประสิทธิภาพ และมีกลิ่นเหม็นไม่เท่ากับสมาชิกหนึ่งคน (Sosud, State), สมาชิก (Sosud2, State) ไม่ใช่ (Sosud = Sosud2) แทนที่ (Sosud2, State2, ResSosud2, StateX), %% ขั้นตอนเพิ่มเติมในการติดตามหลังจากการเรียกซ้ำ Solvent_pr_wo (StateX, เป้าหมาย, ขั้นตอน) %% แทนที่องค์ประกอบในรายการจริง ๆ %% แทนที่ (ElementToReplace, InList, ElementToReplaceWith, OutList) แทนที่ (S, , X, ). แทนที่ (S, , X, ) :- แทนที่ (S, L, X, Ls) %% ขั้นตอนการถ่าย - 2 ตัวเลือก ), sosud(Id2, Max2, Current3)) :- ปัจจุบัน >< Max2. %% Переливание из первого сосуда до краев второго mv(sosud(Id1, Max1, Current), sosud(Id2, Max2, Current2), sosud(Id1, Max1, Current3), sosud(Id2, Max2, Max2)) :- Current >0, ปัจจุบัน3 єปัจจุบัน2 + ปัจจุบัน - สูงสุด2, ปัจจุบัน3 >= 0

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

คำอธิบายของโปรแกรมเขียนขึ้น - คุณสามารถเรียกใช้ได้ โปรแกรมไม่หยุดสงสัย แค่แฮงค์ :) ไม่ได้แย่อย่างที่ทำได้ เพราะโปรแกรมไม่ค้าง มันก็จะดูถูกวิธี ต่อไป เราหาสาเหตุว่าทำไมมันถึงติดอยู่ แล้วเราก็มาช่วยเราทำความเข้าใจว่าบทนำจะตีแผ่กฎอย่างไร เพื่อให้เราทราบวิธีแก้ปัญหา ที่จริงแล้วคุณไม่จำเป็นต้องจำจุดเปลี่ยนมากถึง 10 จุด ดังนั้นคุณสามารถเข้าใจว่าจะเกิดอะไรขึ้นเมื่อ Solv_pr_wo -> โทรโดยการเรียกซ้ำ dissolve_pr_wo โทรผ่านสมาชิก 2 คน/2 เพรดิเคต ดังนั้นคุณจะเห็นเรือลำที่ 1 และ 2 เหมือนเดิมเสมอ ( เพรดิเคตไม่เรียกย้อนรอยและไม่อนุญาตให้สมาชิกเลือกเรือลำที่ 1 และลำที่ 1) ดังนั้นอัลกอริทึมจึงถูกถ่ายโอนจาก 1 เป็น 2 และย้อนกลับอย่างต่อเนื่อง

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

โปรแกรมเวอร์ชันใหม่ที่มีการพัฒนาเวอร์ชันใหม่กลายเป็นภาคแสดงเดียวสำหรับโซลูชันวิกิ:

นักเขียน(). write_list() :- writeln(X), write_list(L). วิธีแก้ปัญหา:- Solve_pr(, sosud(_, _, 6), , ขั้นตอน), write_list(ขั้นตอน) แทนที่ (S, , X, ). แทนที่ (S, , X, ) :- แทนที่ (S, L, X, Ls) %% ในกลยุทธ์การถ่ายเลือดของคุณไม่ใช่เป้าหมาย แต่แค่เป้าหมายสุดท้าย %% รู้ cob และสถานะสุดท้าย ไม่สำคัญที่จะเดาว่า cob ของ cob เป็นอย่างไร Solve_pr(State, Goal, _, ) : - สมาชิก (เป้าหมาย, รัฐ). Solv_pr(State, Goal, History, ) :- สมาชิก (Sosud, State), สมาชิก (Sosud2, State) ไม่ใช่ (Sosud = Sosud2), mv(Sosud, Sosud2, ResSosud, ResSosud2), แทนที่ (Sosud, State, ResSosud , State2), แทนที่ (Sosud2, State2, ResSosud2, StateX), %%% การตรวจสอบผลลัพธ์สุดท้ายไม่ได้ (สมาชิก (StateX, )), Solve_pr (StateX, เป้าหมาย, , ขั้นตอน) %% mv(sosud(_Id, Max, Current), sosud(_Id2, Max2, Current2), ...,...) %% ว่างเปล่า ตัดสินครั้งแรกไปยัง mv(sosud(Id1, Max1, Current), sosud(Id2, Max2, Current2), sosud(Id1, Max1, 0), sosud(Id2, Max2, Current3)) :- ปัจจุบัน > 0 , Current3 คือ Current2 + ปัจจุบัน, Current3 =< Max2. %% Переливание из первого сосуда до краев второго mv(sosud(Id1, Max1, Current), sosud(Id2, Max2, Current2), sosud(Id1, Max1, Current3), sosud(Id2, Max2, Max2)) :- Current >0, ปัจจุบัน3 єปัจจุบัน2 + ปัจจุบัน - สูงสุด2, ปัจจุบัน3 >= 0

ทุกอย่างกำลังทำงานอยู่! คุณสามารถปรับเปลี่ยนโปรแกรมได้อย่างถูกต้องเพียงใดเพื่อให้คุณทราบถึงการถ่ายเลือดในปริมาณที่เหมาะสม คุณสามารถทดลองกับงานเหล่านี้ได้

เคารพ: zatyati prikhiliny і perempаtivnogo programuvannya โปรดจำไว้ว่า scho mi zrobili tse ทั้งหมดระบุสถานะทั้งหมดทั้งหมด (ผ่าน glybinu) ยิ่งกว่านั้นหากไม่มีการวิเคราะห์พฤติกรรมที่ได้รับชัยชนะ іจะถูกต้องอย่างแน่นอน ทางด้านขวา ในความจริงที่ว่าจำเป็นต้องคิดใน Prolosis ไม่ใช่โดยการแจงนับ แต่โดยคำอธิบายของงานและคำอธิบายของการตรวจสอบซ้ำของโซลูชัน และความจำเป็น จำเป็นต้องคำนวณ ถึงเวลาปรับให้เหมาะสมตามความจำเป็น! ความเป็นคู่ของธรรมชาติไม่ใช่ลบ แต่เป็นบวก Varto ยังหมายความว่าระบบอารัมภบทที่ยอดเยี่ยมได้รับการดัดแปลงมาอย่างดีเพื่อผลัดกัน

วิสโนวอค

ฉันต้องการกำหนดสิ่งที่ดูในบทความเหล่านี้และ etudes สำหรับการเขียนโปรแกรมใน Prolose เนื่องจากส่วนใหญ่ยืมมาประมาณ 10-15 แถว ดังนั้นโปรแกรมเมอร์บน Prolose จึงสามารถทำได้จากหน่วยความจำด้วย roz'yazann їх ที่เพียงพอ และหันไปหาพวกเขาใน warto ที่ฉลาดทางภาษาสำหรับผู้ที่คาดเดาเกี่ยวกับการเขียนโปรแกรมศิลปะ (เช่นเดียวกับการเรียงลำดับในภาษา C) งานพับและนำไปใช้เพิ่มเติมสำหรับวิคตอเรียทุกวันจะดูในภายหลัง

ตัวอย่างเช่น มากถึง 2 รายการสำหรับรางวัล:

  1. เมื่อดูจากการทำงานและตรรกะ ทุกสิ่งทุกอย่างถูกควบคุมโดยโปรแกรมจากผลข้างเคียง ล้อมรอบโปรแกรมด้วย monads และเห็นแนวคิดพิเศษ ปัญหามาตรฐานเป็นปัญหาเดียวกันของโลก ตัวอย่างเช่น การเขียนข้อมูลลงในไฟล์ มันเป็นไปไม่ได้ที่จะเขียนไปยังไฟล์ หรือบอกว่าซ็อกเก็ตมีกี่ไบต์ และการย้อนรอยจะทำงานไม่ถูกต้อง มีเพียงความสุขเดียวเท่านั้น - อย่าชนะบทนำสำหรับสิ่งนี้ และถึงกระนั้น สิ่งเหล่านี้คือเพรดิเคต เช่นเดียวกับ garni และเฉพาะสำหรับอารัมภบท แต่อาจมีผลข้างเคียง ยืนยันก้น (asserta, assertz): vin เพิ่มพื้นฐานของกฎ (ข้อเท็จจริง) กฎง่าย ๆ (ข้อเท็จจริง) ก้น ยืนยัน(นายก(3)): บวกความจริงที่ว่า 3 เป็นจำนวนเฉพาะที่ฉันถาม :-prime(X)ตอนนี้คุณจะเห็น 3 นำทางเมื่อว่างเปล่า โปรแกรมวันหยุดสุดสัปดาห์.

    ผู้จัดการ: เขียนเวอร์ชันประกาศ ยืนยันดังนั้นเมื่อโปรแกรมต่างๆ ถูกย้อนรอย ความจริงจะไม่ถูกทิ้งไว้ในความทรงจำ แต่ให้ฝึกฝนเป็นการตอบรับอย่างมีตรรกะ

    ก้นหุ่นยนต์: c(X) มีความผิดที่เห็นเลข 4 ตัวเดียวสำหรับรายการต่อไป!
    a(X) :- b(Y), X คือ Y + 1 c(X) :- my_assert(b(3)), a(X). ค(X) :- ข(X).

  2. ในตรรกะทางคณิตศาสตร์คลาสสิก 2 ทฤษฎีได้รับการเคารพมากขึ้น ต่ำกว่า reshti - ce ทฤษฎีตัวคูณі ทฤษฎีเพรดิเคต. ระหว่างพวกเขามีการเชื่อมโยงการร้องเพลงหนึ่งแสดงผ่านอีกคนหนึ่งและ navpaki ตัวอย่างเช่น เพรดิเคตคือความหมายที่ไม่มีตัวตน สำหรับไวน์บางชนิดมันเป็นความจริง และ navpaki การไม่มีตัวตนเป็นภาคแสดงของการเป็นเจ้าของ ทฤษฎีฐานข้อมูลเชิงสัมพันธ์แบบดั้งเดิมทำงานบนเซต ขณะที่ Prolog ทำงานบนเพรดิเคต Zagalom, zavdannya polagaєในนั้น, schob vyslovit เป็นแบบดั้งเดิมอย่างแท้จริงสำหรับทฤษฎีการดำเนินการหลายหลาก การดำเนินการหาตัวคูณของตัวคูณย่อยทั้งหมด.

    ผู้จัดการ: ให้เพรดิเคตเดียว a / 1 (ไม่ได้ล้อมรอบด้วยส่วนหัวขององค์ประกอบที่ไม่มีตัวตน อาจไม่จำกัด) เขียนเพรดิเคต subset_a / 1 ซึ่งจะสามารถเห็นตัวคูณย่อยที่รวมกันเป็นองค์ประกอบของตัวคูณ a

    ก้น: ถาม subset_a(X) ของแบบฟอร์ม X = , X = , X = , X = (ลำดับไม่สำคัญ):
    ก(1). ก(2). subset_a(X) :- ....?

ขอบคุณสำหรับความเคารพ

แท็ก: เพิ่มแท็ก

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

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

การเกิดขึ้นของระบบดังกล่าวสามารถเปลี่ยนเทคโนโลยีเพื่อการพัฒนาฐานความรู้ของระบบผู้เชี่ยวชาญได้ แก่นแท้ของ cob yakіsnyของ EOM รุ่นที่ห้าอยู่ที่การเปลี่ยนจากการประมวลผลข้อมูลไปสู่การประมวลผลความรู้ ชาวญี่ปุ่นเห็นพ้องต้องกันว่าไม่ควรพยายามเลียนแบบจิตใจของมนุษย์ตามหลักการทำงานของคอมพิวเตอร์ แต่เพื่อให้หุ่นยนต์ของคอมพิวเตอร์เข้าใกล้จุดที่คิดว่าเป็นมนุษย์มากขึ้นโดยเห็นภูมิหลังของสถาปัตยกรรมนอยมันน์ ของคอมพิวเตอร์ ในปีพ.ศ. 2534 คอมพิวเตอร์ต้นแบบรุ่นแรกของรุ่นที่ห้าได้รับมอบให้แก่ร็อค

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

วิธีการหลักในการพัฒนาเป็นอย่างไร ผลงานโปรแกรมสำหรับโครงการ EOM รุ่นที่ 5 ถูกรวบรวมไว้ การเขียนโปรแกรมเชิงตรรกะมากขึ้น, ฉันเป็นตัวแทนของสิ่งที่ є mova Prologue . ปรากฎว่าในชั่วโมงนี้ Prologue ก็ยังถูกครอบงำโดยหน่วยสืบราชการลับของฉันในญี่ปุ่นและยุโรปที่ได้รับความนิยมมากที่สุด (ในสหรัฐอเมริกาตามเนื้อผ้าภาษาอื่น ๆ ของหน่วยสืบราชการลับมีการขยายอย่างกว้างขวางมากขึ้น - ภาษาของ การเขียนโปรแกรมฟังก์ชั่น Lisp)

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

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

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

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

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

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

ในปี 1976 Kowalski จากเพื่อนร่วมงานของเขา Maarten van Emden ได้แนะนำวิธีการอ่านข้อความของโปรแกรมเชิงตรรกะสองวิธี: ขั้นตอนและการประกาศ เกี่ยวกับqі come timetya ในการบรรยายครั้งที่สาม

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

การเขียนโปรแกรม Mova

Prolog (เช่น "PROgramming in LOGic") เป็นโปรแกรม mov ที่ประกาศโดยสามัญสำนึก

จดหมายแนะนำตัวของการสร้างสรรค์ในปี 1972 roci z metoyu poednuvat vykoristannya logіkі z podannymi znan ตั้งแต่ชั่วโมงนั้น ภาษาถิ่นต่ำใหม่ก็ปรากฏขึ้น ซึ่งขยายพื้นฐานของภาษาที่มีความเป็นไปได้ที่แตกต่างกัน

มาตรฐานภาพยนตร์คือ ISO/IEC 13211-1 (1995 rec)

Prolog เป็นหนึ่งในภาษาเขียนโปรแกรมเชิงตรรกะที่เก่าแก่ที่สุดและยังคงเป็นหนึ่งในภาษาโปรแกรมเชิงตรรกะที่ได้รับความนิยมมากที่สุด แม้ว่าจะไม่ค่อยได้รับความนิยมมากนัก แต่เป็นภาษาที่จำเป็นหลัก Vіnvikoristovuєtsyaในระบบการประมวลผลภาษาธรรมชาติ, ชิ้นdoslіdzhennyaіntelektu, ระบบผู้เชี่ยวชาญ, ontology และอื่นๆ สาขาวิชาซึ่งใช้กระบวนทัศน์เชิงตรรกะโดยธรรมชาติ

Prolog ของการสร้างสรรค์ภายใต้การไหลบ่าของขบวนการ Planner ในช่วงต้นและแนวคิดเชิงบวกจากมัน:

  • ย้อนกลับ visnovok ตรรกะ (วัฏจักรของขั้นตอนตามเทมเพลตการย้ายออกจากเป้าหมาย);
  • โครงสร้าง pobudova ของตรรกะการควบคุมในการคำนวณเงินใต้โต๊ะ
  • หลักการของ "จำกัดเป็นความล้มเหลว";
  • รายชื่อของชื่อต่าง ๆ สำหรับหน่วยงานต่าง ๆ ด้วย

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

Prolog vikoristovuєข้อมูลประเภทหนึ่งคำซึ่งมีหลายประเภท:

  • อะตอม- ฉันไม่มี ความรู้สึกพิเศษ, สิ่งที่vikoristovuєtsyaสำหรับเงื่อนไขคลังสินค้าของ budovi;
  • ตัวเลขі แถวดังเช่นในภาษาอื่น
  • เปลี่ยนมีความหมายโดยชื่อที่มาจากอักษรตัวใหญ่และมีชัยชนะเป็นสัญลักษณ์สำหรับเทอร์โมอื่น ๆ
  • ระยะเวลาคลังสินค้ามันประกอบด้วยอะตอม functor หลังจากนั้นก็มีหลายอาร์กิวเมนต์ สกินที่เป็นอะตอม

โปรแกรมที่เขียนด้วย Prolog ล้วนๆ อธิบายอ็อบเจ็กต์ทั่วไปที่มีส่วนคำสั่ง Horn เพิ่มเติม ข้อ - tse สูตรกำลังมองหาหัวหน้า: - Tіlo ตามที่อ่านว่า "นำ / ทำลายหัว, ถัดไปนำ / ทำลายร่างกาย". เนื้อความของอนุประโยคประกอบด้วยภาคแสดงจำนวนหนึ่ง (วัตถุประสงค์ของอนุประโยค) รวมกันเป็นคำสันธานและการแตกแยกเพิ่มเติม ประโยคที่มีเนื้อหาว่างเปล่าเรียกว่าข้อเท็จจริงที่เทียบเท่ากับประโยคในรูปแบบ Head: - true (ความจริงไม่ใช่อะตอมเหมือนในท่าอื่น ๆ แต่อยู่ในภาคแสดงการปลุก)

อีกส่วนที่สำคัญของ Prolog คือภาคแสดง เพรดิเคต Unary แสดงพลังของการโต้แย้ง เช่นเดียวกับเพรดิเคตที่มีอาร์กิวเมนต์จำนวนมากใช้ stanzas ของอาร์กิวเมนต์ที่คล้ายคลึงกัน จำนวนของ vbudovannyh เพรดิเคต mov มีบทบาทเช่นเดียวกับฟังก์ชันของ mov อื่น ๆ เช่น ....

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

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

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

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

ในภาษาอื่น Prolog ไม่เหมาะกับภาษาการเขียนโปรแกรมแบบดั้งเดิม ประหนึ่งว่าโปรแกรมถูกเขียนขึ้น ไม่ว่าจะเป็นของฉันเอง โปรแกรม Prologue นั้นได้รับการยอมรับว่าสำเร็จลุล่วงไปด้วยดี

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

อารัมภบทกล่าวถึงสิ่งที่เรียกว่า mov ที่ประกาศ ซึ่งควรพิจารณาโดยผู้เขียนเพื่อเขียนคำอธิบายอย่างเป็นทางการของสถานการณ์ ด้วยเหตุผลนี้ โปรแกรมใน Prolose จึงไม่เหมือนกันสำหรับความคิดแบบเดิมๆ เพราะไม่สามารถล้างแค้นด้วยโครงสร้างที่สำคัญเช่น if...then, while...do; ไม่พบโอเปอเรเตอร์ที่จะดึงดูด Prolosis มีกลไกอื่น งานนี้อธิบายในแง่ของข้อเท็จจริงและกฎ และการค้นหาวิธีแก้ไข Prologue เริ่มต้นจากการดูที่กลไกการไขลานแบบลอจิคัล

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

อารัมภบทของการใช้งานเป็นประโยชน์สำหรับผู้โดยสารทุกคน ระบบปฏิบัติการแพลตฟอร์มนั้น ระบบปฏิบัติการรวมถึง OS สำหรับเมนเฟรม, ตระกูล Unix ทั้งหมด, Windows, OS สำหรับแพลตฟอร์มมือถือ

การใช้งานภาพยนตร์ในปัจจุบันจำนวนมากสามารถขยายภายในสำหรับเฟรมเวิร์กของสถาปัตยกรรม OOP ได้ Crim ของโซลูชันที่เป็นกรรมสิทธิ์เพื่อสำรวจการใช้งาน Prologue อย่างเหมาะสม

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

เหตุการณ์สำคัญในการพัฒนาภาพยนตร์ Prolog

Prolog กลายเป็นการรวมตัวของแนวคิดในการใช้ตรรกะเป็นภาษาของการเขียนโปรแกรมเนื่องจากมีต้นกำเนิดมาจากยุค 70 และเรียกตัวเองว่า "การเขียนโปรแกรมในตรรกะ" (การเขียนโปรแกรมในแง่ของตรรกะ) ผู้สืบทอดกลุ่มแรกที่มีส่วนร่วมในการพัฒนาความคิด ได้แก่ Robert Kowalski จากเอดินบะระ (รากฐานทางทฤษฎี), Maarten van Emden จากเอดินบะระ (ระบบสาธิตทดลอง) และ Alain Colmerauer จาก Marseille ความนิยมของภาพยนตร์ Prolog นั้นมีมากมายในสิ่งที่การนำภาพยนตร์เรื่องนี้ไปใช้อย่างมีประสิทธิภาพในช่วงกลางทศวรรษ 1970 โดย David D.H. Warren จากเอดินบะระ คลังสินค้าแห่งนี้มีความสามารถในการตั้งโปรแกรมบนพื้นฐานของการโปรแกรม Constraint Logic Programming (CLP) ได้ จนถึงการเข้าถึงแบบใหม่ เช่น เสียงที่ใช้ในคลังสินค้าของระบบ Prolog กล่อง CLP ได้แสดงให้เห็นว่าใช้งานได้จริง เหมือนกับเครื่องมือ gnuchkiy สีแดงเข้มสำหรับความสำเร็จของเลย์เอาต์คลังสินค้าและการวางแผนวัสดุและการจัดหาทางเทคนิค และในปี พ.ศ. 2539 ได้มีการเผยแพร่มาตรฐาน ISO อย่างเป็นทางการสำหรับภาพยนตร์ Prolog

แนวโน้มที่สำคัญที่สุดในประวัติศาสตร์ของการพัฒนาภาพยนตร์ Prolog

การพัฒนาของหนัง Prolog มีแนวโน้มอื่นๆ Qia Mova ได้รับความนิยมอย่างรวดเร็วในยุโรปในฐานะเครื่องมือสำหรับการเขียนโปรแกรมเชิงปฏิบัติ ในญี่ปุ่นส่วนใหญ่ mov Prolog คือ zoseredzheno คอมพิวเตอร์ rozrobki ทั้งหมดของรุ่นที่ห้า ในทางกลับกัน ในสหรัฐอเมริกา ภาษานี้ได้รับการยอมรับโดยมีความล่าช้าเล็กน้อยเนื่องจากเหตุผลทางประวัติศาสตร์ต่างๆ หนึ่งในนั้นเชื่อในข้อเท็จจริงที่ว่ารัฐที่ประสบความสำเร็จในสมัยนั้นคุ้นเคยกับไมโครแพลนเนอร์ของฉัน เนื่องจากใกล้เคียงกับแนวคิดของการเขียนโปรแกรมเชิงตรรกะ แต่ไม่ได้นำไปใช้อย่างมีประสิทธิภาพ Pevna ส่วนหนึ่งของความนิยมต่ำของ Prolog ในประเทศนี้ยังอธิบายได้ด้วยปฏิกิริยาต่อ "โรงเรียนดั้งเดิม" ของการเขียนโปรแกรมเชิงตรรกะซึ่งเป็นตัวแทนของ nakoy napolyagali บน vikoristanny ตรรกะบริสุทธิ์ vimagali, schob ตรรกะ ในอดีตได้นำไปสู่การขยายการมองภาษา Prolog ผิดไป ตัวอย่างเช่น deyakі vvazhali ที่tsієyu movoi สามารถตั้งโปรแกรมได้เฉพาะ mirkuvannya z vysnovkom กับtsіleyกับข้อเท็จจริง แต่ความจริงก็คือ Prolog เป็นการเขียนโปรแกรมภาษาสากลและสามารถนำมาใช้กับอัลกอริธึมใดก็ได้ ห่างไกลจากความเป็นจริง ตำแหน่งของ "โรงเรียนออร์โธดอกซ์" ได้รับการปรับโดยผู้ปฏิบัติงานของ Prolog mov เนื่องจากพวกเขานำแนวทางปฏิบัติมาใช้ เร่งการพัฒนาแนวทางใหม่ที่เปิดเผยด้วยขั้นตอนดั้งเดิม

องค์ประกอบไวยากรณ์:

คอมเม้นให้จบแถว %
ทะเบียน ดังนั้น
ไวรัสประจำตัวของตัวระบุงู [_A-Z][_a-zA-Z0-9]*
รูปแบบปกติของตัวระบุฟังก์ชัน [_a-z][_a-zA-Z0-9]*
ความหมายที่น่าสนใจของงู เป็น
Goloshennya zminnoy = อย่างใดอย่างหนึ่ง:-
การรวมกลุ่มของไวรัส (...)
หึงเหมือนกัน ==
ความไม่สม่ำเสมอเท่ากัน \==
โปริฟเนียเนีย @< @=< @> @>=
ฟังก์ชั่น Wiki ฉ(ก,ข,...)
Wiklik ทำงานโดยไม่ต้องติดตั้ง
ลำดับ ,
Yakshcho - บางอย่าง - іnakshe (A -> B; C)
วงจรจาก postum ซ้ำ, ..., เงื่อนไข

นำมาใช้:

สวัสดีชาวโลก!:

ตัวอย่างสำหรับเวอร์ชันของ Visual Prolog 7.2

Visual Prolog สร้างโครงการโดยอัตโนมัติ ในการเปิดแอปพลิเคชัน ให้สร้างโครงการใหม่โดยตั้งค่า "คอนโซล" เป็นกลยุทธ์ UI ไปที่แก้ไขไฟล์ main.pro และแทนที่ด้วยรหัสโฮเวอร์

ใช้ค่าคงที่หลักของ open core className = "main" classVersion="". ข้อ classInfo (ชื่อคลาส, คลาสเวอร์ชัน) เรียกใช้คำสั่ง ():- คอนโซล : : init (), stdio : : เขียน ("สวัสดีชาวโลก!" ), programControl:: sleep(1000 ), สำเร็จ () สิ้นสุด ใช้เป้าหมายหลัก mainExe:: run (main: :run )

แฟกทอเรียล:

ตัวอย่างสำหรับเวอร์ชันของ Visual Prolog 7.2

Main.cl มีการเพิ่มแถวแฟกทอเรียลหนึ่งแถว: ขั้นตอน (จำนวนเต็ม N, จำนวนเต็ม F) (i, o) , มันกำหนดแฟกทอเรียลเพรดิเคตไบนารีด้วยอาร์กิวเมนต์แรกและไม่มีอาร์กิวเมนต์อื่น ขั้นตอนคีย์เวิร์ดอธิบายพฤติกรรมของเพรดิเคต ซึ่งระบุว่าจะสำเร็จเสมอและจะพบวิธีแก้ไขหนึ่งวิธี เพื่อไม่ให้มีความจำเป็น

main.pro รู้วิธีกำหนดภาคแสดงใหม่ สำหรับโยคะผิวหนัง มีสองผลลัพธ์ที่เป็นไปได้ - อาร์กิวเมนต์แรกมีหมายเลขศูนย์เพียงพอ Visual Prolog จะวนซ้ำสูตรต่างๆ ตามลำดับที่ปรากฏในโค้ด เนื่องจากอาร์กิวเมนต์แรกมีค่าเท่ากับศูนย์ การตรวจสอบซ้ำจะเริ่มต้นด้วยสูตรแรก factorial(0,F) กฎข้อแรกของสูตรคือ ! ดังนั้นชื่อของข้อสรุป ตัวเลือกที่หนึ่งดีกว่าสูตรอื่น และในลักษณะนี้ทำให้มั่นใจได้ว่ามีโซลูชันเดียวสำหรับเพรดิเคต หลังจากการเปลี่ยนแปลงของ F ซึ่งล้างแค้นการตัดสินใจของภาคแสดง มันถูกตั้งค่าเป็น 1 และแสดงบนอีกด้านหนึ่ง แฟกทอเรียลสูตรอื่น (N,F) ระบุ F1 ซ้ำเป็นแฟกทอเรียลของ N-1 ตั้งค่าโซลูชันเป็นเพรดิเคตเท่ากับ N*F1 และแสดงต่างกัน ที่นี่ stdio::nl เป็นอีกแถวใหม่

เมื่อโปรแกรมหลักถูกโจมตี เพรดิเคตแฟกทอเรียลจะถูกตีเพียงครั้งเดียวสำหรับ N=12 ด้วยวัฏจักรสกินของการเรียกซ้ำ N เปลี่ยนเป็นหนึ่ง ด็อคไม่ถึงศูนย์ ค่าถัดไปของแฟกทอเรียลจะหมุนเวียนและแสดงตามลำดับการเติบโต โปรแกรมจะทำให้ chinniki เพิ่มขึ้นถึง 12 เท่านั้น! ตัวอย่างหมายเลข 13! เรียกร้องให้มีการให้อภัยทุกประเภท

% main.cl class main open core เพรดิเคต classInfo : core :: classInfo แฟกทอเรียล : (จำนวนเต็ม N , จำนวนเต็ม F ) ขั้นตอน (i , o ) เพรดิเคต run:core::runnable end class main % main.pro ใช้ค่าคงที่ open core หลัก className = "main" classVersion="". ข้อ classInfo (ชื่อคลาส, คลาสรุ่น) แฟกทอเรียล (0 , F ) :- !, F = 1 , stdio : : write ("0!=1" ), stdio : :nl แฟกทอเรียล (N , F ) :- แฟกทอเรียล (N - 1 , F1 ), F = N * F1 , stdio : : write (N , "!=" , F ), stdio : :nl รันคำสั่ง ():- คอนโซล : : init (), แฟกทอเรียล (12 , F ), programControl:: sleep (1000 ), สำเร็จ () สิ้นสุด ใช้เป้าหมายหลัก mainExe:: run (main: :run )

หมายเลขฟีโบนักชี:

ตัวอย่างสำหรับเวอร์ชันของ Visual Prolog 7.2

สำหรับแอปพลิเคชันนี้ มีการกำหนดเพรดิเคตใหม่สองเพรดิเคต - binary fibonacci(N,F) สำหรับการนับเลข N-th ของ Fibonacci และ loop(N) สำหรับการนับอีกอัน เมื่อคำนวณตัวเลขแล้ว ตัวเลขจะไม่ถูกบันทึกเป็นตัวเลขสุดท้าย ดังนั้นการใช้งานจึงไม่มีประสิทธิภาพ

ต่อไปนี้คือความสำคัญของการนำเพรดิเคตไปใช้ในการประยุกต์ใช้แฟกทอเรียล: สูตรที่อธิบายซังของจิตใจถูกกำหนดไว้สำหรับค่าที่เพียงพอของการเปลี่ยนแปลง แต่จะคำนวณถึงจุดสิ้นสุดเท่านั้นในกรณีนั้นเช่น กฎข้อแรก (N<3 или N=1 , соответственно) оценивается как истинное. Кроме того, каждый предикат записан как одна формула, использующая конъюнкцию и дизъюнкцию, а не как набор отдельных формул, использующих только конъюнкцию.

% main.cl class main open core เพรดิเคต classInfo : core :: classInfo fibonacci : (จำนวนเต็ม N , จำนวนเต็ม F ) ขั้นตอน (i , o ) วนซ้ำ: (จำนวนเต็ม N) ขั้นตอน (i) เพรดิเคต run:core::runnable end class main % main.pro ใช้ค่าคงที่ open core หลัก className = "main" classVersion="". ข้อ classInfo (ชื่อคลาส, คลาสเวอร์ชัน) ฟีโบนักชี (N , F ) :- N< 3 , !, F = 1 ; fibonacci (N - 1 , F1 ), fibonacci (N - 2 , F2 ), F = F1 + F2 . loop (N ) :- ( N = 1 , !, fibonacci (1 , F ); loop (N - 1 ), fibonacci (N , F ) ), stdio : : write (F , ", " ). clauses run ():- console : : init (), loop (16 ), stdio : : write ("..." ), programControl:: sleep (1000 ), succeed (). end implement main goal mainExe:: run (main : :run ).

สวัสดีชาวโลก!:

สต็อกสำหรับ B-Prolog 7.4-3, ECLiPSe CLP 6.0 #188, Poplog 15.5 (Prolog), gprolog 1.3.0, swipl 5.6.x

Tsey butt ไม่กระทบต่อความสนใจของข้อเท็จจริงและกฎเกณฑ์ มันเริ่มต้นในโหมดโต้ตอบ และผลลัพธ์จะเป็นดังนี้:

สวัสดีชาวโลก!
ใช่

แถวแรกสอดคล้องกับเพรดิเคตการเขียน อีกผลลัพธ์คือการประเมินอินพุต

ขั้นตอนต่อไปคือการระบุว่าการเปลี่ยนขาเดียวบนบานพับควรแสดงเป็นแถวเหมือนอาร์เรย์ของรหัส ASCII ที่มีอักขระสี่ตัว:

| ?-write("สวัสดีชาวโลก!").

write("สวัสดีชาวโลก!"), nl.

หมายเลขฟีโบนักชี:

สต็อกสำหรับ Poplog 15.5 (Prolog)

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

หากเพรดิเคต fib(N,F) ถูกประเมินแบบเรียกซ้ำ ค่าสกิน fib(N,F) จะถูก "ห่อ" ในเพรดิเคตบันทึก และค่าสกิน fib(N,F) จะถูกประเมินเพียงครั้งเดียว ด้วยวิธีนี้ สามารถคำนวณตัวเลขอื่น ๆ ได้อีกครั้งหลังจากการคำนวณโดยไม่มีรอบเพิ่มเติม

% fibonacci.pl :- ไดนามิก (เก็บไว้ / 1) บันทึก (เป้าหมาย): - เก็บไว้ (เป้าหมาย) -> จริง; เป้าหมาย, assertz (เก็บไว้ (เป้าหมาย)). fib (1 , 1 ) :- !, เขียน ("1, "). fib(2, 1): -!, write("1,") fib (N , F ) :- N1 คือ N - 1 , memo (fib (N1 , F1 )), N2 คือ N - 2 , memo (fib (N2 , F2 )), F คือ F1 + F2 , เขียน (F ) , เขียน (", "). % โต้ตอบ [-fibonacci] fib(16, X), write("..."), nl.

แฟกทอเรียล:

สต็อกสำหรับ Poplog 15.5 (Prolog)

ก้นนี้ประกอบด้วยสองส่วน - ส่วนแรกของรหัสควรถูกบันทึกจากไฟล์ fact.pl จัดเรียงในแคตตาล็อกหุ่นยนต์ Poplog และส่วนอื่น ๆ ควรป้อนด้วยตนเองในโหมดโต้ตอบ

[-ข้อเท็จจริง]. รวบรวมฐานข้อเท็จจริงและกฎจากไฟล์เดียวกันในเซสชันการสตรีม Poplog (และแสดงข้อเท็จจริงที่ได้รับการพิจารณาใหม่เพื่อตรวจสอบความสำเร็จในการดักจับ) ถามข้อเท็จจริง(16,X). พยายามรู้ค่าของ X ซึ่งเพรดิเคตจะถูกประเมินว่าเป็นจริง Visnovok ซึ่งจำเป็นสำหรับก้นจะเป็นผลข้างเคียงของการประเมินอินพุตและผลลัพธ์หลักจะเป็น X = 20922789888000? . ซึ่งหมายความว่าหากคุณไม่พอใจกับความผูกพันของการเปลี่ยนแปลง คุณสามารถย้ายเข้าไปอยู่ในนั้น (ใน vvshi;) และคุณจะค้นหาสายสัมพันธ์ที่สั้นลงต่อไป

% fact.pl ข้อเท็จจริง (X , F ) :- ( X = 0 , F = 1 ; Y คือ X - 1 , ข้อเท็จจริง (Y , Z ), F คือ X * Z ), เขียน (X ), เขียน ("! = "), เขียน (F), nl. % โต้ตอบ [-ข้อเท็จจริง] ข้อเท็จจริง(16,X).

การจัดตำแหน่งสี่เหลี่ยม:

ตัวอย่างสำหรับเวอร์ชันของ Visual Prolog 7.2

ในการเริ่มต้น ให้สร้างโครงการใหม่ด้วยกลยุทธ์ UI “คอนโซล” และแทนที่ไฟล์ main.cl และ main.pro ด้วยรหัส

Main.cl เพิ่มแถว q หนึ่งแถว: () ขั้นตอน () . ขั้นตอนคีย์เวิร์ดอธิบายพฤติกรรมของเพรดิเคต ซึ่งระบุว่าจะสำเร็จเสมอและจะพบโซลูชันหนึ่งวิธี ดังนั้นคุณไม่จำเป็นต้องรู้

main.pro รู้วิธีกำหนดภาคแสดงใหม่ เพรดิเคต q ไม่รับอาร์กิวเมนต์ ออสซิลเลเตอร์อ่านข้อมูล stdio ที่จำเป็น การประเมินที่ชาญฉลาดยิ่งขึ้น (โครงสร้างแบบ if-then-else) ทำงานในลักษณะเดียวกัน เช่นเดียวกับการเคลื่อนไหวอื่นๆ ในฐานะผู้มีอำนาจเพียงคนเดียว มันคือสัญญาณของอำนาจ! ก่อนหน้านั้น . Tse หมายความว่า ถ้าได้ชัยชนะก็ไม่เป็นไร

เคล็ดลับที่ฉันจะนำไปใช้คือ ไม่สามารถคำนวณการแบ่งแยกได้ทันที เหมือนในภาษาอื่น ชนิดข้อมูลเริ่มต้นสำหรับการเปลี่ยนแปลง D y กำหนด D = B*B-4*A*C - uReal ซึ่งสามารถรับตัวเลขติดลบได้มากกว่า

% main.cl class main open core เพรดิเคต classInfo : core :: classInfo q : () ขั้นตอน (). เพรดิเคต run:core::runnable end class main % main.pro ใช้ค่าคงที่ open core หลัก className = "main" classVersion="". ข้อ classInfo (ชื่อคลาส, คลาสเวอร์ชัน) q () :- stdio : : เขียน ("A = "), A = stdio : : อ่าน () ถ้า (A = 0 ), ! จากนั้น stdio : :write ("ไม่ใช่สมการกำลังสอง" ), stdio : :nl else stdio : :write ("B = " ), B = stdio : :read (), stdio : :write ("C = " ) , C = stdio : : read () เช่นเดียวกับ (B * B = 4 * A * C ) ! แล้ว stdio : : writef ("x = %f" , - B / 2 . 0 / A ) elseif (B * B > 4 * A * C ), ! แล้ว D = B * B - 4 * A * C , stdio : : writef ("x1 = %f\n" , (- B + math : : sqrt (D )) / 2 . 0 / A ), stdio : : writef ("x2 = %f" , (- B - คณิตศาสตร์ :: sqrt (D )) / 2 . 0 / A ) else D = - B * B + 4 * A * C , stdio :: : writef ("x1 = (%f, %f)\n" , - B / 2 . 0 / A , คณิตศาสตร์ : : sqrt (D ) / 2 . 0 / A , stdio : : writef ("x2 = (%f, %f) " , - B / 2 . 0 / A , - math : : sqrt ( D ) / 2 . 0 / A ) end if end if . clauses run():- console : : init(), q(), Success ( สิ้นสุด ใช้เป้าหมายหลัก mainExe:: run (main: :run )

แฟกทอเรียล:

สต็อกสำหรับเวอร์ชัน B-Prolog 7.4-3, gprolog 1.3.0, swipl 5.6.x

เช่นเดียวกับใน GNU Prolog ดังนั้นใน B-Prolog 12! อย่ารีบเร่งในข้อมูลทั้งหมดนั่นคือความหมายของหลังจาก 11! ผิด. SWI-Prolog ไม่มีการเขียนซ้ำ

ผลลัพธ์สำหรับ GNU Prolog: รวบรวม /home/nickolas/Desktop/progopedia/prolog/fact.pl สำหรับรหัสไบต์…
/home/nickolas/Desktop/progopedia/prolog/fact.pl คอมไพล์แล้ว อ่าน 3 บรรทัด - เขียน 1372 ไบต์ 5 ms

ผลลัพธ์ของ B-Prolog: Consulting::fact.pl

`| ? - ความจริง (16, X)

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = -57869312
13! = -215430144
14! = 205203456
15! = -143173632
16! = -143294464

X = -143294464?

% fact.pl ข้อเท็จจริง (X , F ) :- ( X = 0 , F = 1 ; Y คือ X - 1 , ข้อเท็จจริง (Y , Z ), F คือ X * Z ), เขียน (X ), เขียน ("! = "), เขียน (F), nl. % โต้ตอบ [ข้อเท็จจริง] ข้อเท็จจริง(16,X).

หมายเลขฟีโบนักชี:

สต็อกสำหรับเวอร์ชัน B-Prolog 7.4-3, gprolog 1.3.0, swipl 5.6.x

ก้นอาจเหมือนกับก้น ยกเว้นไวยากรณ์ของการเชื่อมต่อไฟล์

% fibonacci.pl :- ไดนามิก (เก็บไว้ / 1) บันทึก (เป้าหมาย): - เก็บไว้ (เป้าหมาย) -> จริง; เป้าหมาย, assertz (เก็บไว้ (เป้าหมาย)). fib (1 , 1 ) :- ! เขียน ("1, " ). fib(2 , 1 ) :- !, เขียน("1, " ). fib(นู๋, F) :- N1 เป็น นู๋- 1 , บันทึก(fib(N1, F1)), N2 เป็น นู๋- 2 , บันทึก(fib(N2, F2)), F เป็น F1 + F2, เขียน(F), เขียน(", " ). % เชิงโต้ตอบ [ ฟีโบนักชี]. fib(16 , X), เขียน("..." ), nl.

การจัดตำแหน่งสี่เหลี่ยม:

รุ่นก้น gprolog 1.3.0

read_integer ไม่ใช่เพรดิเคตมาตรฐาน แต่เป็นส่วนขยายของ GNU Prolog ซึ่งไม่สามารถใช้งานได้จริงในการใช้งานอื่นๆ

q :- เขียน("เอ="), read_integer(อา), ( อา = 0 , เขียน("ไม่ใช่สมการกำลังสอง"); เขียน("b="), read_integer(บี), เขียน("ซี="), read_integer(), ดี เป็น บี* บี- 4 * อา* , ( ดี = 0 , เขียน("x="), X เป็น - บี/ 2 / อา, เขียน(X); ดี > 0 , เขียน("x1="), X1 เป็น (- บี+ sqrt(ดี)) / 2 / อา, เขียน(X1), nl, เขียน("x2="), X2 เป็น (- บี- sqrt(ดี)) / 2 / อา, เขียน(X2); R เป็น - บี/ 2 / อา, ฉัน เป็น หน้าท้อง(sqrt(- ดี) / 2 / อา), เขียน("x1=("), เขียน(R), เขียน(", " ), เขียน(ฉัน), เขียน(")" ), nl, เขียน("x1=("), เขียน(R), เขียน(", -" ), เขียน(ฉัน), เขียน(")" ) ) ).

การจัดตำแหน่งสี่เหลี่ยม:

เป็น บี* บี- 4 * อา* , ( ดี = 0 , เขียน("x="), X เป็น - บี/ 2 / อา, เขียน(X); ดี > 0 , เขียน("x1="), X1 เป็น (- บี+ sqrt(ดี)) / 2 / อา, เขียน(X1), nl, เขียน("x2="), X2 เป็น (- บี- sqrt(ดี)) / 2 / อา, เขียน(X2); R เป็น - บี/ 2 / อา, ฉัน เป็น หน้าท้อง(sqrt(- ดี) / 2 / อา), เขียน("x1=("), เขียน(R), เขียน(", " ), เขียน((นู๋, F) :- นู๋ > 0 , N1 เป็น นู๋ - 1 , แฟกทอเรียล(N1, F1), F เป็น นู๋ * F1. หลัก :- ( สำหรับ(นู๋, 0 , 16 ) ทำ แฟกทอเรียล(นู๋, F), เขียน(นู๋), เขียน("! = " ), เขียน(F), nl ). (N1, F1), ฟีโบนักชี(N2, F2), F เป็น F1 + F2. หลัก :- ( สำหรับ(นู๋, 1 , 16 ) ทำ ฟีโบนักชี(นู๋, F), เขียน(F), เขียน(", " ) ), Writeln("..." ).

หมายเลขฟีโบนักชี:

สต็อกสำหรับ ECLiPSe CLP 6.0 #188

ตัวเลขฟีโบนักชีคำนวณแบบเรียกซ้ำ มีการบันทึกของตัวเอง ดำเนินการโดยใช้กลไกการจัดเก็บเฉพาะ ECLiPSe

สำหรับการจัดระเบียบของวัฏจักร เพรดิเคต main จะชนะการทำซ้ำเฉพาะ ECLiPSe โครงสร้าง(เมตาเพรดิเคต) สำหรับ .

:- ท้องถิ่น เก็บ(ฟีโบนักชี). ฟีโบนักชี(1 , 1 ) :- !. ฟีโบนักชี(2 , 1 ) :- !. ฟีโบนักชี(นู๋, F) :- นู๋ > 2 , ( % ของผลการออมของผู้ชนะ store_get(ฟีโบนักชี, นู๋, F), ! ; N1 เป็น นู๋ - 1 , N2 เป็น นู๋ - 2 , ฟีโบนักชี(N1, F1), ฟีโบนักชี(N2, F2), F เป็น F1 + F2, store_set(ฟีโบนักชี, นู๋, F) % นำผลออกไป ). หลัก :- ( สำหรับ(นู๋, 1 , 16 ) ทำ ฟีโบนักชี(นู๋, F), เขียน(F), เขียน(", " ) ), Writeln("..." ).



ใน Prolose จำเป็นต้องแก้ปัญหาด้วยตรรกะ vysnovk ในตำแหน่งก่อนหน้านี้ ให้เสียงโปรแกรมบน Prolose ไม่ є sledovnіstyu dіy, - ชนะ єชุดของข้อเท็จจริงจากกฎ, scho รับรองการเลือกของvisnovkіvบนพื้นฐานของข้อเท็จจริงเหล่านี้ ถึงบทนำ vodomy yak ภาษาประกาศ

อารัมภบทรวมถึงกลไกของการมองเห็นซึ่งมีพื้นฐานมาจากสถานที่ที่กำหนด สำหรับความช่วยเหลือในการรับคำแนะนำเกี่ยวกับการดื่มไวน์ คุณสามารถหาข้อมูลที่นำมา (ที่บ้าน) อารัมภบทพยายามบิดเบือนความจริงของสมมติฐาน (เพื่อให้เป็นความจริงในการจัดหา) ขอข้อมูลเกี่ยวกับเรื่องนี้ซึ่งทราบอยู่แล้วว่าเป็นความจริง ความรู้อารัมภบทของโลก - ข้อเท็จจริง tse obmezheniya nabir (ฉันกฎ) งานสำหรับโปรแกรม

คุณลักษณะที่สำคัญที่สุดอย่างหนึ่งของอารัมภบทคือหลังจากที่ค้นหาหลักฐานเกี่ยวกับโภชนาการที่คุณให้มาอย่างมีเหตุผล คุณอาจเลือกทางเลือกที่เหมาะสมและรู้แนวทางแก้ไขที่เป็นไปได้ทั้งหมด Zamіst zvichaynoї roboti กับ vіd promy її kіntsya, อารัมภบทสามารถหันหลังกลับและมองข้าม "ทาง" มากกว่าหนึ่งทางในกรณีที่มีการละเมิดงานคลังสินค้าทั้งหมด

ตรรกะของเพรดิเคตถูกแยกย่อยออกไปเพื่อให้ง่ายต่อการเปลี่ยนหลักการคิดเชิงตรรกะให้อยู่ในรูปแบบที่สามารถเขียนได้ อารัมภบทของ Victor's Logic Syntax สำหรับการพัฒนาการเขียนโปรแกรมภาพยนตร์ ในตรรกะของเพรดิเคต ก่อนอื่น คุณรวมคำที่ไม่มีความหมายทั้งหมดไว้ในข้อเสนอของคุณ จากนั้นเราจะสร้างข้อเสนอเหล่านี้ขึ้นใหม่ โดยใส่ไว้ในตอนแรกเป็นการแนะนำ และหลังจากการจัดกลุ่มวัตถุใหม่ ข้อโต้แย้งของNadalі ob'єkti stayuet, mіzh yakim เป็นเป้าหมายที่จัดตั้งขึ้น เช่นตัวอย่างที่โต๊ะ การแสดงข้อเสนอซึ่งแปลงในลักษณะเดียวกับไวยากรณ์ของตรรกะของเพรดิเคต

ตารางที่ 1วากยสัมพันธ์ของเพรดิเคตลอจิก

2. ข้อเท็จจริง

มีการอธิบายเกี่ยวกับ Prolose วัตถุ (วัตถุ) นั่น เห็นสีฟ้า (ความสัมพันธ์) แล้วอธิบาย กฎระเบียบ (กฎ); ตัวอย่างเช่น ประพจน์

เป็นที่รักของสุนัข (บิลไลค์ด็อก)

ตั้งค่าการอ้างอิงระหว่างวัตถุ Bill และสุนัข (บิลและสุนัข); การตั้งค่า tsim єชอบ (รัก) ด้านล่างนี้เป็นกฎที่ระบุว่าข้อเสนอ "บิลรักสุนัข" เป็นจริงหรือไม่:

บิลรักหมา เหมือนหมาใจดี (บิลชอบหมาถ้าหมาน่ารัก)

ใน Prolose การอ้างอิงระหว่างอ็อบเจ็กต์เรียกว่า ข้อเท็จจริง(ข้อเท็จจริง). ที่การเคลื่อนไหวตามธรรมชาติ การตั้งค่าเริ่มต้นขึ้นที่แม่น้ำ ตามตรรกะของภาคแสดง ซึ่งได้รับชัยชนะโดยบทนำ การแนะนำวลีง่ายๆ (ข้อเท็จจริง) ที่เกิดขึ้นจากชื่อของวัตถุของวัตถุ หรือของวัตถุ วางลงบนคันธนูกลม ชอบและข้อเสนอ, ความจริงลงท้ายด้วยจุด (.) .

ด้านล่างนี้คือสำเนาข้อเสนอของเหมืองธรรมชาติที่มีคำมั่นสัญญาว่า "จะรัก" (ไลค์):

บิลรักสินดี (บิลเหมือนซินดี้)

ซินดี้รักบิล (ซินดี้เหมือนบิล)

เป็นที่รักของสุนัข (บิลเหมือนหมา)

และตอนนี้ เรามาเขียนข้อเท็จจริงเหล่านี้ใหม่ ไวยากรณ์ vikoristovuyuchi Prolog:

ชอบ (บิล, ซินดี้).

ชอบ (ซินดี้, บิล).

ชอบ (บิล, สุนัข).

ข้อเท็จจริง okrim vіdnosinสามารถหันหลังกลับและแข็งแรง ตัวอย่างเช่น ข้อเสนอของภาพยนตร์ธรรมชาติ "Kermitisgreen" (Kermit greens) และ "Caitlinisgirl" (Caitlin - girl) ใน Prolose ซึ่งสะท้อนถึงหน่วยงานเหล่านั้น มีลักษณะดังนี้:

3. ภาคแสดง

การตั้งค่าที่ Prolose เรียกว่า ภาคแสดง ข้อโต้แย้ง- Tse ob'єkti, scho pov'yazyuyutsya tsim การตั้งค่า; ที่จริง

ชอบ (บิล, ซินดี้).

ไลค์เป็นภาคแสดง และบิลออบเจกต์และซินดี้เป็นอาร์กิวเมนต์

ใช้เพรดิเคตด้วยจำนวนอาร์กิวเมนต์ที่แตกต่างกัน:

pred(จำนวนเต็ม, สัญลักษณ์)

คน (คนสุดท้าย คนแรก เพศ)

วันเกิด (ชื่อ นามสกุล วันที่)

ตัวอย่างแสดงให้เห็นว่าภาคแสดงไม่สามารถเป็นมารดาของการโต้แย้งได้

4. กฎ

กฎอนุญาตให้คุณป้อนข้อเท็จจริงหนึ่งข้อจากข้อเท็จจริงอื่นๆ กล่าวอีกนัยหนึ่งเราสามารถพูดได้ว่า กฎ - tse vysnovok ด้วยเหตุผลบางอย่างว่ามันเป็นความจริง visnovk เพียงอย่างใดอย่างหนึ่งหรืออื่น ๆ ที่รู้จักหรือข้อเท็จจริงเป็นความจริง ด้านล่างนี้เป็นกฎสำหรับลิงก์ "ชอบ":

ซินดี้รักทุกอย่างที่รักบิล (ซินดี้ชอบทุกอย่างที่บิลชอบ)

Caitlin รักสีเขียวทั้งหมด (Caitlin ชอบทุกอย่างที่เป็นสีเขียว)

Vikoristovuyuchi กฎเหล่านี้ คุณสามารถรู้ได้จากข้อเท็จจริงก่อนหน้านี้เกี่ยวกับวิธีการพูด วิธีรัก Sinda และ Caitlin:

สินดีรักสินดี (ซินดี้ชอบซินดี้)

Caitlin รัก Kermit (Caitlin ชอบ Kermit)

ในการแปลกฎเหล่านี้เป็น Prolog คุณต้องเปลี่ยนไวยากรณ์เล็กน้อย:

ชอบ(ซินดี้, บางสิ่งบางอย่าง): - ชอบ(บิล, บางสิ่งบางอย่าง). ilikes(caitlin, Something): - สีเขียว (Something) .

สัญลักษณ์: - maє sens "yakshcho" และทำหน้าที่ย่อยของกฎสองส่วน: ส่วนหัวและร่างกายคุณสามารถดูกฎเป็นขั้นตอนได้ กล่าวอีกนัยหนึ่งกฎเกณฑ์

ชอบ(ซินดี้, บางสิ่งบางอย่าง): - ชอบ(บิล, บางสิ่งบางอย่าง).

ชอบ(caitlin, บางสิ่งบางอย่าง): - สีเขียว (บางสิ่ง).

หมายถึง: "Shob เพื่อนำสิ่งที่Sindіรัก, นำ, scho Bill ให้รัก tse"і" เพื่อบอก Caitlin ถึงสิ่งที่ควรรัก บอกว่าสิ่งใดที่เป็นมิตรกับสิ่งแวดล้อมมากกว่า. จากรูปลักษณ์ "ขั้นตอน" ดังกล่าว กฎสามารถ "ขอ" บทนำของ viskonati іnshіdії, vіdminnіvіdprovovіvfaktіv, ตัวอย่างเช่น, การละเมิด scho-nebud

5. ถาม (Tsіlі)

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

ชอบ (บิล, ซินดี้).

Otrimavshi คำขอดังกล่าว Prologue vіdpovіst:

ว่าอารัมภบทคือข้อเท็จจริง ที่ยืนยันว่าเป็นเช่นนั้น เมื่อปรับอาหารให้เรียบแล้วคุณสามารถบำรุงเลี้ยงด้วยเหมืองธรรมชาติ: อะไร ทำ ใบแจ้งหนี้ ชอบ ? (รักบิลไง)สำหรับกฎของ Prolog เราขอให้:

ชอบ(บิลอะไร).

จำเป็นต้องสังเกตว่าวัตถุอื่น - อะไร - มาจากตัวอักษรที่ยิ่งใหญ่ เช่นเดียวกับวัตถุแรก - บิล - ні ในการนั้น บิลคือการตรึง โพสต์อ็อบเจกต์คือค่าที่มองเห็นได้ อะไรคือการเปลี่ยนแปลง

การเปลี่ยนแปลง เริ่มจากอักษรตัวใหญ่หรือสัญลักษณ์แห่งความมั่นใจเสมอ!

คำนำเป็นshukaєvіdpovіdบน zap อย่างต่อเนื่องโดยเริ่มจากข้อเท็จจริงแรกและแยกแยะข้อเท็จจริงทั้งหมดท่าเรือของกลิ่นเหม็นจะไม่สิ้นสุด. Otrimavshi สอบถามเกี่ยวกับผู้ที่ Bill รักคำสั่ง Prologue:

แล้วรู้ได้อย่างไรว่า

ชอบ (บิล, ซินดี้).

ชอบ (บิล, สุนัข).

ยักบีฉันถามว่า:

ซินดี้ชอบอะไร (สิ่งที่จะรักSindі?)

ชอบ(ซินดี้,อะไร).

จากนั้นอารัมภบทvіdpovіv bi:

คำนำของ Oskolki รู้ว่า Sindy รัก Bill และ Sindi รักคนที่ Bill และ Bill รัก Sindi และสุนัข

เราสามารถใส่อารัมภบทที่เป็นอาหารของ іnshi ได้ คุณสามารถใส่คนได้ อาหารเอลสำหรับ kshtalt "เป็นผู้หญิงที่รัก Bill หรือไม่" อย่าเพิกเฉยต่อการตัดสินใจเพราะอารัมภบทในกรณีนี้ไม่ทราบข้อเท็จจริงเกี่ยวกับหญิงสาวและความผิดไม่สามารถนำไปสู่ ​​vysnovok บนพื้นฐานของข้อมูลที่ไม่รู้จัก: ผู้ที่ไม่ได้ให้ก้นกับอารัมภบทไม่ว่าจะเป็นแบบใด ของคำพูดหรืออำนาจ 'โดยพื้นฐานแล้วสาว ๆ

6. การแจกแจงข้อเท็จจริง กฎ ระเบียบ

เป็นที่ยอมรับว่าเป็นกฎเดียวกัน:

รถ Shvidka - แผนกต้อนรับ (อาฟาสคาริสฟัน).

เครื่องที่ยอดเยี่ยม - การ์นา (รถใหญ่ก็ดี)

รถเล็กใช้งานได้จริง (รถเล็กใช้งานได้จริง).

บิลต้องการรถเพราะเป็นพนักงานต้อนรับ (บิลชอบรถถ้ารถสนุก).

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

แกนของก้นซึ่งแสดงให้เห็นเช่นอารัมภบทของกฎ vikoristovu ของvіdpovіdі zapit ดูความจริงที่ว่ากฎของส่วนนี้ของโปรแกรม ch02e01.pro:

ชอบ (เอลเลน, เทนนิส).

ชอบ (จอห์น, ฟุตบอล).

ชอบ (ขาด, เบสบอล).

ชอบ (เอริค, ว่ายน้ำ).

ชอบ (มาร์ค, เทนนิส).

ไลค์(บิล, กิจกรรม): - ไลค์(ขาด, กิจกรรม).

แถวที่เหลือของโปรแกรมคือกฎ กฎนี้ขึ้นอยู่กับข้อเสนอของการเคลื่อนไหวตามธรรมชาติ:

บิลต้องยุ่ง เหมือนกับที่ทอมต้องยุ่ง (บิลชอบกิจกรรมถ้าทอมชอบกิจกรรมนั้น)

กฎข้อใดมีชื่อเรื่อง - ไลค์ (บิล, กิจกรรม) และ เนื้อหา - ไลค์ (ฉีกขาด, กิจกรรม) ด้วยความเคารพ ไม่มีข้อเท็จจริงเกี่ยวกับคนที่รักเบสบอล เพื่อบอกคุณว่าคุณรัก Bill baseball คุณสามารถถาม Prologue ได้ดังนี้:

ชอบ (บิล, เบสบอล).

พยายามที่จะรู้วิธีแก้ปัญหาสำหรับคำถามนี้ กฎ Prologue vikoristovuvatime:

ดาวน์โหลดโปรแกรม ch02e01.pro จากสภาพแวดล้อมการพัฒนาภาพ VisualProlog และเรียกใช้ด้วยยูทิลิตี้ TestGoal .

ชอบ (สัญลักษณ์,สัญลักษณ์)

ชอบ (เอลเลน, เทนนิส).

ชอบ (จอห์น,ฟุตบอล).

ชอบ (ขาด, เบสบอล).

สิ่งที่ชอบ (เอริค, ว่ายน้ำ).

ชอบ (มาร์ค, เทนนิส).

ไลค์(บิล,กิจกรรม):-ไลค์(ขาด, กิจกรรม).

ชอบ (บิล, เบสบอล).

ยูทิลิตี้ TestGoal มีคุณสมบัติดังต่อไปนี้:

ระบบ vikoristovala kombinovane rule

ไลค์(บิล, กิจกรรม): - ไลค์(ขาด, กิจกรรม).

ชอบ (ขาด, เบสบอล). เช่น สิ่งที่ชอบ (บิล เบสบอล)

ลองใช้คำขอที่ไม่เหมาะสมเดียวกันจากผู้ค้าปลีก GOAL:

ชอบ (บิล, เทนนิส).

ทดสอบการตอบสนองยูทิลิตี้เป้าหมาย:

เศษ:

· ไม่มีข้อเท็จจริง ราวกับว่าดูเหมือนว่าบิลชอบเทนนิส

· การส่งเสริมบิลไปยังรัฐเทนเนสซีไม่สามารถอนุมานอย่างมีเหตุมีผลจากการขัดต่อหลักนิติธรรมและข้อเท็จจริงที่ชัดเจน