โปรแกรมให้เหตุผลเกี่ยวกับซอร์สโค้ดของตัวเอง


15

แรงบันดาลใจสำหรับคำถามนี้คือคำถามต่อไปนี้ (คลุมเครือ): อะไรคือภาษาการเขียนโปรแกรม / รากฐานที่เป็นตรรกะสำหรับการมี AI ซึ่งอาจมีเหตุผลเกี่ยวกับรหัสที่มาของตัวเองและแก้ไขได้หรือไม่

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

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

(B) วิธีการให้เหตุผลเกี่ยวกับสิ่งที่โปรแกรมในภาษา P ทำ นี่คือสองระดับฉันคิดเกี่ยวกับมัน:

  1. ภาษาอื่น Q (พร้อมความสามารถในการพิสูจน์ทฤษฎี) ซึ่งเป็นแบบจำลองสิ่งที่โปรแกรม P ทำ ควรสามารถแสดงและพิสูจน์ข้อความเช่น "ผลลัพธ์ของการรันโปรแกรม p คือ foo"
  2. วิธีให้เหตุผลเกี่ยวกับสิ่งที่โปรแกรม p: โปรแกรมทำในภาษา P เอง (ดังนั้นเราจึงใช้ P = Q ด้านบน)

ระดับนี้มีการดำเนินการในระดับใดหรือความก้าวหน้าในทิศทางนี้คืออะไร? อะไรคืออุปสรรคในทางปฏิบัติ ในแง่ของความตั้งใจดั้งเดิมของคำถามวิธีที่ดีที่สุดในการทำให้เป็นปัญหาคืออะไร?

* * * *

เป็นคำตอบที่แสดง (ขอบคุณ!) คุณสามารถทำทั้งสองอย่าง (A) และ (B1) แยกกันได้ แต่ดูเหมือนว่าการทำด้วยกันเป็นคำถามวิจัยมากกว่า

นี่เป็นความคิดแรกของฉันสำหรับคำถาม (คำเตือน: ค่อนข้างคลุมเครือ) ดูความเห็นของฉันเกี่ยวกับคำตอบของ Martin Berger

ฉันสนใจในการสร้างแบบจำลองภาษาโปรแกรมภาษาโปรแกรมเดียวกันมากกว่าภาษาที่ง่ายกว่า (ดังนั้น P = Q ด้านบน) นี่จะเป็น "การพิสูจน์แนวคิด" ของโปรแกรมที่สามารถ "เหตุผลเกี่ยวกับซอร์สโค้ดของมันเอง" ภาษาการเขียนโปรแกรมที่พิมพ์ออกมาอย่างสม่ำเสมอสามารถให้การรับประกันเกี่ยวกับผลลัพธ์ของฟังก์ชั่นได้ แต่สิ่งนี้ไม่นับว่าเป็น "การให้เหตุผลเกี่ยวกับซอร์สโค้ดของตัวเอง" มากกว่า "Hello world!" นับเป็นควินในภาษาที่จะพิมพ์สตริงเปล่าโดยอัตโนมัติ --- จำเป็นต้องมีการอ้างอิง / การอ้างอิงตนเอง อะนาล็อกที่นี่มีประเภทข้อมูลที่เป็นตัวแทนของโปรแกรม

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

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


1
ทำไมคุณถึงต้องการให้ภาษาทำตัวเป็นนักทฤษฎีบทเพื่อพิสูจน์ว่า "ผลลัพธ์ของการรันโปรแกรม p คือ foo"? ภาษาสามารถเรียกใช้ p! แน่นอนว่าเป็นสิ่งที่เกิดขึ้น
Martin Berger


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

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

1
@HoldenLee สำหรับ "P = Q" คำศัพท์ที่กำหนดขึ้นคือ "การเขียนโปรแกรม meta-homogeneous" ซึ่งตรงข้ามกับ "การเขียนโปรแกรม meta-heterogeneous meta" ที่ P Q.
Martin Berger

คำตอบ:


14

ฉันคิดว่าคุณกำลังถามถึงสองสิ่งที่แตกต่างกัน

  • ความสามารถของภาษาการเขียนโปรแกรมเพื่อแสดงโปรแกรมทั้งหมดเป็นข้อมูล
  • เหตุผลเกี่ยวกับโปรแกรมเป็นข้อมูล

