Come implementare un interprete di prologo in un linguaggio puramente funzionale?


25

Esiste un chiaro riferimento, con pseudo-codice, su come implementare un interprete Prolog in un linguaggio puramente funzionale? Ciò che ho trovato finora sembra avere a che fare solo con linguaggi imperativi, è semplicemente una dimostrazione di Prolog implementato in sé o non offre alcun algoritmo concreto da utilizzare per l'interpretazione. Gradirei molto una risposta.


4
L'implementazione di Prolog (serie Princeton in Informatica) di Patrice Boizumault ha l'implementazione di Lisp.
Will Ness,

Vedi questa risposta per un approccio relativamente nuovo.
falso

Risposte:


24

Poiché Prolog = Unificazione sintattica + Concatenamento all'indietro + REPL

Tutte e tre le parti si trovano nell'intelligenza artificiale: strutture e strategie per la risoluzione di problemi complessi di George F. Luger. Nella quarta edizione del libro tutte e tre le parti sono implementate in LISP nella sezione 15.8, Programmazione logica in LISP. Mette anche lo stesso codice negli altri suoi libri, ma non li ho tutti per aver notato qui. Il codice per i suoi libri può essere trovato qui .

Un'altra fonte con tutte e tre le parti può essere trovata nei paradigmi della programmazione dell'intelligenza artificiale: casi studio in Common Lisp di Peter Norvig. Vedere i capitoli 11, Programmazione logica e 12, Compilazione dei programmi di logica. Il codice per il suo libro può essere trovato qui .

Un'altra fonte è la struttura e l'interpretazione dei programmi per computer di Hal Abelson, Jerry Sussman e Julie Sussman. Vedere la sezione 4.4 Programmazione logica. Il sito per il libro è qui e il codice per il libro è qui .

Non è raro trovare l'algoritmo di unificazione con back chaining implementato in molte applicazioni se sai dove cercare; è particolarmente prevalente nell'inferenza di tipo nei compilatori funzionali. L'uso delle parole chiave unificazione o verifica aiuta a individuare le funzioni. Inoltre, la maggior parte delle implementazioni usa unif per il nome della funzione di unificazione.

Per una versione di Prolog, meno la REPL, eseguita in OCaml, consultare Codice e risorse per "Manuale di logica pratica e ragionamento automatico" - prolog.ml

Una traduzione del codice libro in F # è disponibile qui . Una traduzione del codice libro per Haskell è disponibile qui .

In termini di ricerca del codice, l'algoritmo di unificazione è più facile da trovare, quindi implementazioni con back chaining incorporate nelle applicazioni. Trovare un'implementazione pienamente funzionale di Prolog in un linguaggio funzionale con un REPL è il più difficile. Il più delle volte il codice non è in un formato per l'uso diretto all'interno di PROLOG; è fortemente personalizzato per migliorare le prestazioni, quindi potresti trovare il codice ma non varrà la pena pagare per prendere in giro le parti che desideri. Il mio consiglio sarebbe di leggere il libro di Luger e di costruirlo da zero nella tua lingua preferita, anche se ciò significa installare e apprendere LISP e tradurre per farlo.

MODIFICARE

Poiché questa è una domanda duplicata da StackOverflow e l'OP è nuovo e nei commenti dice:

Per dare più contesto, sto tentando di implementare l'inferenza di tipo, tuttavia le intricate funzionalità nel sistema di tipi del mio linguaggio (tipi dipendenti, tipi di perfezionamento, tipizzazione lineare per citarne alcuni di quelli meno comuni) mi fanno sentire che sarebbe essere utile per basare la mia inferenza di tipo sugli algoritmi che guidano Prolog in modo da ottenere un algoritmo molto generale. Noterò che sono completamente autodidatta, quindi la mia conoscenza è carente in grandi aree.

Espanderò qui, ma mi rendo conto che l'OP dovrebbe porre una nuova domanda.

Per alcune informazioni introduttive, consultare l' inferenza del tipo di implementazione .

Il miglior libro che conosco su questo argomento è Tipi e linguaggi di programmazione di Benjamin C. Pierce. Il sito del libro è qui . Le risorse con collegamenti al codice OCaml sono qui . E recentemente è iniziata ma la traduzione per lo più completa di questo in F # è qui .

Tipi dipendenti: pag. 462 Tipi di affinamento: pag. 207 Logica lineare e sistemi di tipi: pag. 109


1
Guy Coder, signore, siete gentiluomini e studiosi! La tua assistenza è molto utile e non posso ringraziarti abbastanza per aver dedicato del tempo a rispondere a questa domanda. = D - Collaboratore di Jimster e amico stanco della ricerca
Shenzao,

Ti ringrazio ancora, ho già ottenuto questi libri (cioè prima, non come in un rapido viaggio in un negozio di libri).
Jimster,

Il codice di @Jimster Norvig è bello e chiaro, si adatta a una pagina IIRC. Non ricordo però se è puro .
Will Ness,


Di interesse: unify_P3.py che fa parte dell'Assegnazione 2
Guy Coder,

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.