กลับไปหน้าบทความ

อ่าน 25 นาที

ฟังก์ชันเรียกซ้ำแบบดั้งเดิม

ในทฤษฎีความสามารถในการคำนวณฟังก์ชันเรียกซ้ำแบบดั้งเดิม (primitive recursive function)โดยคร่าว ๆ แล้ว คือฟังก์ชันที่สามารถคำนวณได้โดยโปรแกรมคอมพิวเตอร์ที่มีลูป เป็น ลูป...

ฟังก์ชันเรียกซ้ำแบบดั้งเดิม

ในทฤษฎีความสามารถในการคำนวณฟังก์ชันเรียกซ้ำแบบดั้งเดิม (primitive recursive function)โดยคร่าว ๆ แล้ว คือฟังก์ชันที่สามารถคำนวณได้โดยโปรแกรมคอมพิวเตอร์ที่มีลูป เป็น ลูป "for"ทั้งหมด(กล่าวคือ ขอบเขตบนของจำนวนรอบการทำซ้ำในแต่ละลูปจะถูกกำหนดไว้ก่อนเข้าลูป) ฟังก์ชันเรียกซ้ำแบบดั้งเดิมเป็นกลุ่มย่อย ที่เข้มงวด ของฟังก์ชันเรียกซ้ำทั่วไปที่เป็นฟังก์ชันสมบูรณ์ (total function ) ด้วย

ความสำคัญของฟังก์ชันเรียกซ้ำแบบดั้งเดิมอยู่ที่ข้อเท็จจริงที่ว่าฟังก์ชันที่คำนวณได้ ส่วนใหญ่ ที่ศึกษาในทฤษฎีจำนวน (และโดยทั่วไปในคณิตศาสตร์) เป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิม ตัวอย่างเช่นการบวกและการหารฟังก์ชันแฟกทอเรียลและฟังก์ชันเลขชี้กำลังและฟังก์ชันที่ส่งคืนจำนวนเฉพาะลำดับที่nล้วนเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิม[ 1 ]ในความเป็นจริง การแสดงให้เห็นว่าฟังก์ชันที่คำนวณได้เป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิมนั้นเพียงพอที่จะแสดงให้เห็นว่าความซับซ้อนของเวลา ของฟังก์ชันนั้น มีขอบเขตบนโดยฟังก์ชันเรียกซ้ำแบบดั้งเดิมที่มีขนาดเท่ากับอินพุต[ 2 ]ดังนั้นจึงไม่ใช่เรื่องง่ายนักที่จะคิดค้นฟังก์ชันที่คำนวณได้ที่ไม่ใช่ฟังก์ชันเรียกซ้ำแบบดั้งเดิม ตัวอย่างบางส่วนแสดงอยู่ในหัวข้อ§ ข้อจำกัดด้านล่าง

ในทฤษฎีความซับซ้อนของการคำนวณ กลุ่มของฟังก์ชันเรียกซ้ำแบบดั้งเดิมเรียกว่าPR ( Primitive Recursive Functions )

คำนิยาม

ฟังก์ชันเรียกซ้ำแบบดั้งเดิม (primitive recursive function) รับอาร์กิวเมนต์จำนวนคงที่ ซึ่งแต่ละตัวเป็นจำนวนธรรมชาติ (จำนวนเต็มที่ไม่เป็นลบ: {0, 1, 2, ...}) และส่งคืนค่าเป็นจำนวนธรรมชาติ หากรับ อาร์กิวเมนต์ nตัว จะเรียกว่าฟังก์ชันเรียกซ้ำ แบบ n ตัว (n - ary function )

ฟังก์ชันเรียกซ้ำพื้นฐานดั้งเดิมนั้นกำหนดโดยสัจพจน์ เหล่านี้ :

  1. ฟังก์ชันคงที่ : สำหรับจำนวนธรรมชาติแต่ละจำนวนและทุกๆ k ฟังก์ชันคงที่ k -ary ที่กำหนดโดย k-ary นั้นเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิม
  2. ฟังก์ชันผู้สืบทอด : ฟังก์ชันผู้สืบทอดแบบ 1 อะรีSซึ่งส่งคืนผู้สืบทอดของอาร์กิวเมนต์ (ดูหลักการของ Peano ) นั่นคือเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิม
  3. ฟังก์ชันการฉายภาพ : สำหรับจำนวนธรรมชาติทั้งหมดที่ฟังก์ชันk -ary ที่กำหนดโดยเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิม

ฟังก์ชันเรียกซ้ำแบบดั้งเดิมที่ซับซ้อนยิ่งขึ้นสามารถได้มาจากการประยุกต์ใช้การดำเนินการที่กำหนดโดยสัจพจน์เหล่านี้:

  1. ตัวดำเนินการประกอบ (เรียกอีกอย่างว่าตัวดำเนินการแทนที่ ): กำหนดให้ฟังก์ชันm -ary และฟังก์ชันk -ary จำนวน m ฟังก์ชัน : สำหรับจะได้การประกอบฟังก์ชันแบบปกติ
  2. ตัวดำเนินการเรียกซ้ำแบบดั้งเดิม : กำหนดให้ ฟังก์ชัน k -ary และฟังก์ชัน -ary :

    การตีความ:

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

