En Prolog, les problèmes sont résolus en utilisant le retour arrière. C'est un paradigme déclaratif plutôt qu'impératif (comme en C, PHP ou Python). Dans ce genre de langues vaut-il la peine de penser en termes de complexité? La façon naturelle de penser que vous pensez que les problèmes semblent être O (N^2) est que quelqu'un a pointé this question.Complexité dans les programmes Prolog?
Répondre
Il est important d'analyser la complexité dans n'importe quelle langue que ce soit prologue ou tout autre langage impératif. Cependant, je peux vous donner quelques conseils pour accélérer vos programmes prolog
- Toujours Toujours essayer de rendre vos programmes récursifs. Cela permettra de s'assurer que votre programme ne manque pas de pile. Essayez d'utiliser couper et échouer dans vos programmes où vous savez que vous n'avez pas besoin d'autres réponses.
- Essayez d'utiliser des accumulateurs.
- Check out CLPFD, Il aide à réduire considérablement l'espace de recherche, ce qui accélère votre programme. Essentiellement, il élimine le mauvais choix avant que votre programme puisse faire marche arrière et perdre du temps à explorer ces choix.
- Toujours écrire la meilleure règle de résultat en premier. (Cela dépend vraiment du problème, mais généralement la règle du meilleur cas va en premier).
Vous pouvez certainement analyser la complexité des programmes Prolog, comme n'importe quel autre langage. Ce problème particulier que vous avez lié pourrait être O (n^2). Mais tous les programmes Prolog n'auront pas cette complexité. Par exemple, vous pouvez facilement écrire un solveur SAT dans Prolog, et ce problème est NP-complet.
Cela dépend entièrement du problème.
par exemple. sommer une liste de nombres est O (N), autant que je sache.
sum([],0).
sum(List,Total) :-
sum(List,0,Total).
sum([],Total,Total).
sum([Head|Rest],Accumulator,Total) :-
SoFar is Head + Accumulator,
sum(Rest,SoFar,Total).
Les seules actions sont l'addition (« est ») et l'appel récursif, ce qui devrait être à la fois une valeur de 1 chacun. Ils seront tous deux effectués ~ une fois par item dans la liste, donc le total des actions devrait être ~ 2N, qui est O (N).
Faites que _ a 0 et c'est correct. – starblue
merci starblue, fixé maintenant – pfctdayelise
- 1. Définition de type Prolog dans swi-prolog
- 2. Longueur d'écriture et un miroir dans Prolog
- 3. Normalisation des espaces dans les atomes Prolog
- 4. Comment éviter les répétitions dans prolog
- 5. Comment entrer les données suivantes dans prolog?
- 6. Prolog unifie les listes dans une liste
- 7. remove: prolog
- 8. Prolog Read ignore les lignes?
- 9. SWI Prolog - Simplifier les expressions
- 10. swf dans les programmes Java de bureau
- 11. fonction d'alimentation dans prolog
- 12. Tuples correspondants dans Prolog
- 13. Débutant dans PROLOG
- 14. Kolmogorov complexité
- 15. complexité algorithme
- 16. complexité preuve
- 17. Les cordes se rejoignent et la complexité?
- 18. Grande complexité pour les algorithmes logarithmiques
- 19. C++ vérifier les programmes installés
- 20. Doxygen pour les programmes procéduraux
- 21. Manipuler des chaînes dans prolog
- 22. Liaison de variables dans Prolog
- 23. Wildcards Prolog
- 24. problème avec accumulateurs dans Prolog
- 25. Prolog coupé dans la méthode
- 26. débordement de pile dans Prolog
- 27. Analyse des algorithmes (complexité)
- 28. Comment organiser les fichiers dans les programmes Haskell?
- 29. Prolog Beginner
- 30. Passer des résultats dans prolog
Bien sûr, je pense. Il y a des listes, vous les parcourez. Le fait que cela se fasse récursivement ne signifie pas que nous ne pouvons pas dire qu'il y a une complexité O (n). – AndyG