เพื่อประโยชน์ในการวิเคราะห์มันมีประโยชน์ที่จะแยกพวกมันออกจากกัน ฉันจะมุ่งเน้นไปที่อดีต

ความสามารถในการเขียนโปรแกรมภาษาที่จะเป็นตัวแทนจัดการ (และเรียกใช้) โปรแกรมเป็นข้อมูลไปภายใต้เงื่อนไขเช่นเมตาเขียนโปรแกรมหรือ homoiconicity

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

สิ่งที่คุณอาจมีในใจคือสิ่งที่ดีกว่ามาก เช่นถ้าเป็นโปรแกรมดังนั้น P คือPแต่เป็นข้อมูลในมือสำหรับการจัดการและการวิเคราะห์ นี้มักจะถูกเรียกว่าใบเสนอราคา ในทางปฏิบัติใบเสนอราคาไม่ยืดหยุ่นดังนั้นเราจึงใช้ใบเสนอราคาเสมือนแทนซึ่งเป็นลักษณะทั่วไปของใบเสนอราคาที่ใบเสนอราคาสามารถมี 'หลุม' ซึ่งโปรแกรมสามารถเรียกใช้ที่ให้ข้อมูลเพื่อ 'เติม' หลุม ตัวอย่างเช่นฉันfPPPเป็นกึ่งอ้างเป็นตัวแทนของเงื่อนไขที่แทนของสภาพที่เรามีหลุม [ ] หากโปรแกรม Mทำการประเมินข้อมูลx > 0 ดังนั้นค่า quasi-quotei f

ผม[]เสื้อชั่วโมงอีn7อีล.sอี8+9
[]Mx>0ประเมินข้อมูลฉัน
ผม[M]เสื้อชั่วโมงอีn7อีล.sอี8+9
ผมx>0เสื้อชั่วโมงอีn7อีล.sอี8+9.

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

ภาษาการเขียนโปรแกรมหลายภาษาเสนอราคากึ่งคำพูดและคุณสมบัติอื่น ๆ สำหรับการเขียนโปรแกรมเมตา มันเป็นการกระเพื่อมที่มีฟังก์ชั่นการทำมาโครซึ่งเป็นผู้บุกเบิกความสามารถนี้ในการรักษาโปรแกรมเป็นข้อมูล น่าเสียดายที่พลังของมาโครที่ใช้เสียงกระเพื่อมนั้นถูกมองเห็นมานานแล้วที่จะวางตัวบนไวยากรณ์ที่เรียบง่ายของ Lisp; มันไม่ได้จนกว่า MetaML (1) ว่าภาษาที่ทันสมัยและหลากหลาย syntactically ก็แสดงให้เห็นว่ามีความสามารถในการเขียนโปรแกรมเมตา ตั้งแต่นั้นมา MetaOCaml (2) (ผู้สืบทอดของ MetaML มีความสำคัญสำหรับการพัฒนาอย่างต่อเนื่องในการแสวงหาอย่างต่อเนื่องเพื่อแก้ปัญหาวิธีการพิมพ์โปรแกรมเป็นข้อมูล), Template Haskell (3) และ Converge (4) (ภาษาแรกที่ ได้รับคุณสมบัติการเขียนโปรแกรมเมตาทั้งหมดที่สำคัญในความคิดของฉัน) ได้แสดงให้เห็นว่าภาษาการเขียนโปรแกรมที่ทันสมัยสามารถใช้ในการเขียนโปรแกรมเมตา เป็นสิ่งสำคัญที่ต้องตระหนักว่าเราสามารถรับได้LLม.พีL

อีโวลต์aล.()PPPPอีโวลต์aล.(P)PP

