Bonsoir à tous,
Je suis informaticien et j'ai 48 ans. Je suis dans la Production depuis 10 ans.
J'ai commencé à apprendre OCaml depuis 2 jours suite à un stage intensif (eLearning). J'ai plutôt de l'expérience sur des langages interprétés style Perl ou Shell et je dois vous avouer que ce type de langage me perturbe pas mal.
J'ai donc beaucoup de mal à comprendre ce langage fonctionnel (l'âge n'aidant pas...).
J'ai un exercice pour me permettre de maîtriser les listes récursives:
Nous définissons des multi-ensembles qui sont des ensembles avec répétitions. Par exemple, me =
{3,5,4,5,6,3,6} est un multi-ensemble d’entiers contenant deux exemplaires de 3, deux exemplaires de 5, un exemplaire de 4
et deux exemplaires de 6.
Introduisons le type ’e melt pour représenter plusieurs exemplaires d’une même valeur d’élément :
Un multi-ensemble est une collection d’éléments non ordonnés avec répétitions. Nous le représentons
Code : Sélectionner tout - Visualiser dans une fenêtre à part type e melt = e * int.
par le type suivant :Tous les exemplaires
Code : Sélectionner tout - Visualiser dans une fenêtre à part type e mset = Nil | Cons of e melt * e mset.
d’une valeur d’élément sont regroupés dans un seul multi-élément. L’ensemble vide sera défini par let
empty = Nil.
Voici deux définitions possibles de me :
Je dois définir une fonction de ce type:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 let me = Cons((3,2), Cons((5,2), Cons((4,1), Cons((6,2), Nil)))), let me = Cons((6,2), Cons((3,2), Cons((5,2), Cons((4,1), Nil)))).
, où isempty s est vrai si s est un muti-ensemble vide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part isempty : e mset -> bool
Au départ, je pensais à cette fonction:
Or, après réflexion, il me semble que la fonction doit retourner les résultats suivants:
Code : Sélectionner tout - Visualiser dans une fenêtre à part let isempty(a:'e mset) = if a = empty then true else false;;
Donc, si x est un multi-élément (soit un couple (a,b) pour dire qu'il y a "b" fois le chiffre "a") et y est un multi-ensemble, pour que la fonction isempty retourne true, il faut que:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 let me1 = Cons((Nil,4),Nil) isempty(me1) -> true let me2 = Cons((Nil,4),Cons((3,2),Nil)) isempty(me2) -> false isempty(empty) -> true
- x soit l'ensemble vide "empty" et
- isempty(y) retourne true
Avez-vous la même compréhension que moi ? Comment faire pour écrire cette sémantique en OCaml? Merci pour votre aide
De plus, je ne comprends pas pourquoi il est défini l'ensemble vide par let empty = Nil?
Partager