ฟังก์ชันเรียกซ้ำแบบดั้งเดิมคือฟังก์ชันพื้นฐานและฟังก์ชันที่ได้จากฟังก์ชันพื้นฐานโดยการใช้การดำเนินการเหล่านั้นซ้ำกันเป็นจำนวนจำกัดครั้ง

การเรียกซ้ำแบบดั้งเดิมของฟังก์ชันค่าเวกเตอร์

ฟังก์ชัน (เวกเตอร์ค่า) [ 5 ] เรียกว่าฟังก์ชันเรียกซ้ำแบบดั้งเดิม หากสามารถเขียนได้ดังนี้

โดยที่แต่ละส่วนประกอบเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิม (ค่าสเกลาร์) [ 6 ]

ตัวอย่าง

  • เป็นฟังก์ชัน 1-ary ที่ส่งค่ากลับสำหรับทุกอินพุต: .
  • เป็นฟังก์ชัน 1-ary ที่ส่งค่ากลับสำหรับทุกอินพุต: .
  • เป็นฟังก์ชันศูนย์ตัวแปร กล่าวคือ ค่าคงที่: .
  • คือฟังก์ชันเอกลักษณ์บนจำนวนธรรมชาติ: .
  • และเป็นการฉายภาพด้านซ้ายและด้านขวาบนคู่จำนวนธรรมชาติ ตามลำดับ: และ
  • เป็นฟังก์ชัน 1-ary ที่บวก 2 เข้ากับค่าอินพุต
  • เป็นฟังก์ชัน 1-ary ที่ส่งคืน 1 สำหรับทุกอินพุต: นั่นคือและเป็นฟังก์ชันเดียวกัน: ในทำนองเดียวกัน ทุกสามารถแสดงเป็นการประกอบของและ จำนวนมากที่เหมาะสม ยิ่งไปกว่านั้นเท่ากับเนื่องจากด้วยเหตุผลเหล่านี้ ผู้เขียนบางคน[ 7 ] กำหนดเฉพาะสำหรับและ

ส่วนที่เพิ่มเข้าไป

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

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

การเพิ่มขึ้นเป็นสองเท่า

กำหนดให้ฟังก์ชัน 1-ary จะเพิ่มค่าอาร์กิวเมนต์เป็นสองเท่า

การคูณ

เช่นเดียวกับการบวก การคูณสามารถกำหนดได้ด้วยสูตรซึ่งจะทำให้ได้สมการการคูณที่เรารู้จักกันดี:

และ

ผู้มาก่อน

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

การลบแบบตัดทอน

ฟังก์ชันการลบแบบจำกัด (เรียกอีกอย่างว่า " monus " และใช้สัญลักษณ์ " ") สามารถกำหนดได้จากฟังก์ชันก่อนหน้า โดยเป็นไปตามสมการต่อไปนี้

เนื่องจากการเรียกซ้ำทำงานกับอาร์กิวเมนต์ตัวที่สอง เราจึงเริ่มต้นด้วยนิยามการเรียกซ้ำแบบดั้งเดิมของการลบแบบย้อนกลับ. จากนั้นการเรียกซ้ำจะทำงานบนอาร์กิวเมนต์ตัวแรก ดังนั้นนิยามการเรียกซ้ำแบบดั้งเดิมจึงสามารถหาได้เช่นเดียวกับการบวก คือ. เพื่อกำจัดลำดับอาร์กิวเมนต์ที่กลับด้าน ให้กำหนด. ตัวอย่างการคำนวณ

การแปลง述語 (predicate) เป็นฟังก์ชันเชิงตัวเลข

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

เงื่อนไข "เป็นศูนย์"

ตัวอย่างเช่น สำหรับ述语แบบเรียกซ้ำพื้นฐาน ฟังก์ชัน 1-ary จะต้องถูกกำหนดให้เป็นเช่นนั้นถ้าและเป็นอย่างอื่น ซึ่งสามารถทำได้โดยการกำหนดจากนั้นและเช่น

คำกริยา "น้อยกว่าหรือเท่ากับ"

โดยใช้คุณสมบัติดังกล่าว ฟังก์ชัน 2-ary สามารถกำหนดได้โดย จากนั้นถ้าและเป็นอย่างอื่น ตัวอย่างการคำนวณ

คำกริยา "มากกว่าหรือเท่ากับ"

เมื่อได้นิยามของ แล้ว สามารถกำหนด述语 (preverse predicate) ได้เป็นดังนั้นจะเป็นจริง (หรือกล่าวให้แม่นยำยิ่งขึ้นคือ มีค่าเท่ากับ 1) ก็ต่อเมื่อ

ถ้า-แล้ว-มิฉะนั้น

ตัวดำเนินการ if-then-else แบบ 3 ตัวแปร ซึ่งเป็นที่รู้จักในภาษาโปรแกรม สามารถกำหนดได้โดย. จากนั้น สำหรับค่า ใดๆก็ตาม

