web-dev-qa-db-fra.com

Comparaison Haskell vs Prolog

Quel genre de problèmes est mieux résolu dans Prolog que dans Haskell? Quelles sont les principales différences entre ces deux langues?


Modifier

Existe-t-il une bibliothèque Haskell (une sorte de solveur logique) qui peut imiter la fonctionnalité Prolog?

49
danatel

Prolog est principalement une langue ciblée sur les problèmes logiques, en particulier dans les domaines de l'IA et de la linguistique. Haskell est plus un langage à usage général.

Prolog est un langage déclaratif (logique), ce qui facilite l'énoncé des problèmes logiques. Haskell est un langage fonctionnel et donc beaucoup mieux adapté aux problèmes de calcul.

Wikipédia sur la programmation déclarative:

En informatique, la programmation déclarative est un paradigme de programmation qui exprime la logique d'un calcul sans décrire son flux de contrôle. Il tente de minimiser ou d'éliminer les effets secondaires en décrivant ce que le programme devrait accomplir, plutôt que de décrire comment s'y prendre. Cela contraste avec la programmation impérative, qui nécessite une description détaillée de l'algorithme à exécuter.

La programmation déclarative considère les programmes comme des théories d'une logique formelle et les calculs comme des déductions dans cet espace logique. La programmation déclarative est devenue particulièrement intéressante récemment, car elle peut grandement simplifier l'écriture de programmes parallèles.

Wikipédia sur la programmation fonctionnelle:

En informatique, la programmation fonctionnelle est un paradigme de programmation qui traite le calcul comme l'évaluation de fonctions mathématiques et évite les données d'état et mutables. Il met l'accent sur l'application des fonctions, contrairement au style de programmation impératif, qui met l'accent sur les changements d'état. La programmation fonctionnelle a ses racines dans le calcul lambda, un système formel développé dans les années 1930 pour étudier la définition de fonction, l'application de fonction et la récursivité. De nombreux langages de programmation fonctionnels peuvent être considérés comme des embellissements du calcul lambda.

En bref, un langage déclaratif déclare un ensemble de règles sur les sorties qui devraient résulter de quelles entrées et utilise ces règles pour déduire une sortie d'une entrée, tandis qu'un langage fonctionnel déclare un ensemble de fonctions mathématiques ou logiques qui définissent comment l'entrée est traduite en sortie. .


Quant à la question AJOUTÉE: aucune que je sache, mais vous pouvez soit traduire Haskell vers Prolog, ou implémenter Prolog dans Haskell :)

31
Kornel Kisielewicz

En ce qui concerne la question de la bibliothèque logique: si elle n'existe pas, il devrait être possible d'en créer une de différentes manières. Le Schemer Reasoned Schemer construit des capacités de raisonnement logique dans Scheme. Les chapitres 33 à 34 de [~ # ~] plai [~ # ~] traitent de Prolog et de la mise en œuvre de Prolog. Ces auteurs jettent des ponts entre Scheme et Prolog. Les créateurs de PLT Scheme ont construit comme l'une de leurs langues un Lazy Scheme après la fonction d'évaluation paresseuse de Haskell. Le papier d'Oleg Kiselyov LogicT est brillant comme d'habitude - il repousse les limites de ce qui est possible dans de nombreuses langues. Il y a aussi un exemple de programmation logique sur le wiki Haskell.

37
gknauth

Prolog est un langage programmation logique, alors que Haskell est un langage fonctionnel. Les langages fonctionnels sont basés sur le concept d'une fonction qui prend un certain nombre d'arguments et calcule une valeur.

Prolog, en revanche, n'a pas de fonctions. Au lieu de cela, les prédicats sont utilisés pour prouver un "théorème". Les prédicats Prolog ne calculent pas de valeur, ils peuvent répondre "oui" ou "non" et éventuellement lier des variables d'entrée à des valeurs:

L'utilité de la programmation fonctionnelle et logique se chevauche souvent. La programmation fonctionnelle a gagné un peu de traction ces derniers temps, tandis que Prolog est encore beaucoup un langage de niche, en grande partie parce qu'il est beaucoup plus différent des concepts courants de fonctions et de méthodes du courant dominant OOP = que la programmation fonctionnelle est, et souvent considérée comme (très) difficile à apprendre.

Certains problèmes deviennent presque triviaux à implémenter dans Prolog, en particulier en combinaison avec solveurs de contraintes .

Vous pouvez en savoir plus sur la programmation logique sur Wikipedia .

31
JesperE

Vous pourriez trouver l'article Escape from Zurg: An Exercise in Logic Programming une lecture intéressante. Il présente une comparaison côte à côte de l'implémentation d'un problème de recherche simple dans Prolog et Haskell, ainsi qu'un petit cadre de classe pour représenter les problèmes de recherche de manière plus générale. La conclusion à laquelle parviennent les auteurs est qu'il est plus facile d'exprimer au moins certains de ces types de problèmes dans Haskell que dans Prolog, principalement parce que le système de type Haskell facilite la création de représentations de Nice des états de recherche et se déplace d'un état à l'autre. .

11
Ian Ross