jQuery
En savoir plus
Adobe Flex & Flash
En savoir plus
ASP.NET
En savoir plus

Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !
| Page 1 2 Suivante | |||||||||||||||
| Auteur | Message | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 visiteur sur ce sujet (1 Anonyme) | |||||||||||||||
| Page 1 2 Suivante | |||||||||||||||
bluestorm
|
# Posté le 25/07/2010 à 02:37:04 | ||||||||||||||
dont ask to ask![]() Groupe : Anciens
|
Salut,
Vous avez envie de profiter de l'été en restant devant votre écran ? Voici un nouvel Atelier pour le forum Autres Langages. Le concept reste similaire aux ateliers précédents (dont Cod'Art, Compression, Brainfuck, Calculatrice(s) et P'tit Langage) : il s'agit de présenter son travail, de discuter, commenter et pourquoi pas retravailler/améliorer celui des autres. Le sujet est par contre un peu différent. Plutôt qu'un problème donné à faire dans le langage de programmation de votre choix, il s'agit maintenant d'essayer, sous toutes ses coutures, un langage de programmation donné. Ça veut dire qu'il faut commencer par l'apprendre, essayer de comprendre ses spécificités, étudier ses points forts, ses applications privilégiées, et pourquoi pas essayer d'explorer un peu les coins plus sauvages. Pour que ce soit amusant, j'ai essayé de choisir un langage radicalement différent de ce que vous connaissez déjà, qui demande une nouvelle façon de penser la programmation. Le langage de cet atelier-ci est Prolog. Si ça marche, il y en aura d'autres, pour d'autres langages. Qu'est-ce que Prolog ?Prolog est un langage de programmation logique. De façon grossière, un programme Prolog est un ensemble de connaissances et de règle de déductions que le programmeur donne au langage. Le programmeur peut ensuite poser des questions, auxquels le programme essaiera de répondre en utilisant les informations fournies. Plus exactement, on donne à Prolog des sortes de "règles de raisonnement", et on lui pose ensuite des questions. Il doit, en combinant les règles qu'on lui a donné, produire une réponse. Voici un exemple d'informations que l'on pourrait vouloir fournir à Prolog (ce n'est pas du vrai code prolog, juste une description en français) : Citation Une personne X (les majuscules désignent des variables) est frère ou sœur de Y si X est différent de Y, et s'il existe une personne Z qui est parent à la fois de X et de Y. X est parent de Y si X est père de Y, ou si X est mère de Y. Tania est la mère de Sophie. Thomas est le père de Sophie. Thomas est le père d'Émilie. Tania est la mère de Camille. Michel est le père de Thomas. On peut alors poser la question suivante : Citation Quels sont les frères et soeurs de Sophie ? Et prolog fournira le bon résultat, à savoir tout ce qu'il peut déduire des informations qu'on lui a données : Citation Émilie et Camille. Voici le code Prolog correspondant : Code : Autre
Et pour interroger Prolog (la première ligne est la question, avec la réponse ensuite) : Code : Autre
Suivant ce principe, on peut en fait écrire des programmes relativement élaborés. Historiquement, la programmation logique est appréciée dans tous les domaines où il faut "faire des déductions" : certaines bases de données, de systèmes d'intelligence artificielle, etc. Que faire pour cet atelier ?La meilleure chose à faire est de commencer par trouver un tutoriel pour apprendre le langage Prolog. Cela nécessitera certainement d'installer une implémentation du langage sur votre machine, pour pouvoir tester du code. Un bon début peut être l'article wikipédia Prolog, qui donne une présentation un peu moins superficielle du langage, et des liens vers des cours de Prolog. Prolog étant un langage créé en France, il devrait être plutôt facile de trouver de la documentation francophone sur le sujet avec un peu de recherche. Une fois que vous commencez à comprendre un peu le langage, vous devriez essayer de coder de petits exercices dans ce langage. S'ils vous paraissent intéressant, n'hésitez pas à les poster ici. Les questions sur le langage sont bienvenues si vous butez sur un point particulier, mais essayez quand même de faire des efforts de compréhension de votre côté. Et surtout, rappelez-vous : le but de cet atelier est de présenter quelque chose de très, très différent de ce que nous connaissons. Si vous vous sentez perdu au départ, c'est normal, et même plutôt bon signe : ça veut dire que vous apprendrez de nombreuses choses avec cet atelier. J'essaierai de mettre à jour ce premier post de temps en temps pour y mettre des informations utiles, des liens pertinents, et pourquoi pas des idées de choses à essayer en Prolog. Mais je vous rappelle que ceci est un atelier, et tout le monde est invité à participer, proposer des solutions ou commenter celles des autres. Nous sommes tous à la fois organisateurs, juges, conseillers et participants ! Liens utiles- une longue série d'exercices avec corrections - quelques cours en français sur Developpez.com
Édité
le 25/07/2010 à 16:00:05
par bluestorm
|
||||||||||||||
| Publicité | # Posté le 25/07/2010 à 02:37:04 | ||||||||||||||
|
|
|||||||||||||||
EMC1
|
# Posté le 25/07/2010 à 12:27:17 | ||||||||||||||
![]()
|
Une série d'exercices (avec correction), qui vont de basiques à élaborés pour ceux qui en chercheraient.
A propos de la ressource en Français, les quelques cours que j'ai lus étaient peu détaillés bien qu'intéressant. Je vais sans doute m'y remettre à l'occasion de cet atelier, en cherchant en anglais cette fois. |
||||||||||||||
gorgonite
|
# Posté le 25/07/2010 à 13:10:23 | ||||||||||||||
|
|
on avait tenté de faire une série de cours ici : http://prolog.developpez.com/cours/
|
||||||||||||||
bluestorm
|
# Posté le 25/07/2010 à 15:57:35 | ||||||||||||||
dont ask to ask![]() Groupe : Anciens
|
EMC1 > merci pour les exercices, j'essaierai de regarder !
J'ai fait quelques expérimentations avec Prolog ce matin : j'ai joué avec les listes. Listes en prologEn prolog, une liste est :
Cette notation est pratique quand on accède seulement à un élément de la liste, mais un peu indigeste quand on veut des listes à plusieurs éléments. Par exemple, la liste dont les éléments sont 1 et 2 est [1 | [2|[]] ]. Il existe donc les sucres syntaxiques [H1,H2,..] (par exemple [1,2,3] pour la liste de ces trois éléments) et [H1,H2,..|T] (la liste commençant par les H1, etc., et dont le reste est la liste T). Cette syntaxe a d'ailleurs été reprise par le langage Erlang. Quelques exemples de fonctions sur les listesLes fonctions présentées ici sont juste des essais. Il y a sans doute moyen de faire mieux ou différemment, et tous les commentaires sont bienvenus. Vérification des listes On peut écrire des choses qui ressemblent à des listes mais n'en sont pas. Par exemple [1|2] n'est pas une liste, car la queue, 2, n'est pas une liste; attention, il ne s'agit pas de la liste [1,2], qui est représentée par [1| [2|[]] ]. J'ai donc écrit une fonction list pour vérifier qu'une valeur est bien une liste :
Code : Autre
On peut l'interroger : Code : Autre
On peut aussi lui poser la question qui tue : "Quelles sont les listes X ?" Code : Autre
Prolog renvoie une suite de réponse, et à chaque fois le mode interactif me demande si je veux m'arrêter là, ou avoir la réponse suivante. Il commence par proposer la liste vide, puis la liste [_G266]. _G266 désigne en fait un nom de variable interne au mode interactif. Comme c'est une variable, cela veut dire que _G266 peut prendre n'importe quelle valeur : [1] est une liste, [[]] est une liste, etc. Il a donc désigné toutes les listes à un seul élément. Il continue ensuite à me proposer toutes les listes à deux éléments, à trois éléments, etc. Appartenance à une liste J'ai ensuite écrit la fonction qui teste si un élément appartient à une liste :
Code : Autre
Questions classiques : Code : Autre
Questions plus originales :
Code : Autre
Code : Autre
Autres fonctions sur les listes J'ai aussi écrit la fonction qui concatène deux listes (les met bout à bout). Pour laisser un peu de suspense, et que les autres puissent jouer aussi (c'est moins drôle quand on a déjà vu la solution), je ne la posterai pas ici. Je vous invite à essayer aussi, et à regarder ce qu'on peut obtenir en lui posant différentes questions. On peut par exemple la forcer à répondre aux questions suivantes :
On peut aussi s'en servir pour coder une fonction qui, par exemple, trouve toutes les positions où l'élément X apparaît dans la liste Y. |
||||||||||||||
nax
|
# Posté le 25/07/2010 à 16:13:16 | ||||||||||||||
![]()
Ville : Brest |
Tiens c'est marrant je me suis lancer ce matin et j'ai coder exactement la même chose que toi bluestorm :
Code : Console
Qui permet a la fois de savoir si un élément appartient à une liste ?- find(a,[a,b,c]). Tt de lister tout les éléments d'une liste : ?- find(X,[a,b,c]). (Voir de trouver les listes auquelles appartient un élément bien que ça semble moins intéressant.) Mais par contre j'ai un warning que je ne comprend pas bien : Citation Clauses of find/2 are not together in the source-file Juste un truc déroutant au début : pour tester un code il faut l'enregistrer dans un fichier et l'appeler avec par exemple Code : Console
si l'on travaille avec SWI Prolog ou bien Code : Console
Avec gprolog. Je pensais au début pouvoir entrer les prédicats dans l'interpréteur directement à partir du shell mais on obtient ce genre d'erreur : "uncaught exception: error(existence_error)" Par contre j'ai plus de mal avec la fonction de concaténation. J'ai essayer quelque chose comme : Code : Console
Mais ça ne mène à rien.
Édité
le 25/07/2010 à 17:18:21
par nax
|
||||||||||||||
spider-mario
|
# Posté le 25/07/2010 à 16:50:09 | ||||||||||||||
![]()
Ville : Montigny-lès-cormeilles |
C'est possible, en les encadrant avec assert(...).
Note : consult('bla.pl'). permet aussi de les charger depuis un fichier. |
||||||||||||||
rushia
|
# Posté le 25/07/2010 à 17:31:04 | ||||||||||||||
![]()
Études : Supélec |
Pour la fonction de concaténation, j'ai fait ça :
Code : Autre
Ça a l'air de marcher : Code : Autre
Sinon, j'ai essayer de travailler un peu avec des arbres binaires : Code : Autre
Résultat sur l'arbre : Code : Autre
Code : Autre
Par contre, je me suis limité à un arbre ne pouvant "stocker" que des 0 et des 1 parce que je n'ai pas trouvé de moyen de donner une longueur 0 à un arbre n'étant en réalité qu'une feuille pour n'importe quel nombre. Edit : Après réflexion, je vois la solution suivante, un peu lourde : On désigne une feuille par f(x) ou x est ce que l'on veut. Secret (cliquez pour afficher) Code : Autre
Code : Autre
Édité
le 25/07/2010 à 18:39:55
par rushia
|
||||||||||||||
nax
|
# Posté le 25/07/2010 à 18:21:08 | ||||||||||||||
![]()
Ville : Brest |
Oui ça marche mon erreur vient du fait qu'il faut réfléchir "à l'envers". On ne construit pas la liste, on doit en fait décrire ses propriétés.
Une chose amusante avec ce langage est qu'une fonction peut servir à plusieurs actions. Par exemple la fonction Code : Console
Permet d'insérer un élément dans une liste en changeant les paramètres : Code : Console
Et un peu de calcul avec une fonction factoriel : Code : Console
Édité
le 25/07/2010 à 18:25:35
par nax
|
||||||||||||||
Abronsius
|
# Posté le 25/07/2010 à 19:41:36 | ||||||||||||||
![]()
|
Salut,
Je vais me mettre au Prolog pour cet atelier et j'ai trouver un cours vraiment très bien fait: http://perso.crans.org/martin/Doc/Cour [...] %20PROLOG.pdf « Dis, Cortex, tu veux faire quoi cette nuit ?» « La même chose que chaque nuit, Minus. Tenter de conquérir le monde » |
||||||||||||||
gorgonite
|
# Posté le 25/07/2010 à 20:14:06 | ||||||||||||||
|
|
allez, je vais contribuer un peu...
![]() Le solveur Prolog consiste à parcourir l'arbre des solutions en profondeur d'abord, et en sélectionnant les clauses de gauche à droite Ainsi, reprenons l'exemple de Bluestorm Code : Autre
Introduisons un peu de "récursivité" en cherchant des ancêtres Code : Autre
La première ligne va partir envoyer le solveur standard dans une boucle infinie puisqu'il va chercher à résoudre ancetre:-ancetre avant de s'intéresser à parent qui est en seconde position Donc gardez à l'esprit que l'ordre des termes peut grandement influer sur la vitesse de l'analyse (surtout si des ! (cut) sont introduits) mais ne despérez pas, on peut s'en sortir si le problème ne correspond pas à une recherche en profondeur d'abord, via la méta-interprétation (changer la stratégie de l'évaluation) ou via la mémoïzation (se souvenir des cas déjà étudiés) |
||||||||||||||
EMC1
|
# Posté le 25/07/2010 à 21:11:46 | ||||||||||||||
![]()
|
Notons quand même qu'il n'y a pas de fonction en Prolog, on parle de prédicat, utilisés en essayant de prouver la véracité d'un but.
Par convention on donne l'usage d'un prédicat en écrivant ses termes + , - ou ? suivant qu'il doivent respectivement être donnés en entrée (une valeur), attendue en sortie (une variable libre) ou l'un des deux au choix. Par exemple : between(+,+,?). |
||||||||||||||
gnomnain
|
# Posté le 25/07/2010 à 23:45:59 | ||||||||||||||
Blblbl !![]() Groupe : Anciens
|
Citation : nax
Oui ça marche mon erreur vient du fait qu'il faut réfléchir "à l'envers". On ne construit pas la liste, on doit en fait décrire ses propriétés. Une chose amusante avec ce langage est qu'une fonction peut servir à plusieurs actions. Par exemple la fonction [...] Oui, j'ai utilisé ça et c'est marrant : Code : Autre
Je pourrais encore exprimer prefix avec concat, mais je l'ai pas fait (les prédicats take(L,N,P) et drop(L,N,S) veulent dire "P est la liste composée des N premiers éléments de N" et "S est ce qui reste quand on a enlevé N éléments". Par contre, je ne sais pas trop ce que ça fait niveau efficacité. J'imagine que comme je l'ai écrit, il crée un modèle pour la liste avec des trous partout (il connait son nombre d'éléménts), et ensuite il unifie avec le prédicat "prefix". Si c'est ça, ça fait du O(N) je crois. Haskell - Learn You a Haskell - Real World Haskell - xmonad - OCaml Apprenez Haskell ! - #ircduzero <colbseton> Serialk: tu cherches vraiment des liens logiques dans tout ce que je raconte ? |
||||||||||||||
Cyprien_
|
# Posté le 25/07/2010 à 23:47:02 | ||||||||||||||
![]()
|
Petite remarque en passant : non seulement l'ordre des prédicats peut compter, mais également l'ordre de propositions séparées par une virgule. J'ai été confronté à ça en voulant extraire le maximum d'une liste.
Je m'explique : Code : Autre
Ce code refuse de fonctionner, on reçoit l'erreur : Code : Console
En revanche avec : Code : Autre
tout fonctionne bien : Code : Console
Quelqu'un pourrait-il m'expliquer cela ? D'ailleurs, même avec le deuxième code, on retombe toujours sur la même erreur avec certaines questions : Code : Console
|
||||||||||||||
bluestorm
|
# Posté le 25/07/2010 à 23:53:38 | ||||||||||||||
dont ask to ask![]() Groupe : Anciens
|
C'est un problème au niveau de l'opérateur >= qui n'est pas un opérateur logique. Il ne fonctionne que quand on lui donne deux valeurs, et pas des variables d'unification. Selon l'ordre dans lequel tu mets tes clauses et les arguments que tu donnes, si tu te retrouves au moment où tu testes >= à avoir déjà donné une valeur aux deux variables, tout va bien, par contre si ce n'est pas encore fait ça foire.
Les opérateurs arithmétiques primitifs sont aussi affectés par ce problème, ce qui les rend assez désagréables à utiliser. Je trouve plus amusant de recoder soit-même avec un encodage plus respectueux des aspects logique (mais moins performant). D'ailleurs, si je me suis attaqué aux listes, c'est aussi parce que c'est une structure de donnée correspondant, d'une certaine manière, aux nombres en notation unaire. La fonction "somme" sur les nombres zero/succ est identique à la fonction "append" des listes. Citation : gnomnain Oui ça marche mon erreur vient du fait qu'il faut réfléchir "à l'envers". On ne construit pas la liste, on doit en fait décrire ses propriétés. Une chose amusante avec ce langage est qu'une fonction peut servir à plusieurs actions. Malheureusement, et c'est une des choses qui me déçoit avec prolog, ce n'est que très partiellement vrai. La programmation logique a une image de "programmation déclarative par excellence", on décrit les propriétés etc., mais en fait, des langages que je connais, c'est celui qui demande le plus d'avoir en tête les règles opérationnelles du langage. C'est un peu comme quand on essaie d'évaluer les performances d'un code Haskell, mais là ça joue sur la correction du code (si je m'en sers comme ça, est-ce qu'il va donner le résultat, ou boucler à l'infini ?). Ceci dit, cette sensation est peut-être causée par mon manque d'habitude du paradigme. |
||||||||||||||
Cyprien_
|
# Posté le 26/07/2010 à 00:15:08 | ||||||||||||||
![]()
|
Citation : bluestorm
Je trouve plus amusant de recoder soit-même avec un encodage plus respectueux des aspects logique (mais moins performant). Dans ce cas précis, tu recoderais ça comment ? En attendant, j'ai tenté de recoder un tri par sélection, avant de passer à des tris plus compliqués... Je ne sais pas si ma solution est vraiment élégante, mais c'est celle qui m'est venue le plus naturellement. Code : Autre
Exemple : Code : Console
EDIT : Désolé EMC1, ce n'était effectivement pas un tri à bulles comme je l'avais écrit à l'origine, mais je m'y attèle à l'heure actuelle .
Édité
le 26/07/2010 à 00:29:18
par Cyprien_
|
||||||||||||||
EMC1
|
# Posté le 26/07/2010 à 00:23:19 | ||||||||||||||
![]()
|
Je ne pense pas que ce soit recodable en pur Prolog, comme toute manipulation de nombres.
Cyprien_, ton tri s'apparente plus selon moi à un tri par sélection. Je vois que tu m'as grillé...
Édité
le 26/07/2010 à 00:24:09
par EMC1
|
||||||||||||||
Cyprien_
|
# Posté le 26/07/2010 à 00:47:12 | ||||||||||||||
![]()
|
Apparemment c'est faisable :
Code : Autre
Cette fois je ne crois pas me tromper en affirmant que c'est bien un tri à bulles .Exemple : Code : Console
Édité
le 26/07/2010 à 00:48:09
par Cyprien_
|
||||||||||||||
Orwell
|
# Posté le 26/07/2010 à 01:21:42 | ||||||||||||||
tahc nu sap tse'n icec![]()
|
Pour ceux que ça intéresse, j'ai retrouvé l'énoncé d'un gros exercice en Prolog (tiré de mon cours de logique et IA à la fac
) Voici les questions: Secret (cliquez pour afficher) On souhaite générer, en Prolog, la gamme d’assemblage d’un produit, constitué d’un ensemble de composants complexes. Chaque composant est modélisé comme une union de parallélépipèdes rectangles ayant les arrêtes parallèles aux axes (ces différentes parties de composants n'étant pas dissociables). Il s'agit donc de déterminer l'ordre (et les directions respectives) dans lequel on doit assembler chacun de ses composants complexes pour construire le produit complet. L'ajout d'un composant complexe au produit à assembler se fait par translation latérale dans une des 6 directions de l'espace. (Note: En pratique, le robot manipulateur effectue une rotation du produit assemblé et présente toujours le nouveau composant dans la même direction). Il faut donc veiller à ne pas provoquer, au cours de la translation, de collision entre le composant à placer et les composants déjà assemblés. La démarche adoptée pour générer la séquence d'assemblage est de partir du produit assemblé, et de déterminer l'ordre de désassemblage de chacun de ses composants. Il suffira ensuite d'inverser la séquence obtenue. On demande:
Et pour ceux qui ont besoin d'un coup de pouce, voici déjà des éléments de réponses aux 2 premières questions: Secret (cliquez pour afficher) Code : Autre
Et un assemblage cadeau pour jouer avec et tenter de le désassembler: ![]() Secret (cliquez pour afficher) Code : Autre
Amusez-vous bien
Édité
le 26/07/2010 à 02:16:39
par Orwell
|
||||||||||||||
bluestorm
|
# Posté le 26/07/2010 à 08:24:40 | ||||||||||||||
dont ask to ask![]() Groupe : Anciens
|
Citation : Cyprien_
Citation : bluestorm Je trouve plus amusant de recoder soit-même avec un encodage plus respectueux des aspects logique (mais moins performant). Dans ce cas précis, tu recoderais ça comment ? Il s'agit d'utiliser des entiers logiques plutôt que des entiers machines. Tout encodage sous forme d'une structure de donnée supportant l'unification conviendrait, j'en utilise un particulièrement simple, et qui fera plaisir au prépiste qui sommeille en toi : Code : Autre
Ensuite c'est facile : Code : Autre
J'ai trois versions de "max". Elles fonctionnent toutes dans le sens max(X, [z, s(z), s(s(z))]), mais leur comportement sur max(s(s(z)), L) est intéressant. Code : Autre
(Boucle à l'infini) Code : Autre
Code : Autre
Je n'ai pas encore vraiment réfléchi à pourquoi ces fonctions se comportent comme cela; il faudrait dessiner l'arbre de résolution, mais je n'ai pas beaucoup de temps en ce moment.
Édité
le 26/07/2010 à 08:27:28
par bluestorm
|
||||||||||||||
Einstein++
|
# Posté le 26/07/2010 à 08:42:56 | ||||||||||||||
It's not a bug, it's a feature![]()
Études : TELECOM SudParis |
Le langage est très intéressant, merci pour cet atelier.
Voici mon tri insertion : Code : Autre
exemple : Code : Autre
Édité
le 26/07/2010 à 09:27:22
par Einstein++
|
||||||||||||||
Cygal
|
# Posté le 26/07/2010 à 09:31:35 | ||||||||||||||
X-No-Archive: yes![]()
|
Citation : nax
Mais par contre j'ai un warning que je ne comprend pas bien : Citation Clauses of find/2 are not together in the source-file Ça veut dire que deux clauses d'une même fonction ne se suivent pas, par exemple si tu as laissé un "find" d'arité 2 traîner ailleurs dans ton fichier. |
||||||||||||||
Cyprien_
|
# Posté le 26/07/2010 à 10:17:55 | ||||||||||||||
![]()
|
J'ai dessiné la trace lors de l'appel de ta première fonction de maximum, bluestorm, et en fait, tout simplement, Prolog va d'abord tester toutes les possibilités avec des listes ne contenant que zéro, parce que zéro est inférieur à s(s(s(z))).
Tu peux le mettre en évidence par : Code : Autre
EDIT : à noter que selon ce qu'on veut faire, certaines versions sont meilleures : max1, ou bien max4 obtenu en inversant les prédicats mem et greater dans max3, bouclent à l'infini après la première solution. Et max>4 est le "meilleur" si on veut obtenir toutes les listes dont N est le maximum : avec max3 on n'obtient pas toutes les permutations (ou plutôt on les obtiendra quand on aura fait toutes les listes commençant par N, donc jamais ).EDIT² : je me suis un peu intéressé à la possibilité de faire des AST, déjà simplement pour des expressions numériques. Le code que je montre s'appuie sur les entiers naturels redéfinis par bluestorm (et n'a que 2 opérations), mais avec des entiers naturels ça marche aussi bien, le seul souci étant de différencier une valeur numérique d'un arbre... Code : Autre
Exemple : Code : Console
Pour le fun, j'ai essayé de demander ceci à Prolog : Code : Console
Dommage que ça ne marche pas, quelqu'un saurait coder tout ça de meilleure manière, pour que Prolog arrive à répondre ? ![]() EDIT3: pour plus de commodité lors de l'entrée : Code : Autre
L'opération inverse ne marche pas par contre (ie. revenir à des valeurs numériques) : Code : Console
Édité
le 26/07/2010 à 11:29:20
par Cyprien_
|
||||||||||||||
EMC1
|
# Posté le 26/07/2010 à 12:23:17 | ||||||||||||||
![]()
|
bluestorm :
Tu peux utiliser le très utile prédicat trace pour suivre la résolution : Code : Autre
Cyprien_ : Pour revenir à des valeurs numériques : Code : Autre
Édité
le 26/07/2010 à 12:29:20
par EMC1
|
||||||||||||||
Orwell
|
# Posté le 26/07/2010 à 13:42:20 | ||||||||||||||
tahc nu sap tse'n icec![]()
|
Je ne comprends pas trop ce que vous essayez de faire avec des requêtes comme celles-ci:Citation : bluestorm J'ai trois versions de "max". Elles fonctionnent toutes dans le sens max(X, [z, s(z), s(s(z))]), mais leur comportement sur max(s(s(z)), L) est intéressant. Code : Console
(Boucle à l'infini) et Citation : Cyprien_ Pour le fun, j'ai essayé de demander ceci à Prolog : Code : Console
Dommage que ça ne marche pas, quelqu'un saurait coder tout ça de meilleure manière, pour que Prolog arrive à répondre ? ![]() Dans le premier cas, la question posée à Prolog est "donne-moi toutes les listes possibles dont s(s(z)) est le maximum", et dans le second: "donne-moi tous les arbres possibles ayant s(s(z) comme évaluation". C'était juste pour voir que oui, Prolog donne une infinité de résultats, ou vous vous attendiez à autre chose?
|
||||||||||||||
Cyprien_
|
# Posté le 26/07/2010 à 13:45:37 | ||||||||||||||
![]()
|
Non, l'intérêt aurait été que Prolog arrive effectivement à donner des résultats. Dans les deux exemples que tu as cités, "boucle infinie" signifie que Prolog tourne indéfiniment, sans donner de nouveaux résultats.
Dans le cas de max, en utilisant max4 (voir mon post précédent), Prolog arrive au contraire à générer une infinité de listes qui conviennent (et à chaque fois qu'on demande un résultat de plus, Prolog arrive à en donner un). Et je me demandais s'il serait possible de faire pareil pour les arbres syntaxiques : programmer de tel sorte que Prolog puisse générer à volonté des arbres qui conviennent.
Édité
le 26/07/2010 à 13:48:34
par Cyprien_
|
||||||||||||||
neo2500
|
# Posté le 26/07/2010 à 14:10:24 | ||||||||||||||
|
Études : Paris 6 - Université Pierre et Marie Curie (Jussieu) |
Bonjour,
Je commance à faire moi aussi mes tests, mais je vois que vous étes plus rapide que moi... Je vais essayer un résolveur de sudoku (cf le lien du début de topic).
Édité
le 26/07/2010 à 14:11:31
par neo2500
|
||||||||||||||
Orwell
|
# Posté le 26/07/2010 à 14:12:22 | ||||||||||||||
tahc nu sap tse'n icec![]()
|
OK, je comprends mieux
![]() A priori oui, c'est possible, mais ça dépend de l'ordre de définition des clauses et des prédicats qui les composent; Prolog va soit construire d'abord les solutions les plus complexes (-> boucle infinie), soit les plus simples (longue liste de solutions de complexité croissante). |
||||||||||||||
bluestorm
|
# Posté le 26/07/2010 à 22:23:44 | ||||||||||||||
dont ask to ask![]() Groupe : Anciens
|
Citation : Cyprien_
EDIT² : je me suis un peu intéressé à la possibilité de faire des AST, déjà simplement pour des expressions numériques. Le code que je montre s'appuie sur les entiers naturels redéfinis par bluestorm (et n'a que 2 opérations), mais avec des entiers naturels ça marche aussi bien, le seul souci étant de différencier une valeur numérique d'un arbre... Code : Autre
Je n'aime pas la manière dont tu fais. Tu utilises le fait qu'il est possible de différencier les cas en inspectant les valeurs. En pratique, la vérification isNat étant linéaire, tu as des coûts de performance. Comme pour un langage fonctionnel, la bonne solution me semble ici de faire une somme disjointe. On peut utiliser pour cela des symboles "nat" et "op" par exemple. Code : Autre
PS : si vous vous sentez de vous lancer dans un sous-projet un peu consistant pour l'atelier (non parce que là, hier soir je faisais gentiment des listes, aujourd'hui on fait des ASTs, demain on code un évaluateur lisp et après-demain un compilateur Haskell98 ?), n'hésitez pas à ouvrir un topic à part en mettant le tag [Atelier Prolog] dans le titre, et postant ici un petit message pour donner le lien.
Édité
le 26/07/2010 à 22:24:27
par bluestorm
|
||||||||||||||
Cyprien_
|
# Posté le 26/07/2010 à 22:33:27 | ||||||||||||||
![]()
|
Non seulement ton code est effectivement plus propre, mais en plus il répond à ma question précédente : cette fois, Prolog arrive sans soucis à générer des arbres dont le résultat est celui demandé :
Code : Console
Il n'y avait donc pas que des problèmes de performance, mais aussi de conception visiblement. |
||||||||||||||
bluestorm
|
# Posté le 26/07/2010 à 23:29:02 | ||||||||||||||
dont ask to ask![]() Groupe : Anciens
|
Code : Autre
En ayant envie de faire la conversion nat<->int en profondeur dans les arbres, je me suis rendu compte qu'on voulait une fonction 'map' et que je ne savais pas faire d'ordre supérieur en Prolog. Code : Autre
Exemples : Code : Autre
Code : Autre
PS : dans ces exemples, j'ai une tripotée de variables intermédiaires (T2, T3, N2..) dans les tests. Comment ne pas afficher leur valeur ? |
||||||||||||||
Retour au forum "Autres langages, outils et approches" ou à la liste des forums