และ

กล่าวคือจะคืนค่า then-part ( ) หาก if-part ( ) เป็นจริง และคืนค่า else-part ( ) ในกรณีอื่น ๆ

จังก์เตอร์

โดยอาศัยฟังก์ชันดังกล่าว เราสามารถกำหนดตัวเชื่อมตรรกะได้อย่างง่ายดาย ตัวอย่างเช่น การกำหนด จะได้นั่นคือเป็นจริงก็ต่อเมื่อและ เป็นจริง ทั้งคู่( การเชื่อมตรรกะของและ)

ในทำนองเดียวกันและนำไปสู่คำจำกัดความที่เหมาะสมของการเชื่อมแบบ "หรือ " และการปฏิเสธ : และ

เงื่อนไขความเท่าเทียมกัน

โดยใช้ฟังก์ชันข้างต้น, และนิยามนี้ จะใช้ในการ ตรวจ สอบความเท่าเทียมกัน ที่จริงแล้วจะเป็นจริงก็ต่อเมื่อเท่ากับ

ในทำนองเดียวกัน นิยามนี้ใช้หลักการแสดงเงื่อนไข "น้อยกว่า" และใช้หลักการแสดงเงื่อนไข "มากกว่า"

การดำเนินการอื่นๆ บนจำนวนธรรมชาติ

การยกกำลังและการทดสอบความเป็นจำนวนเฉพาะเป็นการเรียกซ้ำแบบดั้งเดิม เมื่อกำหนดฟังก์ชันเรียกซ้ำแบบดั้งเดิม, , , และฟังก์ชันที่ส่งคืนค่าของเมื่อและค่าของในกรณีอื่น ๆ จะเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิม

การดำเนินการกับจำนวนเต็มและจำนวนตรรกยะ

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

ฟังก์ชันเรียกซ้ำพื้นฐานทั่วไปบางประเภท

ตัวอย่างและคำจำกัดความต่อไปนี้มาจากKleene 1974หน้า 222–231 หลายตัวอย่างปรากฏพร้อมกับการพิสูจน์ ส่วนใหญ่ยังปรากฏในชื่อที่คล้ายกัน ไม่ว่าจะเป็นการพิสูจน์หรือเป็นตัวอย่าง ในBoolos, Burgess & Jeffrey 2002หน้า 63–70 พวกเขาเพิ่มลอการิทึม lo(x, y) หรือ lg(x, y) ขึ้นอยู่กับการพิสูจน์ที่แน่นอน

