อะไรทำให้ทัวริงทัวริงสมบูรณ์


15

ฉันรู้ว่ามันสามารถพิสูจน์ได้ว่า PROLOG นั้นเสร็จสมบูรณ์โดยการสร้างโปรแกรมที่จำลองเครื่องทัวริงดังนี้:

turing(Tape0, Tape) :-
    perform(q0, [], Ls, Tape0, Rs),
    reverse(Ls, Ls1),
    append(Ls1, Rs, Tape).

perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
    symbol(Rs0, Sym, RsRest),
    once(rule(Q0, Sym, Q1, NewSym, Action)),
    action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
    perform(Q1, Ls1, Ls, Rs1, Rs).

symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).

action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).

left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).

แหล่ง

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


4
คุณต้องใช้คุณสมบัติของการเปิดฉากที่ใช้ในข้อมูลโค้ดของคุณเท่านั้น
Yuval Filmus

1
คุณเห็นคำถามนี้หรือไม่
Raphael

2
@YuvalFilmus: อาจมีวิธีอื่นในการเขียนโปรแกรมเครื่องทัวริงใน PROLOG
Lenar Hoyt

คำตอบ:


18

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

สมมติว่าคุณได้ทำการคำนวณทางคณิตศาสตร์แล้ว นอกจากนี้เราจะสมมติว่าคุณไม่ได้มีคุณสมบัติใด ๆ ที่ไม่ใช่ตรรกะเช่นatom_chars, assertและอื่น ๆ ซึ่งช่วยให้แง่ทั่วไป

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

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

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



จุดที่ดีมาก ฉันไม่ได้คิดเกี่ยวกับการหาปริมาณ แต่นั่นเป็นอีกแนวทางหนึ่ง
นามแฝง

0

ตอบคำถามยอดเยี่ยมให้สมบูรณ์โดย @Pseudonym และอ้างถึงคำถามสุดท้ายของคุณว่า

คุณอาจหมายถึง: ภาษาที่สร้างขึ้นจากสัญลักษณ์ฟังก์ชั่นเท่านั้นที่สามารถทำให้ทัวริงสมบูรณ์

คำตอบคือใช่ - คิดว่าภาษาโปรแกรมการทำงานเช่น ML และ Haskell

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