Điều gì làm cho PRITAL Turing-hoàn thành?


15

Tôi biết rằng có thể chứng minh PRITAL là Turing-Complete bằng cách xây dựng một chương trình mô phỏng máy Turing như thế này:

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]).

Nguồn

Tuy nhiên, tôi đang tự hỏi những phần nào của ngôn ngữ PRITAL người ta có thể loại bỏ (đặc biệt là các ký hiệu hàm, quá tải mệnh đề, đệ quy, thống nhất) mà không làm mất tính hoàn chỉnh của Turing. Là biểu tượng chức năng Turing hoàn thành?


4
Bạn chỉ cần các tính năng của prolog được sử dụng trong đoạn mã của bạn.
Yuval Filmus

1
Bạn đã thấy câu hỏi này ?
Raphael

2
@YuvalFilmus: Có thể có nhiều cách khác để lập trình máy Turing trong PRITAL.
Lenar Hoyt

Câu trả lời:


18

Đó là một quy tắc khá đáng tin cậy rằng tính đầy đủ của Turing phụ thuộc vào khả năng xây dựng câu trả lời hoặc giá trị trung gian của "kích thước" không giới hạn và khả năng lặp lại hoặc lặp lại số lần không giới hạn. Nếu bạn có hai điều đó, có lẽ bạn có Turing-đầy đủ. (Cụ thể hơn, nếu bạn có thể xây dựng số học Peano, thì bạn chắc chắn có Turing-đầy đủ!)

Chúng ta hãy giả sử rằng bạn đã tước số học. Chúng tôi cũng sẽ cho rằng bạn không có bất kỳ tính năng phi logic nào atom_chars, assertv.v., cho phép các shenanigans nói chung.

Nếu bạn loại bỏ các ký hiệu chức năng, bạn không thể tạo câu trả lời hoặc trung gian có kích thước không hạn chế; bạn chỉ có thể sử dụng các nguyên tử xuất hiện trong chương trình và truy vấn. Do đó, tập hợp tất cả các giải pháp có thể cho bất kỳ truy vấn nào là hữu hạn , do đó, việc lấy điểm cố định ít nhất của chương trình / truy vấn sẽ luôn chấm dứt. Datalog (một ngôn ngữ truy vấn cơ sở dữ liệu quan hệ dựa trên Prolog) hoạt động theo nguyên tắc này.

Tương tự, nếu bạn giới hạn Prolog chỉ với đệ quy nguyên thủy (không bao gồm đệ quy như trường hợp suy biến), thì lượng đệ quy mà bạn có thể làm bị giới hạn bởi kích thước của truy vấn, vì vậy tất cả tính toán chấm dứt. Vì vậy, bạn cần đệ quy chung cho Turing-đầy đủ.

Và, tất nhiên, nếu bạn có đệ quy chung, bạn có thể cắt toàn bộ các tính năng và giữ lại tính đầy đủ của Turing, bao gồm thống nhất chung (xây dựng và khớp mẫu cấp cao nhất là đủ), phủ định và cắt.



Điểm rất tốt. Tôi đã không nghĩ về định lượng, nhưng đó thực sự là một cách tiếp cận khác.
Bút danh

0

Hoàn thành câu trả lời xuất sắc của @Pseudonymous và đề cập đến câu hỏi cuối cùng của bạn "Các ký hiệu chức năng có phải là Turing hoàn chỉnh không?".

Bạn có thể có nghĩa là: Một ngôn ngữ chỉ được tạo từ các ký hiệu chức năng có thể là Turing-Complete không?

Câu trả lời là có - hãy nghĩ về các ngôn ngữ lập trình hàm như ML và Haskell.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.