ต่อไปนี้ เครื่องหมาย " ' " เช่น a' เป็นเครื่องหมายดั้งเดิมที่มีความหมายว่า "ผู้สืบทอดของ" ซึ่งโดยทั่วไปมักคิดว่าเป็น " +1" เช่น a +1 = def a' ฟังก์ชัน 16–20 และ #G มีความน่าสนใจเป็นพิเศษในแง่ของการแปลง述语แบบเรียกซ้ำดั้งเดิมไปเป็น และแยก述语เหล่านั้นออกจากรูปแบบ "ทางคณิตศาสตร์" ที่แสดงเป็นจำนวนเกอเด

  1. การบวก: a+b
  2. การคูณ: a×b
  3. การยกกำลัง: a b
  4. แฟกทอเรียล a! : 0! = 1, a'! = a!×a'
  5. pred(a): (ตัวก่อนหน้าหรือการลดค่า): ถ้า a > 0 แล้ว a−1 มิฉะนั้น 0
  6. การลบที่ถูกต้อง a ∸ b: ถ้า a ≥ b แล้ว a−b มิฉะนั้น 0
  7. ขั้นต่ำ(a 1 , ... a n )
  8. ค่าสูงสุด(a 1 , ... a n )
  9. ผลต่างสัมบูรณ์: | a−b | = def (a ∸ b) + (b ∸ a)
  10. ~sg(a): NOT[signum(a)]: ถ้า a=0 แล้ว 1 มิฉะนั้น 0
  11. sg(a): signum(a): ถ้า a=0 แล้ว 0 มิฉะนั้น 1
  12. a | b: (a หาร b ลงตัว): ถ้า b=k×a สำหรับ k บางค่า แล้ว 0 มิฉะนั้น 1
  13. เศษเหลือ (a, b): ตัวเลขที่เหลือหาก b หาร a ไม่ลงตัว เรียกอีกอย่างว่า MOD(a, b)
  14. a = b: sg | a − b | (ตามธรรมเนียมของคลีนน์ จะใช้ 0 แทน ค่าจริงและ1 แทนค่าเท็จ ปัจจุบัน โดยเฉพาะในคอมพิวเตอร์ ธรรมเนียมที่ใช้กันทั่วไปคือแบบกลับกัน คือใช้ 1 แทนค่า จริงและ 0 แทน ค่าเท็จซึ่งเท่ากับเปลี่ยน sg เป็น ~sg ในที่นี้และในข้อถัดไป)
  15. a < b: sg( a' ∸ b )
  16. Pr(a): a เป็นจำนวนเฉพาะ Pr(a) = def a>1 & NOT(มีอยู่ c) 1<c<a [ c|a ]
  17. pi :จำนวนเฉพาะลำดับที่ i+1
  18. (a) i : เลขชี้กำลังของ p iใน a: x ที่ไม่ซ้ำกันซึ่ง p i x |a & NOT(p i x' |a)
  19. lh(a): "ความยาว" หรือจำนวนของเลขชี้กำลังที่ไม่เป็นศูนย์ใน a
  20. lo(a, b): (ลอการิทึมของ a ฐาน b): ถ้า a, b > 1 แล้ว x ที่มากที่สุดที่ทำให้ b x | a มิฉะนั้น 0
ต่อไปนี้ ตัวย่อx = def x 1 , ... x n ; อาจมีการใช้ตัวห้อยหากความหมายต้องการ
  • #A: ฟังก์ชัน φ ที่สามารถนิยามได้อย่างชัดเจนจากฟังก์ชัน Ψ และค่าคงที่ q 1 , ... q nเรียกว่าฟังก์ชันเรียกซ้ำแบบดั้งเดิมใน Ψ
  • #B: ผลรวมอันจำกัด Σ y<z ψ( x , y) และผลิตภัณฑ์ Π y<z ψ( x , y) เป็นการเรียกซ้ำแบบดั้งเดิมใน ψ
  • #C:述语P ที่ได้จากการแทนที่ฟังก์ชัน χ 1 ,..., χ mด้วยตัวแปรตามลำดับของ述语 Q นั้นเป็น 述语แบบเรียกซ้ำดั้งเดิมใน χ 1 ,..., χ m , Q
  • #D:述语ต่อไปนี้ เป็น述语แบบเรียกซ้ำพื้นฐานใน Q และ R:
  • NOT_Q( x ) .
  • Q หรือ R: Q( x ) VR( x ),
  • Q และ R: Q( x ) & R( x ),
  • Q บ่งชี้ R: Q( x ) → R( x )
  • Q เทียบเท่ากับ R: Q( x ) ≡ R( x )
  • #E:述语ต่อไปนี้ เป็น述语แบบเรียกซ้ำพื้นฐานใน述语R:
  • (Ey) y<z R( x , y) โดยที่ (Ey) y<zหมายถึง "มี y อย่างน้อยหนึ่งตัวที่น้อยกว่า z ซึ่งทำให้"
  • (y) y<z R( x , y) โดยที่ (y) y<zหมายถึง "สำหรับทุก y ที่น้อยกว่า z จะเป็นจริงว่า"
  • μy y<z R( x , y) คือตัวดำเนินการ μy y<z R( x , y) ซึ่งเป็น รูปแบบ ที่มีขอบเขตของตัวดำเนินการหาค่าต่ำสุดหรือตัวดำเนินการมิว ( mu-operator ) โดยนิยามว่า "ค่าต่ำสุดของ y ที่น้อยกว่า z ซึ่งทำให้ R( x , y) เป็นจริง หรือ z หากไม่มีค่าดังกล่าว"
  • #F: นิยามตามกรณี: ฟังก์ชันที่นิยามไว้ดังนี้ โดยที่ Q 1 , ..., Q mเป็นเงื่อนไข ที่แยกจากกันโดยสิ้นเชิง (หรือ "ψ( x ) จะมีค่าตามที่กำหนดโดยเงื่อนไขแรกที่ใช้ได้") เป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิมใน φ 1 , ..., Q 1 , ... Q m :
φ( x ) =
  • φ 1 ( x ) ถ้า Q 1 ( x ) เป็นจริง
  • . . . . . . . . . . . . . . . . . . .
  • φ m ( x ) ถ้า Q m ( x ) เป็นจริง
  • φ m+1 ( x ) มิฉะนั้น
  • #G: ถ้า φ สอดคล้องกับสมการ:
ถ้า φ(y, x ) = χ(y, COURSE-φ(y; x 2 , ... x n ), x 2 , ... x nแล้ว φ จะเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิมใน χ ค่า COURSE-φ(y; x 2 ถึง n ) ของฟังก์ชันลำดับค่าจะเข้ารหัสลำดับค่า φ(0, x 2 ถึง n ), ..., φ(y-1, x 2 ถึง n ) ของฟังก์ชันดั้งเดิม

ความสัมพันธ์กับฟังก์ชันเรียกซ้ำ

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

ฟังก์ชันเรียกซ้ำแบบดั้งเดิมทุกฟังก์ชันเป็นฟังก์ชันเรียกซ้ำแบบสมบูรณ์ แต่ฟังก์ชันเรียกซ้ำแบบสมบูรณ์ทั้งหมดไม่จำเป็นต้องเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิมเสมอไปฟังก์ชัน Ackermann A ( m , n ) เป็นตัวอย่างที่รู้จักกันดีของฟังก์ชันเรียกซ้ำแบบสมบูรณ์ (อันที่จริงคือฟังก์ชันสมบูรณ์ที่พิสูจน์ได้) ซึ่งไม่ใช่ฟังก์ชันเรียกซ้ำแบบดั้งเดิม มีการกำหนดลักษณะของฟังก์ชันเรียกซ้ำแบบดั้งเดิมเป็นเซตย่อยของฟังก์ชันเรียกซ้ำแบบสมบูรณ์โดยใช้ฟังก์ชัน Ackermann การกำหนดลักษณะนี้ระบุว่าฟังก์ชันเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิมก็ต่อเมื่อมีจำนวนธรรมชาติmที่ทำให้สามารถคำนวณฟังก์ชันได้โดยเครื่องจักร Turing ที่หยุดทำงาน ภายใน A( m , n ) หรือน้อยกว่าขั้นตอนเสมอ โดยที่ nคือผลรวมของอาร์กิวเมนต์ของฟังก์ชันเรียกซ้ำแบบดั้งเดิม[ 9 ]

คุณสมบัติสำคัญอย่างหนึ่งของฟังก์ชันเรียกซ้ำแบบดั้งเดิมคือ ฟังก์ชันเหล่านี้เป็น เซตย่อย ที่สามารถแจงนับได้แบบเรียกซ้ำของเซตของฟังก์ชันเรียกซ้ำ ทั้งหมด (ซึ่งตัวมันเองไม่สามารถแจงนับได้แบบเรียกซ้ำ) หมายความว่ามีฟังก์ชันเรียกซ้ำเพียงฟังก์ชันเดียวf ( m , n ) ที่แจงนับฟังก์ชันเรียกซ้ำแบบดั้งเดิม ได้แก่:

  • สำหรับฟังก์ชันเรียกซ้ำแบบดั้งเดิมเอกภาคg ทุกฟังก์ชัน จะมีmที่ทำให้g ( n ) = f ( m , n ) สำหรับทุกnและ
  • สำหรับทุกค่าmฟังก์ชันh ( n ) = f ( m , n ) เป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิม
  • ฟังก์ชันเรียกซ้ำแบบดั้งเดิมที่มีอาร์กิวเมนต์สองตัวขึ้นไปสามารถเข้ารหัสเป็นฟังก์ชันเรียกซ้ำแบบดั้งเดิมแบบเอกภาคได้โดยใช้ฟังก์ชันจับคู่ เรียกซ้ำแบบดั้งเดิม ที่มีตัวผกผันเรียกซ้ำแบบดั้งเดิมสองตัว

ฟังก์ชัน fสามารถสร้างขึ้นได้อย่างชัดเจนโดยการทำซ้ำวิธีการสร้างฟังก์ชันเรียกซ้ำแบบดั้งเดิมที่เป็นไปได้ทั้งหมด ดังนั้นจึงพิสูจน์ได้ว่าเป็นฟังก์ชันสมบูรณ์ เราสามารถใช้ การหา ค่าเฉพาะเพื่อแสดงว่าfไม่ใช่ฟังก์ชันเรียกซ้ำแบบดั้งเดิมในตัวมันเอง: หากเป็นเช่นนั้นh ( n ) = f ( n , n )+1 ก็จะเป็นเช่นนั้นด้วย แต่ถ้าสิ่งนี้เท่ากับฟังก์ชันเรียกซ้ำแบบดั้งเดิมบางฟังก์ชัน จะมีmที่ทำให้h ( n ) = f ( m , n ) สำหรับทุกnและจากนั้นh ( m ) = f ( m , m ) ซึ่งนำไปสู่ข้อขัดแย้ง

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

ข้อจำกัด

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

ฟังก์ชันเรียกซ้ำแบบดั้งเดิมที่มีอาร์กิวเมนต์เดียว (เช่น ฟังก์ชันเอกภาค) สามารถแจงนับได้ด้วยวิธีการคำนวณ การแจงนับนี้ใช้คำจำกัดความของฟังก์ชันเรียกซ้ำแบบดั้งเดิม (ซึ่งโดยพื้นฐานแล้วเป็นเพียงนิพจน์ที่มีการประกอบและการดำเนินการเรียกซ้ำแบบดั้งเดิมเป็นตัวดำเนินการ และฟังก์ชันเรียกซ้ำแบบดั้งเดิมพื้นฐานเป็นอะตอม) และสามารถสันนิษฐานได้ว่ามีคำจำกัดความทุกคำเพียงครั้งเดียว แม้ว่าฟังก์ชัน เดียวกัน จะปรากฏหลายครั้งในรายการ (เนื่องจากคำจำกัดความจำนวนมากกำหนดฟังก์ชันเดียวกัน อันที่จริง การประกอบโดยใช้ฟังก์ชันเอกลักษณ์จะสร้างคำจำกัดความของฟังก์ชันเรียกซ้ำแบบดั้งเดิมใดๆ ได้เป็นอนันต์) ซึ่งหมายความว่าคำจำกัดความที่ i ของฟังก์ชันเรียกซ้ำแบบดั้งเดิมในการแจงนับนี้สามารถกำหนดได้อย่างมีประสิทธิภาพจากอันที่จริง หากใช้การกำหนดหมายเลขของ Gödelเพื่อเข้ารหัสคำจำกัดความเป็นตัวเลขคำจำกัดความที่ i ในรายการนี้จะคำนวณได้จากฟังก์ชันเรียกซ้ำแบบดั้งเดิมของให้แทนฟังก์ชันเรียกซ้ำแบบดั้งเดิมเอกภาคที่กำหนดโดยคำจำกัดความนี้

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

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

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

นอกจากนี้ ยังมีตัวอย่างอื่นๆ ของฟังก์ชันเรียกซ้ำโดยสมบูรณ์แต่ไม่ใช่ฟังก์ชันเรียกซ้ำแบบดั้งเดิม ดังนี้:

  • ฟังก์ชันที่รับค่าmไปยังAckermann ( m , m ) เป็นฟังก์ชันเรียกซ้ำแบบสมบูรณ์เอกภาคที่ไม่ใช่ฟังก์ชันเรียกซ้ำแบบดั้งเดิม
  • ทฤษฎีบท ปารีส-แฮร์ริงตันเกี่ยวข้องกับฟังก์ชันเรียกซ้ำทั้งหมดที่ไม่ใช่ฟังก์ชันเรียกซ้ำแบบดั้งเดิม
  • หน้าที่ของ ซูดาน
  • ฟังก์ชันกูดสไตน์

ตัวแปร

ฟังก์ชันคงที่

แทนที่จะใช้ คำจำกัดความแบบเดิม จะใช้ ฟังก์ชันศูนย์แบบ 0-ary เพียงฟังก์ชันเดียวเป็นฟังก์ชันพื้นฐานที่ส่งค่ากลับเป็นศูนย์เสมอ และสร้างฟังก์ชันคงที่จากฟังก์ชันศูนย์ ฟังก์ชันตัวสืบทอด และตัวดำเนินการประกอบ

ฟังก์ชันแบบวนซ้ำ

Robinson [ 10 ] พิจารณาข้อจำกัดต่างๆ ของกฎการเรียกซ้ำ หนึ่งในนั้นคือ กฎการวนซ้ำที่เรียกว่าซึ่งฟังก์ชันhไม่สามารถเข้าถึงพารามิเตอร์x iได้ (ในกรณีนี้ เราอาจสมมติโดยไม่เสียความเป็นทั่วไปว่าฟังก์ชันgเป็นเพียงเอกลักษณ์ เนื่องจากกรณีทั่วไปสามารถหาได้โดยการแทนที่):

เขาพิสูจน์แล้วว่าคลาสของฟังก์ชันเรียกซ้ำแบบดั้งเดิมทั้งหมดสามารถหาได้ด้วยวิธีนี้

การเรียกซ้ำบริสุทธิ์

ข้อจำกัดอีกประการหนึ่งที่ Robinson [ 10 ]พิจารณาคือการเรียกซ้ำแบบบริสุทธิ์โดยที่hไม่สามารถเข้าถึงตัวแปรเหนี่ยวนำy ได้ :

Gladstone [ 11 ]พิสูจน์แล้วว่ากฎนี้เพียงพอที่จะสร้างฟังก์ชันเรียกซ้ำแบบดั้งเดิมทั้งหมด Gladstone [ 12 ]ปรับปรุงสิ่งนี้เพื่อให้แม้แต่การรวมกันของข้อจำกัดทั้งสองนี้ กล่าวคือ กฎ การวนซ้ำบริสุทธิ์ด้านล่าง ก็เพียงพอแล้ว:

การปรับปรุงเพิ่มเติมเป็นไปได้: Severin [ 13 ]พิสูจน์ว่าแม้แต่กฎการวนซ้ำบริสุทธิ์ที่ไม่มีพารามิเตอร์กล่าวคือ

เพียงพอที่จะสร้าง ฟังก์ชันเรียกซ้ำแบบเอก ภาค ทั้งหมดได้ หากเราขยายเซตของฟังก์ชันเริ่มต้นด้วยการลบแบบตัดทอนx ∸ yเราจะได้ ฟังก์ชันเรียกซ้ำแบบปฐมภูมิ ทั้งหมดหากเราเพิ่ม + เป็นฟังก์ชันเริ่มต้นเพิ่มเติม

รูปแบบเรียกซ้ำพื้นฐานเพิ่มเติม

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

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

คำจำกัดความภาษาคอมพิวเตอร์

ตัวอย่างของภาษาโปรแกรมแบบเรียกซ้ำขั้นพื้นฐาน คือ ภาษาที่มีตัวดำเนินการทางคณิตศาสตร์พื้นฐาน (เช่น + และ − หรือการบวกและการลบ) เงื่อนไขและการเปรียบเทียบ (ถ้า-แล้ว, เท่ากับ, น้อยกว่า) และลูปที่มีขอบเขต เช่นลูป for พื้นฐาน ซึ่งมีขอบเขตบนที่ทราบหรือคำนวณได้สำหรับลูปทั้งหมด (FOR i FROM 1 TO n โดยที่ i และ n ไม่สามารถเปลี่ยนแปลงได้โดยตัวลูป) ภาษาโปรแกรมแบบเรียกซ้ำขั้นพื้นฐานไม่อนุญาตให้ใช้ โครงสร้างควบคุมที่มีความทั่วไปมากกว่า เช่นลูป whileหรือ IF-THEN บวกGOTO

ภาษาLOOPซึ่งนำเสนอในบทความปี 1967 โดยAlbert R. MeyerและDennis M. Ritchie [ 14 ] เป็นภาษาดังกล่าว พลังการคำนวณของมันสอดคล้องกับฟังก์ชันเรียกซ้ำแบบดั้งเดิม รูปแบบหนึ่งของภาษา LOOP คือBlooPของDouglas HofstadterในGödel, Escher, Bachการเพิ่มลูปที่ไม่จำกัด (WHILE, GOTO) ทำให้ภาษานี้เป็นภาษาเรียกซ้ำทั่วไปและสมบูรณ์แบบทัวริงเช่นเดียวกับภาษาการเขียนโปรแกรมคอมพิวเตอร์ในโลกแห่งความเป็นจริงทั้งหมด

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

ความจำกัดและความสม่ำเสมอส่งผลให้เกิดผลลัพธ์

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

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

ถ้าTเป็นทฤษฎีเลขคณิตที่สอดคล้องกับสมมติฐานบางประการ โดยมีประโยค Gödel G Tแล้ว PRA จะพิสูจน์การบ่งชี้ Con( T )→ G Tได้

ในทำนองเดียวกัน ผลลัพธ์ทางไวยากรณ์จำนวนมากในทฤษฎีการพิสูจน์สามารถพิสูจน์ได้ใน PRA ซึ่งหมายความว่ามีฟังก์ชันเรียกซ้ำแบบดั้งเดิมที่ดำเนินการแปลงทางไวยากรณ์ที่สอดคล้องกันของการพิสูจน์

ในทฤษฎีการพิสูจน์และทฤษฎีเซตมีความสนใจในการพิสูจน์ความสอดคล้องแบบจำกัด (finitistic consistency proofs) กล่าวคือ การพิสูจน์ความสอดคล้องที่ตัวมันเองยอมรับได้ในเชิงจำกัด การพิสูจน์ดังกล่าวแสดงให้เห็นว่าความสอดคล้องของทฤษฎีTบ่งชี้ถึงความสอดคล้องของทฤษฎีSโดยการสร้างฟังก์ชันเวียนเกิดแบบดั้งเดิม (primitive recursive function) ที่สามารถแปลงการพิสูจน์ความไม่สอดคล้องใดๆ จากSไปเป็นการพิสูจน์ความไม่สอดคล้องจากTได้ เงื่อนไขที่เพียงพอประการหนึ่งสำหรับการพิสูจน์ความสอดคล้องที่จะเป็นแบบจำกัดคือ ความสามารถในการทำให้เป็นทางการใน PRA ตัวอย่างเช่น ผลลัพธ์ความสอดคล้องจำนวนมากในทฤษฎีเซตที่ได้มาจากการบังคับ (forcing)สามารถแปลงใหม่เป็นการพิสูจน์เชิงไวยากรณ์ที่สามารถทำให้เป็นทางการใน PRA ได้

ประวัติศาสตร์

นิยามแบบเรียกซ้ำได้ถูกนำมาใช้ในทางคณิตศาสตร์อย่างเป็นทางการมาก่อนแล้ว แต่การสร้างการเรียกซ้ำแบบดั้งเดิมนั้นสืบย้อนไปถึงทฤษฎีบทที่ 126 ของRichard Dedekind ในหนังสือ Was sind und was sollen die Zahlen? (1888) งานชิ้นนี้เป็นงานแรกที่พิสูจน์ว่าการสร้างแบบเรียกซ้ำบางอย่างกำหนดฟังก์ชันที่ไม่ซ้ำกัน[ 15 ] [ 16 ] [ 17 ]

เลขคณิตแบบเรียกซ้ำดั้งเดิม ได้รับการเสนอครั้งแรกโดยThoralf Skolem [ 18 ]ในปี พ.ศ. 2466

คำศัพท์ปัจจุบันถูกบัญญัติโดยRózsa Péter (1934) หลังจากที่Ackermannได้พิสูจน์ในปี 1928 ว่าฟังก์ชันที่ปัจจุบันตั้งชื่อตามเขานั้นไม่ใช่ฟังก์ชันเรียกซ้ำแบบดั้งเดิม ซึ่งเป็นเหตุการณ์ที่กระตุ้นให้เกิดความจำเป็นในการเปลี่ยนชื่อสิ่งที่ก่อนหน้านี้เรียกว่าฟังก์ชันเรียกซ้ำ[ 16 ] [ 17 ]

ดูเพิ่มเติม

หมายเหตุ

  1. ^ Brainerd & Landweber 1974
  2. ^ฮาร์ทมานิส 1989
  3. ฟาชินี และ มักจิโอโล-เชตตินี 1979
  4. ฟาชินี และ มักจิโอโล-เชตตินี 1982
  5. ^เรียกอีกอย่างว่า "ฟังก์ชันลำดับ " [ 3 ] [ 4 ]
  6. ^ PlanetMath
  7. เช่น Henk Barendregt (1990), "Functional Programming and Lambda Calculus", ในJan van Leeuwen (ed.), Formats and Semantics , Handbook of Theoretical Computer Science, vol. B, Elsevier, หน้า  321– 364, ISBN 0-444-88074-7ที่นี่: 2.2.6 ฟังก์ชันเริ่มต้น , นิยาม 2.2.7 การเรียกซ้ำแบบดั้งเดิม , หน้า 331-332
  8. ^ Kleene 1974 , หน้า 226–227.
  9. ^ข้อสรุปนี้มาจากข้อเท็จจริงที่ว่าฟังก์ชันในรูปแบบนี้เป็นฟังก์ชันแบบเรียกซ้ำดั้งเดิมที่เติบโตเร็วที่สุด และฟังก์ชันจะเป็นฟังก์ชันแบบเรียกซ้ำดั้งเดิมก็ต่อเมื่อความซับซ้อนเชิงเวลาของฟังก์ชันนั้นถูกจำกัดโดยฟังก์ชันแบบเรียกซ้ำดั้งเดิม สำหรับข้อเท็จจริงข้อแรก โปรดดู Linz, Peter (2011), An Introduction to Formal Languages ​​and Automata , Jones & Bartlett Publishers, หน้า 332, ISBN 9781449615529สำหรับประเด็นหลัง โปรดดูMoore, Cristopher ; Mertens, Stephan (2011), The Nature of Computation , Oxford University Press, หน้า 287, ISBN 9780191620805
  10. ^ a b Robinson 1947 .
  11. ^ แกลดส โตน 1967
  12. ^ แกลดส โตน 1971
  13. ^ เซ เวริน 2008
  14. ^ Meyer, Albert R. ; Ritchie, Dennis M. (1967), "ความซับซ้อนของโปรแกรมวนซ้ำ", ACM '67: รายงานการประชุมระดับชาติครั้งที่ 22 ประจำปี 1967 , หน้า  465–469 , doi : 10.1145/800196.806014
  15. ^ปีเตอร์ สมิธ (2013), บทนำเกี่ยวกับทฤษฎีบทของเกอเดล (ฉบับที่ 2), สำนักพิมพ์มหาวิทยาลัยเคมบริดจ์, หน้า  98–99 , ISBN 978-1-107-02284-3
  16. ^ a b George Tourlakis (2003), Lectures in Logic and Set Theory: Volume 1, Mathematical Logic , Cambridge University Press, p. 129, ISBN 978-1-139-43942-8
  17. ^ a b Rod Downey, บรรณาธิการ (2014), มรดกของทัวริง: พัฒนาการจากแนวคิดของทัวริงในตรรกศาสตร์ , สำนักพิมพ์มหาวิทยาลัยเคมบริดจ์, หน้า 474, ISBN 978-1-107-04348-0
  18. ^ Thoralf Skolem (1923) "รากฐานของเลขคณิตเบื้องต้น" ใน Jean van Heijenoortผู้แปลและบรรณาธิการ (1967)จาก Frege ถึง Gödel: หนังสือแหล่งข้อมูลในตรรกศาสตร์คณิตศาสตร์ 1879-1931สำนักพิมพ์มหาวิทยาลัยฮาร์วาร์ด: 302-33
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Primitive_recursive_function&oldid=1331783678 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ฟังก์ชันเรียกซ้ำแบบดั้งเดิม

ในทฤษฎีความสามารถในการคำนวณฟังก์ชันเรียกซ้ำแบบดั้งเดิม (primitive recursive function)โดยคร่าว ๆ แล้ว คือฟังก์ชันที่สามารถคำนวณได้โดยโปรแกรมคอมพิวเตอร์ที่มีลูป เป็น ลูป...

คำนิยาม

ฟังก์ชันเรียกซ้ำแบบดั้งเดิม (primitive recursive function) รับอาร์กิวเมนต์จำนวนคงที่ ซึ่งแต่ละตัว เป็นจำนวนธรรมชาติ (จำนวนเต็มที่ไม่เป็นลบ: {0, 1, 2, ...

การเรียกซ้ำแบบดั้งเดิมของฟังก์ชันค่าเวกเตอร์

ฟังก์ชัน (เวกเตอร์ค่า) [ 5 ] เรียกว่าฟังก์ชันเรียกซ้ำแบบดั้งเดิม หากสามารถเขียนได้ดังนี้ f : N m → N n {\displaystyle f:\mathbb {N} ^{m}\to \mathbb {N} ^{n}}

ตัวอย่าง

C 0 1 {\displaystyle C_{0}^{1}} เป็นฟังก์ชัน 1-ary ที่ส่งค่ากลับสำหรับทุกอินพุต: . 0 {\displaystyle 0} C 0 1 ( x ) = 0 {\displaystyle C_{0}^{1}(x)=0} C 1 1 {\displaystyle C_{1}^{1}} เป็นฟังก์ชัน 1-ary ที่ส่งค่ากลับสำหรับทุกอินพุต: .