IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scheme Discussion :

Produit de deux ensembles


Sujet :

Scheme

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Points : 379
    Points
    379
    Par défaut Produit de deux ensembles
    Bonjour je dois réaliser le produit cartésien de deux ensembles E1 et E2 implémentés par des listes sans répétitions du type (a b f s) dont l'ordre ne compte pas et obtenir un résultat du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (ens-prod '(a b c) '(1 2))
    
    > ((a 1) (a 2) (b 1) (b 2) (c 1) (c 2))
    J'ai fais ceci mais le résultat me donne trop de A-listes et je ne trouve pas comment m'en débarasser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (define (ens-prod A B)
       (map (lambda (x) (map (lambda (y) (list x y)) B)) A))
    
    > (((a 1) (a 2)) ((b 1) (b 2)) ((c 1) (c 2)))
    si quelqu'un a une idée...

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    si tu concatènes les listes contenues dans la liste résultat... ça devrait suffire
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Combine la récursivité et le map.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Remarque en passant :

    Ce genre de TP est plus simple à mettre en œuvre sous Scheme que sous ocaml. Sous ocaml, le typage est un sérieux frein.

  5. #5
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    En Caml, traduction littérale de l'exemple donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let ens_prod a b =
      List.map (fun x -> List.map (fun y -> [x; y]) a) b
    Je ne vois pas de différence, ici.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par LLB Voir le message
    En Caml, traduction littérale de l'exemple donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let ens_prod a b =
      List.map (fun x -> List.map (fun y -> [x; y]) a) b
    Je ne vois pas de différence, ici.
    Mais si tu implémentais les ensembles tu utiliserais des listes simples, toi ?
    Probablement plus des hashset non ?

    Et en général dès que tu commences à penser à ton typage, ça complique la vie. Je ne dis pas que c'est infaisable: je l'ai fait pour montrer à mon collègue comment ça pourrait se faire. Sauf qu'en Scheme la solution est plus simple puisqu'il n'y a pas de problème de typage. Si tu ne manipules que des entiers, ce n'est pas génant. Si tu manipules des entiers et des réelles, ça devient fatiguant... si tu veux des ensembles dans tu ne peux définir l'ensemble d'inclusion a priori, les choses se gatent (mélange d'un nombre n de types).

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Mais si tu implémentais les ensembles tu utiliserais des listes simples, toi ?
    Probablement plus des hashset non ?

    Et en général dès que tu commences à penser à ton typage, ça complique la vie. Je ne dis pas que c'est infaisable: je l'ai fait pour montrer à mon collègue comment ça pourrait se faire. Sauf qu'en Scheme la solution est plus simple puisqu'il n'y a pas de problème de typage. Si tu ne manipules que des entiers, ce n'est pas génant. Si tu manipules des entiers et des réelles, ça devient fatiguant... si tu veux des ensembles dans tu ne peux définir l'ensemble d'inclusion a priori, les choses se gatent (mélange d'un nombre n de types).
    Pour des ensembles de petite taille (<~ 500 éléments), l'emploi de liste est envisageable et plutôt efficace (tout dépend de ce que tu en fais).

    Pour ce qui est du typage, je ne suis pas d'accord : dès lors que tu manipules une liste d'éléments homogènes, tu n'as pas à y penser grâce au polymorphisme et si tu as une fonction qui assume qu'il s'agit d'une liste d'entier par exemple, tu ne risques pas de lui passer une liste de string par erreur. De ce point de vue, je trouve que les types simplifient plutôt la programmation.
    Les listes hétérogènes sont rarement nécessaires et traduisent souvent un problème de conception, note bien que dans un langage comme Haskell, il est possible de créer des listes hétérogènes facilement (si on connait le langage) et même de faire des listes hétérogènes restreintes (où les types autorisés appartiennent à une même typeclass) , qui sont nettement plus utiles.

    --
    Jedaï

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Pour des ensembles de petite taille (<~ 500 éléments), l'emploi de liste est envisageable et plutôt efficace (tout dépend de ce que tu en fais).

    Pour ce qui est du typage, je ne suis pas d'accord : dès lors que tu manipules une liste d'éléments homogènes, tu n'as pas à y penser grâce au polymorphisme et si tu as une fonction qui assume qu'il s'agit d'une liste d'entier par exemple, tu ne risques pas de lui passer une liste de string par erreur. De ce point de vue, je trouve que les types simplifient plutôt la programmation.
    Les listes hétérogènes sont rarement nécessaires et traduisent souvent un problème de conception, note bien que dans un langage comme Haskell, il est possible de créer des listes hétérogènes facilement (si on connait le langage) et même de faire des listes hétérogènes restreintes (où les types autorisés appartiennent à une même typeclass) , qui sont nettement plus utiles.

    --
    Jedaï
    Les listes hétérogènes sont peut être peu utile pour toi, mais il se trouve que pour le projet de tuteur que fait mon collègue, elles sont très importantes puisqu'il ne connait pas le type qui va être implémenté par ceux et celles qui feront une application pour le tuteur. Il faut donc jouer avec les type polymorphe, mais Scheme se montre bien plus souple là-dessus.
    Un exemple simple est un logiciel d'aide pour de la théorie naïve des ensembles. Même en utilisant donc des listes, si tu veux prévoir qu'on fasse des produits cartésiens d'ensemble, tu ne sais pas à quel « type » se réfère l'ensemble. J'emploie ici « type » dans le sens Russellien : son ordre.

    Et notes bien que je n'ai cité que ocaml et Scheme, et non Haskell puisque je ne sais pas comment cela pourrait être fait en Haskell

    Mais bon c'est général, le type limite la souplesse d'utilisation mais offre de belles récompenses en compensation. Ne me fait surtout pas dire que les types sont plus génants qu'utiles.

  9. #9
    alex_pi
    Invité(e)
    Par défaut
    J'avoue que j'aimerai bien un cas concret ou le polymorphisme n'est pas suffisant. Pour moi en Caml, un produit cartésien ferait quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'a set -> 'b set -> ('a * 'b) set
    , et ça me parrait parfaitement convenable

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    J'avoue que j'aimerai bien un cas concret ou le polymorphisme n'est pas suffisant. Pour moi en Caml, un produit cartésien ferait quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'a set -> 'b set -> ('a * 'b) set
    , et ça me parrait parfaitement convenable
    Je n'ai pas dit que ce n'est pas suffisant ni infaisable !
    Du moins, je ne vois rien dans mes messages qui indique cela.
    J'ai dit que c'est plus simple avec Scheme -_-

    Par exemple si tu as un ensemble S
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {1, {'a',1}, {"2 + a", {}}}
    le typage n'est pas exactement simple à produire.
    Tu utilises des ensembles du module set.
    Il te faut donc charger les modules.
    Si tu demandes à l'utilisateur de rentrer des valeurs au clavier pour les mettre dans un ensemble, en lui offrant un moyen de faire des ensembles comme élément, as-tu une méthode simple pour le faire sans imposer des types ?

    Scheme ne se posera pas la question.
    ocaml t'impose de le faire.

    Encore une fois, ça a des avantages (nombreux) mais ça limite la flexibilité.

  11. #11
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Je n'ai pas dit que ce n'est pas suffisant ni infaisable !
    Du moins, je ne vois rien dans mes messages qui indique cela.
    J'ai dit que c'est plus simple avec Scheme -_-

    Par exemple si tu as un ensemble S
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {1, {'a',1}, {"2 + a", {}}}
    le typage n'est pas exactement simple à produire.
    Tu utilises des ensembles du module set.
    Il te faut donc charger les modules.
    Si tu demandes à l'utilisateur de rentrer des valeurs au clavier pour les mettre dans un ensemble, en lui offrant un moyen de faire des ensembles comme élément, as-tu une méthode simple pour le faire sans imposer des types ?

    Scheme ne se posera pas la question.
    ocaml t'impose de le faire.

    Encore une fois, ça a des avantages (nombreux) mais ça limite la flexibilité.
    Méthode simple mais verbeuse ?

    Après, pour les types utilisateurs, il faut pouvoir construire une petite bijection et sa réciproque, pour faire le lien entre le type construit plus haut et le type utilisateur...
    Bon, on perd du typage de nom, on perd la différence entre un type registre et un n-uplet... C'est pas grave à priori.

  12. #12
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Par exemple si tu as un ensemble S
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {1, {'a',1}, {"2 + a", {}}}
    le typage n'est pas exactement simple à produire.
    Ca ne répond pas vraiment à ma question dans le sens où je ne perçois pas dutout l'intéret d'avoir un tel ensemble non typé.
    Pour moi un "objet" (en l'occurence cet ensemble) doit être définis de deux façons en même temps :
    1. Comment le construire. Ici, c'est raisonnablement facile, il suffit de mettre les éléments dedans les un après les autres
    2. Comment l'utiliser. Là ça se complique ! Vu que tu ne sais pas de quel type sont les éléments de ton ensemble, quelle fonction peux tu leur appliquer ? Si tu n'as pas leur type, je ne vois pas comment tu peux récupérer la moindre information relative à ces éléments ou faire quoi que ce soit avec.

    Je ne vois pas de situation utile où l'on peut vouloir mettre à la fois dans un ensemble des fonctions, des chaines de caractères et n-uplets d'entiers...

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    [...]
    Je ne vois pas de situation utile où l'on peut vouloir mettre à la fois dans un ensemble des fonctions, des chaines de caractères et n-uplets d'entiers...
    Un outil avec un tuteur pour apprendre l'utilisation des ensembles en math de manière naif. Mais on s'en fout de l'application, ça pourrait être pour représenter une structure quelconque, un code quelconque ou je ne sais quoi. Que tu ne trouves pas personnellement d'intérêt est une chose, mais qu'un client t'en imposes le besoin en est une autre. Si on te le demande, tu dois bien le faire non ? Ça ne sert à rien de vouloir contourner le problème en disant « ça ne sert à rien. » Peut-être qu'un jour tu tomberas sur une application où ça sera intéressant pour toi. Dans un cas où tu ne connais pas les objets que tu veux mettre dans ta liste, a priori, tu dois avoir qqchose dans l'idée d'une classe Object, ou un langage faiblement typé.

Discussions similaires

  1. Deux ensembles spécifiés dans la fonction << >> ont une dimensionalité différente.
    Par clementratel dans le forum Autres outils décisionnels
    Réponses: 0
    Dernier message: 20/02/2008, 16h15
  2. produit de deux matrices
    Par reckahomis1 dans le forum C
    Réponses: 5
    Dernier message: 28/10/2007, 21h25
  3. Produit de deux polynomes
    Par Tulas dans le forum Caml
    Réponses: 3
    Dernier message: 02/05/2007, 09h44
  4. comment calculer le produit de deux nombres en PHP
    Par batalich dans le forum Langage
    Réponses: 3
    Dernier message: 12/03/2007, 09h02
  5. [Tableaux] produit de deux tableaux
    Par vivian dans le forum Langage
    Réponses: 8
    Dernier message: 25/07/2006, 19h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo