Comment implémenter un interpréteur prologue dans un langage purement fonctionnel?

25

Existe-t-il une référence claire, avec un pseudo-code, sur la façon d'implémenter un interpréteur Prolog dans un langage purement fonctionnel? Ce que j'ai trouvé jusqu'à présent semble ne concerner que les langages impératifs, n'est qu'une démonstration de Prolog implémenté en soi, ou n'offre aucun algorithme concret à utiliser pour l'interprétation. J'apprécierais beaucoup une réponse.

Jimster
la source
4
L'implémentation de Prolog (Princeton Series in Computer Science) par Patrice Boizumault a l'implémentation Lisp.
Will Ness
Voir cette réponse pour une approche relativement nouvelle.
faux

Réponses:

24

Depuis Prolog = Unification syntaxique + Chaînage arrière + REPL

Les trois parties se trouvent dans Intelligence artificielle: structures et stratégies pour la résolution de problèmes complexes par George F. Luger. Dans la quatrième édition du livre, les trois parties sont implémentées dans LISP dans la Section 15.8, Programmation logique dans LISP. Il met également le même code dans ses autres livres, mais je ne les ai pas tous à noter ici. Le code de ses livres peut être trouvé ici .

Une autre source avec les trois parties peut être trouvée dans Paradigmes de programmation d'intelligence artificielle: études de cas en Common Lisp par Peter Norvig. Voir les chapitres 11, Programmation logique et 12, Compilation de programmes logiques. Le code de son livre peut être trouvé ici .

Une autre source est Structure et interprétation des programmes informatiques par Hal Abelson, Jerry Sussman et Julie Sussman. Voir Section 4.4 Programmation logique. Le site du livre est ici et le code du livre est ici .

Il n'est pas rare de trouver l'algorithme d'unification avec chaînage arrière implémenté dans de nombreuses applications si vous savez où chercher; il est particulièrement répandu dans l'inférence de type dans les compilateurs fonctionnels. L'utilisation de l'unification des mots clés ou se produit permet de repérer les fonctions. De plus, la plupart des implémentations utilisent unif pour le nom de la fonction d'unification.

Pour une version de Prolog, moins le REPL, effectuée dans OCaml, voir Code et ressources pour "Handbook of Practical Logic and Automated Reasoning" - prolog.ml

Une traduction du code du livre en F # peut être trouvée ici . Une traduction du code du livre en Haskell peut être trouvée ici .

En termes de recherche du code, l'algorithme d'unification est le plus facile à trouver, puis les implémentations avec enchaînement arrière intégrées dans les applications. Trouver une implémentation entièrement fonctionnelle de Prolog dans un langage fonctionnel avec un REPL est le plus difficile. La plupart du temps, le code n'est pas dans un format pour une utilisation directe dans PROLOG; il est fortement personnalisé pour améliorer les performances, vous pouvez donc trouver le code, mais cela ne vaudra pas le prix pour démêler les pièces que vous voulez. Mon conseil serait de lire le livre de Luger et de le construire à partir de zéro dans la langue de votre choix, même si cela signifie installer et apprendre LISP et traduire pour le faire.

MODIFIER

Étant donné qu'il s'agit d'une question en double de StackOverflow et que l'OP est nouveau et dit dans les commentaires:

Pour donner plus de contexte, j'essaie d'implémenter l'inférence de type, mais les fonctionnalités complexes du système de types de mon langage (types dépendants, types de raffinement, typage linéaire pour n'en nommer que quelques-uns des moins courants) me font penser que ce serait être utile pour baser mon inférence de type sur les algorithmes pilotant Prolog afin d'obtenir un algorithme très général. Je noterai que je suis entièrement autodidacte, donc mes connaissances font défaut dans de vastes domaines.

Je vais développer ici, mais sachez que le PO devrait poser une nouvelle question.

Pour quelques trucs d'introduction, voir implémentation de l'inférence de type .

Le meilleur livre que je connaisse à ce sujet est Types et langages de programmation de Benjamin C. Pierce. Le site du livre est ici . Les ressources avec des liens vers le code OCaml sont ici . Et la traduction de F # récemment commencée mais presque complète est ici .

Types dépendants: p. 462 Types de raffinement: p. 207 Logique linéaire et systèmes de types: p. 109

Guy Coder
la source
1
Guy Coder, vous êtes monsieur un gentleman et un savant! Votre aide est des plus utiles et je ne vous remercierai jamais assez d'avoir pris le temps de répondre à cette question. = D - Collaborateur de Jimster et ami
fatigué pour la
Je vous remercie encore une fois, j'ai déjà obtenu ces livres (c'est-à-dire avant, pas comme lors d'un voyage rapide dans une librairie).
Jimster
Le code de @Jimster Norvig est agréable et clair, tient dans une page IIRC. Ne me souviens pas si c'est pur .
Will Ness
D'intérêt: unify_P3.py qui fait partie du devoir 2
Guy Coder