Cosa rende PROLOG Turing completo?


15

So che si può provare che PROLOG è Turing completo costruendo un programma che simula una macchina di Turing come questa:

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

fonte

Tuttavia, mi chiedo quali parti del linguaggio PROLOG si possano eliminare (specialmente simboli di funzione, sovraccarico di clausole, ricorsione, unificazione) senza perdere la completezza di Turing. I simboli delle funzioni stessi sono completi?


4
Hai solo bisogno delle funzionalità di prolog utilizzate nel tuo frammento di codice.
Yuval Filmus,

1
Hai visto questa domanda ?
Raffaello

2
@YuvalFilmus: forse ci sono altri modi per programmare una macchina Turing in PROLOG.
Lenar Hoyt,

Risposte:


18

È una regola empirica abbastanza affidabile che la completezza di Turing dipende dalla capacità di costruire risposte o valori intermedi di "dimensioni" illimitate e dalla capacità di ripetere o ripetere un numero illimitato di volte. Se hai queste due cose, probabilmente hai completezza di Turing. (Più specificamente, se puoi costruire l'aritmetica di Peano, allora avrai sicuramente completezza di Turing!)

Supponiamo per il momento che tu abbia già spogliato l'aritmetica. Si suppone anche che non si dispone di tutte le funzioni non-logici come atom_chars, asserte così via, che consentono imbrogli generali.

Se hai eliminato i simboli di funzione, non puoi costruire risposte o intermedi di dimensioni illimitate; puoi usare solo atomi che compaiono nel programma e nella query. Di conseguenza, l'insieme di tutte le possibili soluzioni a qualsiasi query è finito , quindi terminerà sempre il punto meno fisso del programma / query. Il log dati (un linguaggio di query del database relazionale basato su Prolog) funziona su questo principio.

Allo stesso modo, se hai limitato Prolog alla ricorsione primitiva (che non include alcuna ricorsione come caso degenerato), la quantità di ricorsione che puoi fare è limitata dalla dimensione della query, quindi tutto il calcolo termina. Quindi hai bisogno di una ricorsione generale per completezza di Turing.

E, naturalmente, se si ha una ricorsione generale, è possibile tagliare un sacco di funzioni e conservare la completezza di Turing, inclusa l'unificazione generale (la costruzione e la corrispondenza del modello di livello superiore sono sufficienti), la negazione e il taglio.



Ottimo punto Non stavo pensando alla quantificazione, ma questo è davvero un altro approccio.
Pseudonimo,

0

Completando l'eccellente risposta di @Pseudonym e facendo riferimento alla tua ultima domanda "I simboli di funzione stessi Turing sono completi?".

Probabilmente intendi: una lingua fatta solo di simboli di funzione può essere Turing-Complete?

La risposta è sì: pensa a linguaggi di programmazione funzionale come ML e Haskell.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.