สำหรับมิติที่สองให้เหตุผลเกี่ยวกับโปรแกรมที่ให้เป็นข้อมูล ทันทีที่คุณสามารถแปลงโปรแกรมเป็นข้อมูลจะเป็นข้อมูล 'ปกติ' และสามารถให้เหตุผลว่าเป็นข้อมูล คุณสามารถใช้เทคโนโลยี prover ได้ทุกรูปแบบเช่นประเภทตามสัญญาหรือผู้พิสูจน์ทฤษฎีบทเชิงโต้ตอบหรือเครื่องมืออัตโนมัติตามที่ Joshua ได้ชี้ให้เห็น อย่างไรก็ตามคุณจะต้องเป็นตัวแทนความหมายของภาษาของคุณในกระบวนการให้เหตุผล หากภาษานั้นตามที่คุณต้องการมีความสามารถในการเขียนโปรแกรมเมตาสิ่งต่าง ๆ อาจกลายเป็นเรื่องยุ่งยากและไม่ได้ทำงานมากนักในทิศทางนี้โดยที่ (5) เป็นตรรกะของโปรแกรมสำหรับวัตถุประสงค์นี้เท่านั้น นอกจากนี้ยังมีงาน Curry-Howard ที่ใช้เหตุผลเกี่ยวกับการเขียนโปรแกรมเมตา (6, 7, 8) โปรดทราบว่าวิธีการที่ใช้ตรรกะเหล่านี้ และวิธีการตามประเภท (2) สามารถแสดงคุณสมบัติที่แน่นอนสำหรับทุกขั้นตอนการเขียนโปรแกรมเมตาในอนาคต นอกเหนือจาก (2) ไม่มีการใช้เอกสารเหล่านี้

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


  1. W. Taha หลายขั้นตอนการเขียนโปรแกรม: ใช้ทฤษฎีและการประยุกต์ใช้งาน

  2. W. Taha และ MF Nielsen ลักษณนามสิ่งแวดล้อม

  3. T. Sheard และ S. Peyton Jones แม่แบบ meta-การเขียนโปรแกรมสำหรับ Haskell

  4. L. Tratt เวลารวบรวม meta-การเขียนโปรแกรมในภาษา

  5. เอ็มเบอร์เกอร์ลิตร TRATT, โปรแกรมสำหรับ Logics เป็นเนื้อเดียวกัน Meta-การเขียนโปรแกรม

  6. อาร์เดวีส์, เอฟ Pfenning, การวิเคราะห์กิริยาของการคำนวณการจัดฉาก

  7. อาร์เดวีส์เข้าใกล้ขมับตรรกะการเข้าเล่มเวลาการวิเคราะห์

  8. T. Tsukada, A. Igarashi มูลนิธิตรรกะสำหรับลักษณนามสภาพแวดล้อม


คุณพูดถูก - ภาษาการเขียนโปรแกรม P อาจแตกต่างจากภาษา Q ที่แสดงทฤษฎี / บทพิสูจน์เกี่ยวกับโปรแกรมในภาษานั้น (ซึ่งอาจเป็น Coq เป็นต้น) ทฤษฎีบทที่ฉันคิดจะเป็นแบบนี้: สมมติว่าเรามีโปรแกรมที่ออกแบบมาอย่างระมัดระวัง A_1 Thm: สำหรับทุก ๆ n ต่อไปนี้: โปรแกรม A_n จะส่งออก (m_n, A_ {n + 1}) โดยที่ m_n เป็นจำนวนเต็ม A_ {n + 1} เป็นอีกโปรแกรมหนึ่ง (เช่นที่ได้จากการแก้ไข A_n ด้วยวิธีใดวิธีหนึ่ง) และสำหรับ n ทั้งหมดเรามี m_n> 0
โฮลเดนลี

(เวอร์ชันนิยายวิทยาศาสตร์ของเรื่องนี้คือเรามี "หลักฐาน" ที่โปรแกรมที่ปรับเปลี่ยนตัวเองจะไม่กดปุ่มที่เปิดตัวขีปนาวุธนิวเคลียร์พูดหรือว่าโปรแกรมจะเพิ่มประสิทธิภาพในปริมาณที่แน่นอนเสมอ)
โฮลเดน Lee

นี่คือเหตุผลที่ฉันต้องการแยกความแตกต่างระหว่างการรันโปรแกรมและการให้เหตุผลว่าโปรแกรมจะส่งออกอะไร - เราต้องการทราบคุณสมบัติของสิ่งที่จะทำก่อนที่จะรันโดยไม่ต้องรัน โปรดทราบว่าหากเราต้องการให้ A_n สามารถ "แก้ไขซอร์สโค้ดของมัน" เพื่อสร้าง A_ {n + 1} ดังนั้น P จะต้องมีความสามารถในการ metaprogramming (ซึ่งทำให้เราอยู่ในตำแหน่ง (5))
โฮลเดนลี

