Il linguaggio con cui sono state messe in pratica le idee teoriche della programmazione logica è il Prolog, che però fu progettato quando gli studi in programmazione logica non erano ancora abbastanza approfonditi per capire chiaramente come maneggiare al meglio molti strumenti. Ciò ha fatto sì che la semantica dichiarativa del Prolog venisse compromessa e che si dovesse far ricorso ad una semantica procedurale inutilmente complicata.
I problemi a cui facciamo riferimento sono la mancanza dell'occur check, l'uso di una negazione unsafe, l'uso di predicati non logici come var, nonvar, assert, retract, l'uso indisciplinato del cut. In pratica la sistematica costruzione, verifica, trasformazione, ottimizzazione e debugging di molti programmi logici è estremamente difficile.
Definendo Gödel si è voluto focalizzare l'attenzione sulla tesi centrale della programmazione logica, cioè che un programma può essere visto come una teoria logica, facendo riferimento solo alla semantica dichiarativa. In questo modo si riacquistano i vantaggi propri della programmazione logica rispetto ai normali linguaggi procedurali.
Tra Gödel e Prolog ci dovrebbe essere lo stesso rapporto che esiste tra Pascal e Fortran: quest'ultimo fu uno dei primi linguaggi ad alto livello e quindi non beneficiò di approfondite conoscenze sui tipi di dato e le strutture di controllo. Il Pascal invece, introdotto dieci anni dopo, ha, per esempio, un ricco insieme di tipi di dato e, invece del goto, costrutti di controllo strutturati. Nello stesso modo nel progetto Gödel sono confluite le ricerche svolte dal momento dell'introduzione del Prolog, con l'obiettivo di fornire strumenti migliori per il progetto di programmi e una chiara semantica dichiarativa.
Il problema dell'occur check è dovuto al fatto che realizzarlo in ogni chiamata dell'algoritmo di unificazione comporta gravi inefficienze. In realtà si può notare che il problema si può presentare solo se appaiono variabili ripetute nella testa della clausola di input. Si possono quindi eliminare tutte le occorrenze, eccetto una, di tali variabili dalla testa, aggiungendo appropriate chiamate al predicato nel corpo, e applicare l'occur check solo a tali predicati. Questa e altre tecniche più sofisticate permettono di assicurare la correttezza della risoluzione SLDNF del Gödel.
Per quanto riguarda l'uso dei predicati non logici e del cut, le soluzioni dichiarative proposte dal Gödel verranno esposte rispettivamente nel paragrafo dedicato alla metaprogrammazione e in quello sui costrutti per il controllo.