|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Étudiant Inscription : novembre 2011 Messages : 10 ![]() |
Bonjour,
je suis étudiant et je dois réaliser un projet en Haskell. Cependant je bloque sur une partie de ce projet, VOICI Code :
Code :
substituer :: Substi -> Terme -> Terme Code :
Pourriez-vous, s'il vous plait, m'aider, m'indiquer une piste, me donner un conseil ou une idée, n'importe quoi qui m'aide à avancer? Merci d'avoir lu ma requête, et encore merci de la prendre en considération Bien à vous, marincuveur |
||||
|
|
00
|
|
|
#2 |
|
Membre actif
![]() Valentin RobertÉtudiant Inscription : juin 2004 Messages : 70 ![]() |
Peux-tu poster ton meilleur essai qu'on ait une idée de ce qui ne va pas ?
__________________
Apprendre Haskell vous fera le plus grand bien ! |
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Étudiant Inscription : novembre 2011 Messages : 10 ![]() |
Merci de votre intérêt
Voila Code :
Bien à vous, Marincuveur |
||
|
|
00
|
|
|
#4 | ||||
|
Membre actif
![]() Valentin RobertÉtudiant Inscription : juin 2004 Messages : 70 ![]() |
Pour termToString, je ne sais pas ce que c'est censé faire, mais je remarque que tu n'affiches pas les sous-termes d'un nom, c'est voulu ?
Si oui, alors tu pourrais te contenter de : Code :
--- Quant à substituer, là encore je ne suis pas certain de ce que tu veux faire, mais quelques remarques : - tu ne traites pas tous les cas :
Egalement, tu déconstruis y:ys pour ne jamais utiliser y et ys... Es-tu sûr que c'est ce que tu veux faire ? (Quid de la liste vide ?) --- Code :
substituer [] (NOM term xs) = if xs == [] then (NOM term []) else (NOM term xs) Code :
if xs == [] then (NOM term []) else (NOM term xs) De plus, je suis presque sûr que ce que tu veux c'est encore plus général : --- Tu devrais donc repartir sur un schéma exhaustif, et remplir les cas ou les couper en deux si besoin seulement : Code :
Pour TODO2, a priori, tu ne vas pas toucher à NOM et à terme, et tu vas appliquer les substitutions à tous les éléments de la liste soustermes. J'espère que tu as entendu parler de fonctions comme map. Pour TODO3, tu vas devoir tenter d'appliquer, une à une, toutes les substitutions de la liste. C'est à dire que tu vas chercher à appliquer la subsitution (sNom, sTerme) si nom == sNom, et tu vas essayer de substituer substs (le reste des substitutions à effectuer) dans le résultat de ce premier calcul. Je crois que tu n'auras pas besoin de cas en plus que ceux que j'ai mis là. Les cas 1 et 2 devraient être faciles. Le cas 3 sera récursif. --- Note au passage que l'ordre d'application des substitutions peut avoir de l'importance, il faudrait donc savoir si tu commences par appliquer (sNom, sTerme), puis tu traites substs (le reste); ou si tu appliques d'abord le reste, puis en dernier la tête de liste des substitutions.
__________________
Apprendre Haskell vous fera le plus grand bien ! |
||||
|
00
|
|
|
#5 |
|
Invité de passage
![]() Étudiant Inscription : novembre 2011 Messages : 10 ![]() |
Merci pour votre aide et vos conseils.
|
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Étudiant Inscription : novembre 2011 Messages : 10 ![]() |
voila,
après avoir passé ces derniers jours à me documenter et à travailler sur ce (qui est pour moi un vrai casse tête) problème, voici le résultat : Substituer :: Substi -> Terme -> Terme Substituer [] term = term Substituer substs (NOM term soustermes) = NOM term ( substitut substs soustermes) where substitut substs soustermes = [Substituer substs term | term <- soustermes] Substituer ((sNom, sTerme):substs) (VARIABLE var) = if sNom == var then Substituer substs sTerme else Substituer substs (VARIABLE var) ca à l'air de fonctionner...du moins jusque là car je ne l'ai pas testé exhaustivement(ca pique les yeux ces termes) Cependant, je me demandais comment j'aurais pu utiliser des fonctions comme map ou foldl,... pour arriver au même résultat... J'avais essayé cette approche au départ mais je n'arrivais à rien. Pourriez vous, s'il vous plait, m'expliquer? En vous remerciant d'avance, Bien à vous, Marincuveur |
|
|
00
|
|
|
#7 | ||||||||||||
|
Membre actif
![]() Valentin RobertÉtudiant Inscription : juin 2004 Messages : 70 ![]() |
Utilise des balises de code !
----- Code :
----- Code :
Code :
Le type dévoile bien la fonction : elle prend une fonction de a vers b, une liste de a, et retourne une liste de b. Pour ce faire, on se doute bien qu'elle applique la fonction sur chaque élément ! On aurait donc écrit : Code :
Et qu'on veut obtenir en résultat une liste de Terme, il faut une fonction de type Terme -> Terme. Code :
Ceci étant, je ne suis pas sûr que tu n'omettes pas un détail, cf. plus bas [1] ----- Code :
Attention ceci dit, une mauvaise indentation rendra Haskell grognon. Dans le cas où sNom == var, tu remplaces (VARIABLE var) par sTerme, et cela semble correct, par contre, tu continues à substituer le reste des substitutions dans sTerme, es-tu sûr de vouloir faire ça ? Est-ce que c'est logique dans ton projet ? Si tu t'es trompé, alors on pourra retravailler ce bout de code (qui ne serait alors qu'un map). Si tu veux vraiment faire ce que tu fais là, alors on peut réécrire ça comme un fold je crois. Mais pose-toi déjà cette question. ----- [1] : Que signifie ton "NOM Terme [Terme]" ? Si c'est censé représenter une abstraction au sens lambda-calcul, déjà ça a une drôle de tête, et ensuite au niveau de la substitution il faudra faire du travail en plus pour respecter les portées des noms. Enfin bon, ce serait bien d'expliquer ce que tu fais que je ne te dise pas de bêtises...
__________________
Apprendre Haskell vous fera le plus grand bien ! |
||||||||||||
|
00
|
|
|
#8 |
|
Invité de passage
![]() Étudiant Inscription : novembre 2011 Messages : 10 ![]() |
merci beaucoup pour votre aide
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com