ดูเหมือนว่าฉันจะยังน่าสนใจสำหรับ P = Q Hypothetically, A เป็นโปรแกรม AI และวิธีที่จะแก้ไขตัวเองคือการให้เหตุผลเกี่ยวกับรหัสของตัวเอง - ตัวอย่างเช่นเขียนทฤษฎีบทเกี่ยวกับบิตของรหัสพิสูจน์พวกเขาแล้วแก้ไขรหัสของมันเท่านั้น ดูเหมือนว่า P จะต้องมีความสามารถของ Q.
โฮลเดนลี

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

6

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

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

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

ดังนั้นภาษา homoiconic จึงทำตามข้อกำหนดสามประการของคุณ คุณยังสามารถกำหนดความคิดของโปรแกรมอย่างเป็นทางการ

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

ในเวลาปัจจุบันปัญหาสี่คือคำถามการวิจัยและด้านล่างคือสิ่งที่ฉันได้พบว่าพยายามตอบคำถามนี้

ฉันจะบอกว่ามีโปรแกรมหลายประเภทที่พยายามทำเช่นนี้ ด้านล่างเป็นโปรแกรมทั้งหมดที่ฉันรู้

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

  • Coqเป็นสภาพแวดล้อมที่ช่วยให้คุณระบุการพิสูจน์โดยใช้ภาษาการเขียนโปรแกรม นอกจากนี้ยังมีกลยุทธ์ที่แนะนำวิธีการในการแก้ปัญหา สิ่งนี้คาดหวังว่ามนุษย์จะทำงานได้ Coq ใช้ชนิดที่พึ่งพาในการทำงานและดังนั้นจึงเป็นทฤษฎีประเภท เป็นที่นิยมมากในหมู่นักวิทยาศาสตร์คอมพิวเตอร์และผู้ที่ทำงานเกี่ยวกับ Homotopy Type Theory

  • ACL2ในทางกลับกันเป็นนักทฤษฎีบทอัตโนมัติ ระบบนี้จะพิสูจน์ข้อความตามสิ่งที่คุณเขียนโปรแกรม

  • ACL2 และ Coq มีปลั๊กอินซอฟต์แวร์ที่อินเตอร์เฟซระบบของพวกเขามีระบบการเรียนรู้เครื่อง สิ่งที่ใช้ในการฝึกอบรมระบบเหล่านี้เป็นโปรแกรมที่เขียนไว้ก่อนหน้านี้ จากความเข้าใจของฉันระบบเหล่านี้เพิ่มคุณสมบัติอื่นที่คุณมีไม่เพียง แต่กลยุทธ์ของคุณ แต่แนะนำทฤษฎีที่ช่วยในการพิสูจน์การพัฒนา

ด้านล่างเป็นพื้นฐานของความหมายของคำถามของคุณ

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

1
ไม่จำเป็นต้องทำภาษาให้น้อยที่สุดเท่าที่จะทำได้ คุณสามารถเพิ่มคุณสมบัติการเขียนโปรแกรมเมตาที่เกี่ยวข้องกับภาษาใด ๆ งาน MetaML ของ Taha แสดงให้เห็นแล้ว แท้จริงแล้วการเพิ่มความสามารถในการเขียนโปรแกรมเมตาคือกลไก
Martin Berger

1
ฉันไม่เห็นด้วยที่ "ไม่มีระบบปัจจุบันที่ทำทั้งสี่ขั้นตอน" คำถามที่ 4 พูดถึงการรันโปรแกรมที่กำหนดเป็นรหัสเท่านั้น มันเป็นไปได้อย่างสมบูรณ์แม้กระทั่ง Javal Eval ก็ทำได้
Martin Berger

@MartinBerger สิ่งที่ฉันหมายถึงคือคุณสร้างเคอร์เนลให้น้อยที่สุดเท่าที่จะทำได้ นอกจากนี้หากคุณต้องการเริ่มหวังว่าระบบของคุณจะทำ # 4 คุณจะต้องการระบบที่คุณสามารถฝึกอบรมไม่เพียง แต่มนุษย์ แต่ใช้คอมพิวเตอร์ดังนั้นมันจะเป็นประโยชน์ต่อคุณที่จะมีระบบน้อยที่สุดและมีห้องสมุดที่มีรหัส ระบบที่เหมือนการเขียนโปรแกรมเมตาแม่แบบ
โจชัวเฮอร์แมน

