j'ai un doute... as-tu compris ce que j'ai dit au-dessus :koi: ?
parce qu'a priori comment veux-tu savoir si cela ne va pas exploser ?
Version imprimable
alors peut tu m'expliquer ?(je parles des termes réductibles non pas des termes qu'on ne peut pas réduire)
on peut prendre cette exemple(sxyz)
mais comment on écrit une fonction (pas un programme) qui prend en argument une liste de termes et renvoie la liste sous forme normale.
Je viens de le dire, les notions de base sont expliquées en français dans La lettre de Caml n°6.
Généralement, savoir si un terme est réductible en forme normale est indécidable (c'est le fameux problème de l'arrêt d'un programme).Citation:
je parles des termes réductibles non pas des termes qu'on ne peut pas réduire
La fonction eval dans un de mes précédents messages prend un terme et renvoie son évaluation en forme normale (quand c'est possible).Citation:
comment on écrit une fonction (pas un programme) qui prend en argument une liste de termes et renvoie la liste sous forme normale.
Pour une liste de termes, la généralisation est triviale:
Cette expression renvoie la liste des termes en forme normale (toujours quand c'est possible).Code:List.map eval terms;;
cela fait trois fois que tu poses exactement la même question...
au passage pourquoi cette différence fonction / programme, c'est un énoncé :koi: ?
tu connais les règles de réduction (cf les différentes ressources qu'on a cité), tu choisis ton type (modèle de spiceguid, le mien ou un autre), et tu essaies d'appliquer quelques règles pour mieux comprendre ;)
merci à tous,est ce que le résulta renvoyer est sous forme de chaines de caractéres.
Pour savoir si une fonction renvoie une chaîne de caractères:
- tu copie-colle la fonction dans ton interpréteur
- l'interpréteur est aussi un typeur, il type la fonction et affiche son type
- si le type affiché se termine par -> string alors la fonction renvoie une chaîne de caractères
- sinon la fonction ne renvoie pas une chaîne de caractères
Et si la fonction prend en argument une liste aulieu d'une chaine.(comment on fait dans les deux cas)
Et si la fonction prend en argument une liste et nous renvoie une chaine
de caractéres
(comment on fait)(Un site ou une explication merci)
Ma boule de cristal étant en panne, je ne peux pas te répondre... La donnée du type (incomplet en plus, quel est le type des éléments de la liste ?) d'une fonction ne suffit pas à définir son code dans le cas général, sinon l'informatique serait beaucoup plus simple. Je te signale aussi qu'il est inutile de reposter la question dans un nouveau thread juste parce que tu n'as pas encore obtenu de réponse.
--
Jedaï
Si, je t'ai répondu, je t'ai dit que tu ne nous fournissais pas assez d'informations pour qu'on puisse te répondre. Et ceci est un forum public, du moment que tu postes dessus, n'importe quel membre peut te répondre, si tu veux une conversation privée avec quelqu'un il y a d'autres média plus appropriés.
Ton attitude n'est pas très constructive : tu te contentes de poser des questions, parfois plusieurs fois de suite, sans jamais tenter de penser ou de chercher par toi-même, ou du moins sans jamais en donner l'impression dans tes messages... Comme certains l'ont fait remarquer au début de la discussion, ce forum est un forum d'entraide, nous ne sommes pas censé te donner toutes les solutions, même si SpiceGuid t'a très gentiment fourni du code (surtout parce qu'il l'avait déjà sous le coude, une bonne partie était d'ailleurs déjà disponible sur le forum si tu t'étais donné la peine de chercher).
--
Jedaï
1-j'ai chercher.
2-j'ai besion de réponses sur ma question,je ne vouler pas uniquement la solution mais je vouler comprendre pour aboutir à la solution.
3-je penser que tu ne vouler pas m'aider,en tout les cas c'est comme tu veux ma question est déja posé.
et la revoila
comment on écrit une fonction en Caml qui réduit les CL-termes de la lambda calcul (la forme normale)
Si on prend en argument nue liste et elle nous renvoie une chine de caractères sous forme normales?
Ce n'est pas en répétant 100 fois la question qu'elle deviendra plus claire !! Tu n'as pas changé un mot depuis la dernière fois...
Une liste de quoi en entrée ? Et que veux-tu dire par "une chine de caractères sous forme normales" (en faisant abstraction des fautes d'orthographe et d'accord, ceci est un forum, tu as le temps de te relire), un lambda-terme peut-être sous forme normale, ok, mais une chaîne de caractères ?
--
Jedaï
C'est une fonction qui prend en argument une liste de termes et renvoie la liste sous forme normale c'est à dire réduite.
Je me permets de faire une observation... Le type "terme" n'est pas défini en OCaml, alors si tu as besoin de représenter une liste de "termes", il te faut définir un type de donnée en OCaml pour les représenter; ceci en utilisant les constructeurs de type du langage.
Une telle définition a été donnée, de forme très élégante, ci-dessous. Elle permet de représenter les termes. De plus il a été fourni une fonction pour les évaluer.
Que manque-t-il?
David.
--
Chaque terme a une forme normale, donc la fonction devrait renvoyer une liste de lambda-termes, ou éventuellement de chaînes représentant des lambda-termes, pas une seule chaîne de caractère. Sauf si la liste représente l'application des lambda-termes dans cet ordre, mais nous ne pouvons pas le deviner. Ou alors tu fais une chaîne contenant une forme normale par ligne en sortie. Ou...
Sans une spécification précise, il nous est impossible de t'aider (à part par des généralités plates) et ta propre faculté de raisonner à propos de la fonction est amoindrie.
--
Jedaï
Tu as lu La lettre de Caml n°6 ? Elle est en français et c'est la 3ième fois que je te la recommande.
La transformation d'une lambda-expression de type lambda_expr, pour reprendre les notations de SpiceGuid, peut se fair exactement à la façon de la fonction eval, récursivement.
C'est très simple : il suffit de prendre chaque motif pouvant composer une valeur du type lambda_expr, et de la transformer en chaîne de caractères en utilisant cette même fonction. Tu peux utiliser les fonctions du module Printf si tu sais comment elles marchent, ou alors l'opérateur ^ permettant de concaténer des chaînes de caractères. Cette deuxième solution est la plus simple à mettre en oeuvre.
Quel est ton énoncé précis ?