PROLOG Turing'i tamamlayan nedir?


15

PROLOG'un Turing-tamamlandığını kanıtlayabilirim, böyle bir Turing makinesini simüle eden bir program oluşturarak:

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

Kaynak

Ancak, PROLOG dilinin hangi bölümlerinin Turing bütünlüğünü kaybetmeden (özellikle fonksiyon sembolleri, yan madde aşırı yüklemesi, özyineleme, birleşme) uzaklaşabileceğini merak ediyorum. İşlev sembolleri kendileri Turing tamamlandı mı?


4
Yalnızca kod snippet'inizde kullanılan prolog özelliklerine ihtiyacınız vardır.
Yuval Filmus

1
Bu soruyu gördün mü ?
Raphael

2
@YuvalFilmus: Belki PROLOG'ta bir Turing makinesini programlamanın başka yolları da vardır.
Lenar Hoyt

Yanıtlar:


18

Turing-bütünlüğünün, sınırsız "boyut" un cevaplarını veya ara değerlerini oluşturma yeteneğine ve sınırsız sayıda döngü veya tekrarlama yeteneğine bağlı olduğu oldukça güvenilir bir kural. Bu iki şeye sahipseniz, muhtemelen Turing-bütünlüğüne sahipsiniz. (Daha spesifik olarak, Peano aritmetiği oluşturabiliyorsanız, kesinlikle Turing-tamlığına sahipsiniz!)

Diyelim ki zaten aritmetiği çıkardınız. Ayrıca sizin gibi olmayan mantıksal özelliklere sahip olmadığını varsayıyoruz atom_chars, assertgenel maskaralık etkinleştirmek ve benzeri.

İşlev simgelerini çıkardıysanız, sınırsız boyutta cevaplar veya aralar oluşturamazsınız; yalnızca programda ve sorguda görünen atomları kullanabilirsiniz. Sonuç olarak, herhangi bir sorgu için olası tüm çözümler kümesi sonludur , bu nedenle programın / sorgunun en az sabit noktasını almak her zaman sona erer. Datalog (Prolog tabanlı bir ilişkisel veritabanı sorgu dili) bu prensibe göre çalışır.

Benzer şekilde, Prolog'u yalnızca ilkel özyineleme ile kısıtladıysanız (dejenere bir durum olarak özyineleme içermez), yapabileceğiniz özyineleme miktarı sorgunun boyutuyla sınırlıdır, bu nedenle tüm hesaplama sona erer. Yani Turing-tamlık için genel tekrarlamaya ihtiyacınız var.

Ve elbette, genel özyinelemeniz varsa, bir dizi özelliği kesebilir ve Genel birleştirme (inşaat ve üst düzey desen eşleşmesi yeterlidir), olumsuzlama ve kesim de dahil olmak üzere Turing-bütünlüğünü koruyabilirsiniz.



Çok iyi bir nokta. Nicemlemeyi düşünmüyordum, ama bu aslında başka bir yaklaşım.
Takma ad

0

@Pseudonym ile mükemmel cevabı tamamlamak ve son soruya "Fonksiyon sembolleri kendileri mi Tamamlanıyor?"

Muhtemelen: Sadece fonksiyon sembollerinden oluşan bir dil Turing-Complete olabilir mi?

Cevap evet - ML ve Haskell gibi Fonksiyonel Programlama dillerini düşünün.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.