ขึ้นอยู่กับว่าเรากำลังพูดถึงอะไร (4) คำถามเดิมประกอบด้วยสองเนื้อหาอย่างละเอียด สิ่งแรกคือเรื่องไม่สำคัญคุณแค่เรียกใช้โปรแกรม ตรรกะตัวที่สองที่ฉันสามารถจัดการได้คือ (5) ในคำตอบของระบบพิมพ์ (2) ภายหลังถูกนำมาใช้ใน MetaOCaml แต่มีขอบเขตสำหรับการวิจัยเพิ่มเติม: ไม่ (2) หรือ (5) สามารถจัดการกับรูปแบบการเขียนโปรแกรมโดยพลการและคุณสมบัติที่รับประกันโดย (2) อ่อนแอเล็กน้อย (หลังจากทั้งหมดมันเป็นระบบการพิมพ์ที่มีการอนุมานประเภท) .
Martin Berger

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

5

ตามคำตอบของ @ user217281728ระบุว่ามีเครื่องหลายประเภทที่เกี่ยวข้องกับการอนุมานและ AI ที่เรียกว่าGödel Machines

เครื่องGödelเป็นโปรแกรมคอมพิวเตอร์ที่พัฒนาตนเองที่คิดค้นโดยJürgen Schmidhuber ที่แก้ปัญหาได้อย่างเหมาะสมที่สุด มันใช้โปรโตคอลการพัฒนาตนเองแบบเรียกซ้ำซึ่งมันจะเขียนโค้ดของตัวเองใหม่เมื่อสามารถพิสูจน์ได้ว่ารหัสใหม่นั้นเป็นกลยุทธ์ที่เหมาะสมที่สุด เครื่องถูกคิดค้นโดยJürgen Schmidhuber แต่ถูกตั้งชื่อตาม Kurt Gödelผู้สร้างแรงบันดาลใจทฤษฎีทางคณิตศาสตร์

การตีพิมพ์อ้างอิงของJürgen Schmidhuber ใน"เครื่อง Goedel: การแก้ปัญหาสากลอ้างอิงตนเองทำให้การปรับปรุงตนเองที่เหมาะสม", (2006) arXiv: cs / 0309048v5

วิธีที่เครื่องใช้ในการประยุกต์ใช้การเรียนรู้เมตามีสองขั้นตอน:

  1. เรียนรู้จากข้อมูล (ระดับ 1 เรียนรู้)
  2. การใช้ข้อมูลที่เรียนรู้เพื่อแก้ไข / เพิ่มประสิทธิภาพซอร์สโค้ด / อัลกอริธึม (ระดับ 2 เรียนรู้ที่จะเรียนรู้)

เนื่องจากเครื่องปรับเปลี่ยนแหล่งที่มาของตัวเองมันคือการอ้างอิงตนเองเช่นมีคุณสมบัติการปรับเปลี่ยนตนเอง (ดูที่นี่ด้วย )

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

..a เครื่องGödelที่มีทรัพยากรการคำนวณไม่ จำกัด จะต้องเพิกเฉยต่อการพัฒนาตนเองซึ่งประสิทธิภาพนั้นไม่สามารถพิสูจน์ได้

ภาษาอื่น ๆ (และเครื่องล่ามเกี่ยวข้องของพวกเขา) ซึ่งมีคุณสมบัติการปรับเปลี่ยนตนเองเป็นเช่นLISP

ในรหัส LISP และข้อมูลสามารถเปลี่ยนแปลงได้หรือรหัสแหล่ง AST มีให้เป็นข้อมูลในโปรแกรม LISP และสามารถแก้ไขเป็นข้อมูลได้ ในทางกลับกันข้อมูลสามารถถูกมองว่าเป็น AST สำหรับซอร์สโค้ดบางตัว

ปรับปรุง

มีเครื่องอื่น ๆ ได้เป็นอย่างดีเช่นเดียวกับเครื่องตัวเองการเขียนโปรแกรม (อื่น) ซึ่งรวมการอ้างอิงตัวเอง , ตัวเองทำสำเนาและการเขียนโปรแกรมด้วยตนเอง

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

สำหรับรายละเอียดเพิ่มเติม (และสิ่งพิมพ์เพิ่มเติม) อ้างถึงJP Moulin, CR Biologies 329 (2006)

บทคัดย่อ

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


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