kantien a écrit 1189 commentaires

  • [^] # Re: Je suis 

    Posté par  . En réponse au journal Lequel d'entre vous a fait ça ?. Évalué à 3.

    Ah un concours d'inutile tétracapillosection

    Certes inutile, donc évidemment indispensable ! Je vous remercie pour ce moment de bonne humeur, vous m'avez bien fait rire. :-)

    Pour rajouter ma couche de diptérosodomie, je dirais, Benoît, que dans ton exemple :

    • je suis X, je chuis X par quelqu'un qui chochotte

    le lien ne convient pas à ton usage. Dans celui-ci, le terme « chuis » est présenté comme un écriture possible de la forme orale contractée du « je suis » que l'on rencontre souvent dans le langage familier, et non comme la prononciation du mot « suis » par quelqu'un qui chochotte.

    Pour une référence cartésienne, je rajouterai :

    • je suis X, ergo cogito.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Et 4 mois plus tôt, chez Debian ...

    Posté par  . En réponse au journal systemd: attention à RemoveIPC. Évalué à 7.

    Un peu hors-sujet ta réponse à un commentaire qui faisait un jeu de mots entre ta faute d'orthographe sur « sein » (au lieu de « sain », comme expliqué dans un autre commentaire) et son équivalent anglais « boob ». ;-)

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Réponses à quelques questions

    Posté par  . En réponse à la dépêche Le Frido, un livre de mathématique libre pour l’agrégation. Évalué à 1.

    Tout comme de nombreux autres commentaires, je voudrais d'abord te féliciter pour la somme de travail effectué et le choix de licence pour ton ouvrage.

    Maintenant, je voudrais revenir sur ta question 21 et la preuve d'existence d'un ensemble mesurable de réels qui ne serait pas un borélien. La preuve usuelle pour un tel résultat repose sur un argument de cardinalité : l'ensemble des boréliens a au plus la puissance du continu tandis que celui des ensembles mesurables à la puissance de l'ensemble des parties des réels, ainsi n'ayant pas même cardinalité le premier est nécessairement strictement contenu dans le second.

    La preuve sur la cardinalité des ensembles mesurables repose sur l'ensemble triadique de Cantor : c'est un ensemble de mesure nul qui à la puissance du continu, donc tout sous-ensemble de l'ensemble triadique de Cantor est mesurable, d'où la conclusion que la famille des ensembles mesurables contient un ensemble équipotent à l'ensemble des parties de réels. De mémoire, et en y réfléchissant rapidement, je ne crois pas que l'axiome du choix (mais peut être bien l'axiome du choix dénombrable) soit nécessaire pour prouver un tel résultat. Néanmoins l'axiome du choix prouve aussi l'existence d'ensembles non mesurables, mais l'énoncé qui affirme que tout ensemble de réels est mesurable n'est pas contradictoire avec les autres axiomes de ZF (bien qu'un tel univers des ensembles ne puisse satisfaire l'axiome du choix).

    Viens à présent la preuve de l'énoncé sur la cardinalité de l'ensemble des boréliens, et l'exercice du TD auquel tu fais référence. Là où l'axiome du choix est nécessaire (en réalité je dirais que seul l'axiome du choix dénombrable, qui permet de prouver qu'une union dénombrable d'ensembles dénombrables est dénombrable, me semble utilisé de prime abord) c'est à la question 2 afin de prouver que la famille construite est une \sigma-algèbre. Cela étant, à la dernière question, il est précisé quand reprenant le même raisonnement et la même construction en utilisant le plus petit ordinal stable par réunion dénombrable, on peut se dispenser d'un tel axiome — ce qui me semble plausible au premier abord.

    Pour finir, je voudrais faire quelques remarques sur ton exigence de constructivité en se passant de l'axiome du choix. S'il est vrai que l'axiome en question affirme l'existence d'un ensemble sans expliciter la manière de l'obtenir à partir des autres axiomes et donc des constructions ensemblistes usuelles, il n'en reste pas moins, d'une certaine façon, que c'est l'existence d'ensembles qui mettraient en défaut cet axiome qui est hautement non constructive. En effet, pour montrer que l'axiome du choix n'était pas contradictoire avec les autres axiomes de ZF, Gödel a construit une famille propre d'ensembles en partant de l'ensemble vide (le premier dont on peut prouver l'existence en admettant que ZF est non contradictoire) puis en définissant tout le reste à partir de lui et des opérations ensemblistes usuelles. Et il se trouve que cette famille non seulement satisfait ZF mais également l'axiome du choix et même l'hypothèse généralisée du continu.

    Si le sujet t'intéresse, un ouvrage de référence en théorie axiomatique des ensembles est le livre Set Theory de Thomas Jech (pdf de la 3ème édition de 2003). Au chapitre 11 il étudie particulièrement la théorie descriptive des boréliens et des ensembles analytiques (tu y retrouveras la constructions de l'exercice du TD). En langue française, on pourra se référer à l'ouvrage Théorie des ensembles de Jean-Louis Krivine, par exemple.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: La vraie question

    Posté par  . En réponse au journal Réparabilité de l’électroménager : SEB s’engage. Évalué à 4. Dernière modification le 28 septembre 2016 à 15:11.

    C'est intéressant comme analyse. Je ne connaissais pas la toponymie, mais après la lecture des liens de ton message, je propose l'interprétation alternative suivante.

    D'après le site de la commune, l'origine du nom viendrait bien du nom d'une famille latine « Falconius » et du suffixe « -acum ». D'après Wikipdéia, ce suffixe d'origine celtique aurait donné les noms de villes se terminant en « -ey » dans la région Franche-Comté, par exemple. Et il aurait, de part sa signification originelle, une fonction localisante. Ainsi Faucogney pourrait déjà signifier : « le lieu où vivait les Falconius ».

    Ensuite, à la section sur la toponymie de Gerardmer on peut lire ceci :

    mô(r) ou mer a le sens générique de « lac, étendue d'eau » et est sans doute d'origine germanique, de même l'ordre déterminant-déterminé (Gerard-mer) reflète une influence syntaxique du germanique.

    Et comme la ville de Faucogney-et-la-Mer fait partie de la communauté de communes des 1000 étangs, il se peut bien que le « et-la-Mer » fasse référence à ces étendues d'eau, et non au domaine où vivait les Falconius (ce fait étant déjà signifié dans le nom Faucogney).

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Financement participatif pour une version animée

    Posté par  . En réponse au journal Pepper et Carrot. Évalué à 1.

    C'est simple : ce n'était pas une blague mais un problème de mémoire sélective. Lors du journal je n'avais retenu que la publication chez Glénat, et toutes les discussions dans les commentaires ayant tourné autour de ce sujet, j'en avais zappé la campagne Indiegogo.

    Quand j'ai vu passé cette information sur un autre support, non noyée dans le bruit d'un débat sur les licences CC et l'art libre, j'ai repensé à ce journal sans vérifier s'il contenait déjà l'information. Mea culpa ! :-/

    Bon, au final tout est bien qui fini bien : il a réussi à récolter les fonds nécessaires ! :-)

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • # Financement participatif pour une version animée

    Posté par  . En réponse au journal Pepper et Carrot. Évalué à 0.

    Je viens de découvrir qu'un artiste russe souhaite faire une version animée de l'épisode 6 : le concours de potion. Le film d'animation sera sous CC BY-SA, plus d'information sur sa page indiegogo.

    L'objectif est de 4000$ et il en est à 3.771$ à 15 heures de la fin. Pour ceux que ça intéresse…

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Quelle super idée !

    Posté par  . En réponse au journal Statue Android à Montélimar . Évalué à 2.

    Dans ce cas, si l'on quitte le sol français, quoi de mieux que la ville de Hambourg qui donna son nom au hamburger ?

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re:

    Posté par  . En réponse au journal Bookmark: Ordinateurs bloquants l'installation de GNU/Linux. Évalué à 2.

    Allo ? Le boot loader ?

    Ah bah non ! De ce que j'ai compris, Allo c'est la nouvelle messagerie instantanée de Google pour son système Android, rien à voir avec un bootloader.

    Allo est une appli de messagerie intelligente conçue pour être simple, fiable et amusante. Exprimez-vous avec les autocollants, les dessins, et aussi avec du texte et d'ÉNORMES émoji. Avec Allo, découvrez un aperçu de l'Assistant Google.

    :-P

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: GTK+4

    Posté par  . En réponse à la dépêche Firefox 49 en chansons. Évalué à 2.

    Au mois de juin, lors du GTK hackfest à Toronto, il y a eu des discussions sur la nouvelle politique de version de GTK. Allison Lortie a écrit deux articles, en anglais, sur le sujet :

    Le premier s'ouvre ainsi :

    The first topic that we discussed was how to deal with a problem that we have had for some time: the desire to create a modern toolkit with new features vs. the need to keep a stable API

    Traduction personnelle :

    Le premier sujet que nous avons discuté concernait la façon de gérer un problème que nous avons depuis un moment : la volonté de créer une boîte à outils moderne avec de nouvelles fonctionnalités versus le besoin de conserver une API stable.

    Nous en saurons peut être plus lors de la sortie de la prochaine dépêche sur Gnome.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: intéressant

    Posté par  . En réponse au journal Le web distribué: Zeronet, IPFS, Dat.data, Maidsafe,.... Évalué à 4. Dernière modification le 21 septembre 2016 à 14:07.

    opensource ça veut juste dire que tu peux accéder/lire au code source.

    Non, comme l'a rappelé GuieA_7 l'a définition d'open-source c'est celle-là qui comporte en introduction :

    Open source doesn't just mean access to the source code.

    Soit :

    Open source ne signifie pas seulement l'accès au code source.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: mouais

    Posté par  . En réponse au journal Un peu de méca : mesurer un module de Young avec son smartphone. Évalué à 10. Dernière modification le 21 septembre 2016 à 13:58.

    Où vois-tu du gâchis ? À titre personnel cette application ne me sera d'aucune utilité, mais de ce que je comprends du journal - et il me semble clair sur ce point là - c'est qu'il présente une application permettant de transformer son smartphone en instrument de mesure. En dehors des personnes qui sauront quoi faire de la mesure obtenue (i.e les mécaniciens), quel peut être le public cible ? Et pour eux, d'après leurs commentaires, le contenu du journal semble assez clair.

    Que voulais-tu qu'il fasse : un présentation de l'utilité pratique de déterminer l'élasticité des matériaux ? Son objectif semble plutôt avoir été : vous êtes mécanicien, il vous arrive d'avoir besoin de connaître l'élasticité des matériaux que vous utilisez ? Alors j'ai une solution pour vous : transformez votre smartphone en instrument de mesure grâce à mon application, et si vous voulez vous pouvez aussi l'installer sur votre PC en suivant la procédure décrite en fin de journal. Je me répète, mais où est le gâchis ?

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Privé ou privé ?

    Posté par  . En réponse au journal Quand on délègue sa liberté d'expression à twitter. Évalué à 2. Dernière modification le 19 septembre 2016 à 18:54.

    Si on se réfère à la loi informatique et libertés, on loit.
    « CHAPITRE II - CONDITIONS DE LICÉITÉ DES TRAITEMENTS DE DONNÉES À CARACTÈRE PERSONNEL

    Article 7
    Un traitement de données à caractère personnel doit avoir reçu le consentement de la personne concernée ou satisfaire à l’une des conditions suivantes : [Trucs qui ne concernent pas tweeter] »

    Cela ne me paraît pas si évident que cela que ces « trucs » ne concernent ni tweeter, ni reflets.

    Reprenons le texte de la loi dite informatique et libertés. L'article 2 tout d'abord expose le domaine auquel s'applique la loi ainsi que la terminologie utilisée dans le reste du texte :

    La présente loi s'applique aux traitements automatisés de données à caractère personnel, ainsi qu'aux traitements non automatisés de données à caractère personnel contenues ou appelées à figurer dans des fichiers, à l'exception des traitements mis en oeuvre pour l'exercice d'activités exclusivement personnelles, lorsque leur responsable remplit les conditions prévues à l'article 5.

    Constitue une donnée à caractère personnel toute information relative à une personne physique identifiée ou qui peut être identifiée, directement ou indirectement, par référence à un numéro d'identification ou à un ou plusieurs éléments qui lui sont propres. Pour déterminer si une personne est identifiable, il convient de considérer l'ensemble des moyens en vue de permettre son identification dont dispose ou auxquels peut avoir accès le responsable du traitement ou toute autre personne.

    Constitue un traitement de données à caractère personnel toute opération ou tout ensemble d'opérations portant sur de telles données, quel que soit le procédé utilisé, et notamment la collecte, l'enregistrement, l'organisation, la conservation, l'adaptation ou la modification, l'extraction, la consultation, l'utilisation, la communication par transmission, diffusion ou toute autre forme de mise à disposition, le rapprochement ou l'interconnexion, ainsi que le verrouillage, l'effacement ou la destruction.

    Constitue un fichier de données à caractère personnel tout ensemble structuré et stable de données à caractère personnel accessibles selon des critères déterminés.

    La personne concernée par un traitement de données à caractère personnel est celle à laquelle se rapportent les données qui font l'objet du traitement.

    Vient plus loin l'article 7, que tu n'as pas cité dans sa totalité, qui dit :

    Un traitement de données à caractère personnel doit avoir reçu le consentement de la personne concernée ou satisfaire à l'une des conditions suivantes :

    1. Le respect d'une obligation légale incombant au responsable du traitement ;
    2. La sauvegarde de la vie de la personne concernée ;
    3. L'exécution d'une mission de service public dont est investi le responsable ou le destinataire du traitement ;
    4. L'exécution, soit d'un contrat auquel la personne concernée est partie, soit de mesures précontractuelles prises à la demande de celle-ci ;
    5. La réalisation de l'intérêt légitime poursuivi par le responsable du traitement ou par le destinataire, sous réserve de ne pas méconnaître l'intérêt ou les droits et libertés fondamentaux de la personne concernée.

    En vertu de l'article 2, on pourrait arguer qu'un lien vers le résultat d'une requête sur le registre whois est une « communication par transmission, diffusion ou toute autre forme de mise à disposition », est constitue donc un traitement de donnée à caractères personnelles tel que défini par le dit article.

    Ensuite, il semble peu douteux que Jean-Paul Ney n'ait pas donné son consentement à ce traitement, et reste donc les conditions auxquelles celui-ci doit satisfaire en vertu de l'article 7. Il va de soi que reflet ne peut invoquer les points 1, 2, 3 et 4 pour justifier leur lien. Reste donc le point 5 :

    La réalisation de l'intérêt légitime poursuivi par le responsable du traitement ou par le destinataire, sous réserve de ne pas méconnaître l'intérêt ou les droits et libertés fondamentaux de la personne concernée.

    La réalisation de l'intérêt légitime poursuivi par reflets (le responsable du traitement, ce qui implique médiatement Tweeter) ou par le public de ses abonnés (le destinataire) autorisait-elle un tel traitement ? Et si oui, cela s'est-il fait sans méconnaître l'intérêt ou les droits et libertés fondamentales de Jean-Paul Ney ?

    Honnêtement je suis bien incapable de trancher juridiquement ces questions, et il semblerait que Tweeter considère que c'est là porter atteinte à l'intérêt ou aux droits et libertés fondamentaux de Jean-Paul Ney, raison pour laquelle ils ont bloqué le comte de reflets. C'est du moins ainsi que j'interprète le troisième point « divulguer les informations privées d'autres utilisateurs » dans leur message :

    message tweeter

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Oui, enfin quand on regarde les détails...

    Posté par  . En réponse au journal Quand on délègue sa liberté d'expression à twitter. Évalué à 3.

    pas tout à fait, tu en es plus le locataire que le propriétaire ;-)

    Ta formulation est effectivement plus correcte, je le loue avec un bail que je renouvelle annuellement pour l'instant.

    Toutes les informations accessibles via un whois sont publiques
    Or nous avons obtenues ces informations via un whois
    Donc ces informations sont publiques.

    J'avoue que pour moi, il était acquis que les infos d'enregistrements de noms de domaine étaient publiques. Du coup, je suis allé jeter un œil sur wikipedia, et dans le paragraphe criticism, il y a :

    Currently the Internet Corporation for Assigned Names and Numbers (ICANN) broadly requires that the mailing address, phone number and e-mail address of those owning or administrating a domain name to be made publicly available through the "WHOIS" directories

    traduction suivant la méthode rache :

    Pour le moment, l'ICANN exige que l'adresse postale, le numéro de téléphone et l'adresse e-mail des détenteurs ou administrateurs de noms de domaine soient publiquement disponibles dans les répertoires WHOIS.

    Ces points touchent effectivement la majeure du raisonnement, et tout comme toi ou reflets, elle me semblait aller de soi. Dans mon cas, ce sont les informations de mon hébergeur que l'on trouve mais je ne savais pas qu'il y avait des réflexions sur le sujet et que même l'ICANN considérait qu'il y avait là un problème. En tout cas, merci pour les liens, je vais aller voir cela.

    Cela étant, à l'heure actuelle, il me semble bien que l'on peut considérer ces informations comme publiques, ce qui n'épuise évidemment pas la question de savoir s'il était légitime de la part de reflets de le pointer du doigt.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Oui, enfin quand on regarde les détails...

    Posté par  . En réponse au journal Quand on délègue sa liberté d'expression à twitter. Évalué à 4.

    Sérieusement, en dehors de considérations légales / propres à Twitter, vous trouvez légitime ce qu'a fait Reflets?

    Qu'est ce que tu n'as pas compris dans la conclusion de mon message ?

    En revanche, sur le plan juridique, il reste une question soulevée par Sufflope qui consiste dans l'intention de reflets de signaler ces informations. Mais là, cela dépasse mes compétences juridiques.

    La première partie de mon message était une réponse à gaaaaaAab qui disait que l'argumentation de reflets pour justifier le caractère publique de ces informations n'était pas fondée sur le fait qu'elles étaient accessibles via whois. Ce à quoi je lui ai objecté que selon ma lecture ce fait constitué bien une partie de leur raisonnement, en l'occurence la mineure. Pour ce qui est de la majeure, elle me semble aller de soi.

    Je m'exprime si mal que cela pour que tu n'ais pas compris ?

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Oui, enfin quand on regarde les détails...

    Posté par  . En réponse au journal Quand on délègue sa liberté d'expression à twitter. Évalué à 3.

    Ils n'ont pas écrit que ces infos sont publiques parce que faciles à obtenir, mais et faciles à obtenir.

    Cela se discute. Leur argumentation, telle que je la comprends, pourrait s'écrire ainsi :

    Toutes les informations accessibles via un whois sont publiques
    Or nous avons obtenues ces informations via un whois
    Donc ces informations sont publiques.

    Ainsi l'argumentation de reflets pour justifier le caractère publique de ces informations et bien le fait (la mineur qui suit le or) qu'elles soient accessibles via un whois.

    Cela étant je ne leur donne pas tort sur ce point, si ces informations à l'origine privées sont accessibles via whois c'est bien que le propriétaire du nom de domaine à accepter de les rendre publiques. Je suis moi-même propriétaire d'un nom de domaine, et un whois dessus renverra entre autre ceci :

    contact:     Ano Nymous
    remarks:     -------------- WARNING --------------
    remarks:     While the registrar knows him/her,
    remarks:     this person chose to restrict access
    remarks:     to his/her personal data. So PLEASE,
    remarks:     don't send emails to Ano Nymous. This
    remarks:     address is bogus and there is no hope
    remarks:     of a reply.
    remarks:     -------------- WARNING --------------
    

    En revanche, sur le plan juridique, il reste une question soulevée par Sufflope qui consiste dans l'intention de reflets de signaler ces informations. Mais là, cela dépasse mes compétences juridiques.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Ah oui, quand même

    Posté par  . En réponse à la dépêche Séminaire de réarmement intellectuel et technique sur le "Big Data". Évalué à 1.

    Je ne suis pas du tout convaincu par ce genre de raisonnement. Si les augmentations de productivité devaient produire du chômage, alors depuis les nombreux siècles qu'on augmente la productivité, il n'y aurait plus que 1% de la population active qui aurait un travail.

    Il me semble que c'est également où voulais en venir EauFroide, et c'est peut-être pour cela qu'il a mis le mot « chômeurs » entre guillemets. Si les progrès techniques font disparaître des emplois, assurément ils en créent également de nouveau, c'est ce que Schumpeter appelait la « destruction créatrice ». Cela étant, le sophisme économique qui consiste à ne voir que la destruction sans voir la création qui l'accompagne est assez répandu. L'économiste français Frédéric Bastiat en avait recensé quelques un dans son essai Ce qu'on voit et ce qu'on ne voit pas, celui sur les machines occupant le chapitre 8, dont est extrait ce magnifique paragraphe :

    Cela ne doit pas nous surprendre. Dans une fausse voie, on est toujours inconséquent, sans quoi on tuerait l’humanité. Jamais on n’a vu ni on ne verra un principe faux poussé jusqu’au bout. J’ai dit ailleurs : l’inconséquence est la limite de l’absurdité. J’aurais pu ajouter : elle en est en même temps la preuve.

    Le chapitre 7, qui repose au fond sur le même principe de réfutation, porte lui sur la « maudite concurrence étrangère » et s'attaque au slogan à la mode de nos jours : « nos emplettes sont nos emplois » ou le patriotisme économique.

    Il a également consigné, en deux tomes, toute une série de sophismes économiques et leurs réfutations dans son livre : Sophismes économiques.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Exemple judicieux ?

    Posté par  . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 1.

    Il est vrai que j'ai mal présenté la chose. Disons que par rapport à une liste, il n'y a pas besoin de valeur initiale car l'arbre contient déjà tout ce qui lui faut pour faire un reduce via la fonction g. Et le fold que j'ai écrit est une généralisation d'un map+reduce.

    let fold_map f g init = function
      | [] -> failwith "empty list"
      | x::xs -> 
         let rec loop acc = function
          | [] -> acc
          | hd::tl -> loop (g acc (f hd)) tl
         in loop (g init (f x)) xs
    ;;
    val fold_map : ('a -> 'b) -> ('c -> 'b -> 'c) -> 'c -> 'a list -> 'c = <fun>
    
    fold_map (string_of_int) (fun s s' -> Printf.sprintf "(%s + %s)" s s') "1" [2; 3];;
    - : string = "((1 + 2) + 3)"
    
    (* à comparer avec cette version sur les arbres *)
    
    let t = Node (Node (Leaf 1, Leaf 2), Leaf 3) in show_p t;;
    - : string = "((1 + 2) + 3)"

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Exemple judicieux ?

    Posté par  . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 3.

    Pour le voir encore autrement, je vais représenter les arbres d'évaluations des fold sur une liste.

    let l = [1; 2; 3]
    
    List.fold_left (+) 0 l;;
    - : int = 6 (* ((0 + 1) + 2) + 3 *)
    
    List.fold_right (+) l 0;;
    - : int = 6 (* 1 + (2 + (3 + 0))) *)

    Dans le premier cas, on évalue ainsi :

          +
         / \
        +   3
       / \
      +   2
     / \
    0   1
    

    Dans le second, on évalue comme ceci :

      +
     / \
    1   +
       / \
      2   +
         / \
        3   0
    

    À comparer aux arbres que j'ai dessiné en réponse à Pierre-Matthieu Anglade.

    Avec des listes on construit toujours des arbres en peigne soit vers la gauche, soit vers la droite. Mais un arbre pourrait avoir une toute autre structure comme celui-là :

       / \ 
      /   \
     /\   /\
    1  2 3  0
    

    Et si tu fais un fold (fun i -> i) (+) sur lui, c'est évaluer l'expression (1 + 2) + (3 + 0)

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Exemple judicieux ?

    Posté par  . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 1.

    l'usage en ocaml est de nommer le reduce "fold", et pas votre catamorphisme

    Et c'est ce que fait notre fonction fold : un reduce via la fonction g. Ce qu'il y a c'est que dans une liste, ou une collection séquentielle ou linéarisée, on peut attaquer la structure par deux bouts : le début ou la fin, d'où le fold_left et le fold_right.

    Dans le cas des arbres binaires, on attaque nécessaire par la racine puis on descend dans les branches pour finir sur les bouts de la structure que sont les feuilles où l'on applique la fonction f, puis l'on réduit la structure via la fonction g. C'est bien une généralisation du cas sur les listes dont le nom technique général est catamorphisme. Voilà une série d'articles en F# sur le sujet, le premier commence par les listes :

    La différence est seulement dans le fait que l'on ne réduit pas une liste et un arbre de la même façon.

    P.S : tu as raison pour le code du fold_list : si elle est vide on renvoie une exception (ou None si on veut renvoyer un type 'a option) ou alors on passe par des listes qui ne peuvent être vides comme type 'a coll = End of 'a | Cons of 'a * 'a coll — les arbres étant garantis d'être non vides par construction.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Exemple judicieux ?

    Posté par  . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 2.

    Pour que ce soit peut être plus clair, je mets le code dans le cas de listes et dans celui des arbres binaires. Essayes de voir en quoi il se ressemble dans la forme.

    type 'a list = Nil | Cons of 'a * 'a list
    type 'a tree = Leaf of 'a | Node of 'a tree * 'a tree
    
    let rec fold_list f g = function
      | Nil -> f
      | Cons (x, xs) -> g x (fold_list f g xs);;
    val fold_list : 'a -> ('b -> 'a -> 'a) -> 'b list -> 'a = <fun>
    
    let rec fold_tree f g = function
      | Leaf i -> f i
      | Node (l, r) -> g (fold_tree f g l) (fold_tree f g r);;
    val fold_tree : ('a -> 'b) -> ('b -> 'b -> 'b) -> 'a tree -> 'b = <fun>

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Exemple judicieux ?

    Posté par  . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 1. Dernière modification le 16 septembre 2016 à 23:58.

    Mon propos est qu'il est d'usage d'appeler la première version fold. Si j'avais l'habitude de sommer les feuilles de mon arbres avec fold (+) zero tree vous me demandez maintenant de l'écrire zero + (fold (+) (fun x -> x) tree). Alors ok ça fait la même chose mais en l'utilisant différemment. Je dis simplement que je trouves cela perturbant…

    Non, tu n'a toujours pas compris. Il n'y a pas de zero dans le cas des arbres ! C'est la fonction f qui joue le rôle de cette constante que l'on fournit dans le cas des fold sur les listes : c'est bien plus fonctionnel que ce à quoi tu veux réduire le fold. Tu cherches à le réduire au cas où la graine est une constante, et on te dit que comme on est dans un langage fonctionnel cela peut aussi être une fonction. C'est pour cela que c'est une généralisation du cas sur les listes.

    Une liste à pour type : type 'a list = Nil | Cons of 'a * 'a list, ce sont des listes chaînées. Quand on parcourt une liste on termine toujours sur Nil et c'est la qu'on utilise la graine. Dans un langage impératif ce serait la gestion du cas où l'on tombe sur un pointeur null. Dans le cas des arbres, en bout de parcours on tombe sur une feuille qui contient un int et alors on applique une fonction. Le principe est identique mais généralisé.

    Comme te l'as dit Aluminium95 :

    Que fait un fold sur une liste ?

    • Il commence avec une graine : le paramètre f dans le code du journal
    • Il accumule des valeurs : le paramètre g dans le code du journal

    Il n'y a que toi que cela perturbe, tu es la première personne que je rencontre qui voit là un problème.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Retour d'expérience sur la première session

    Posté par  . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 2.

    Tu veux prendre de l'avance :-p ?

    Oh non, je ne pense pas m'inscrire à la formation, je n'ai pas besoin d'être initié à la programmation fonctionnelle. ;-)

    Mon premier projet en OCaml (et mon seul d'ailleurs, je ne suis pas développeur) consistait à implémenter un EDSL d'arithmétique transfinie, et ma machine était sous Windows 98. Même si je ne programme plus, ou peu, cela m'a permis de comprendre véritablement le problème de l'arrêt et pourquoi l'hypothèse du continu de Cantor était indécidable.

    Je suis dans une position inverse de la tienne, en tant que mathématicien c'est plutôt les paradigmes impératif et orienté objet qui me semble difficile à comprendre par moment. Quand je lis du code dans ces paradigmes, j'ai souvent l'impression de tomber sur la comptine des neufs divisions

    Division par 1 :

    • Pas besoin de diviser. (1 étant le nombre élémentaire, la division n’est pas nécessaire). La méthode n’est pas définie.

    Division par 2 :

    • 2, 1, augmente-le pour obtenir 5.
    • Si tu rencontres 2, avance 10.

    Division par 3 :

    • 3, 1, 31.
    • 3, 2, 62.
    • Si tu rencontres 3, avance 10.

    Division par 4 :

    • 4, 1, 22.
    • 4, 2, augmente-le pour obtenir 5.
    • 4, 3, 72.
    • Si tu rencontres 4, avance 10.

    Division par 5 :

    • 5, 1, double-le pour obtenir 2.
    • 5, 2, double-le pour obtenir 4.
    • 5, 3, double-le pour obtenir 6.
    • 5, 4, double-le pour obtenir 8.
    • Si tu rencontres 5, avance 10.

    Division par 6 :

    • 6, 1, ajoute 4 en dessous.
    • 6, 2, 32.
    • 6, 3, augmente-le pour obtenir 5.
    • 6, 4, 64.
    • 6, 5, 82.
    • Si tu rencontres 6, avance 10.

    Division par 7 :

    • 7, 1, ajoute 3 en dessous.
    • 7, 2, ajoute 6 en dessous.
    • 7, 3, 42.
    • 7, 4, 55.
    • 7, 5, 71.
    • 7, 6, 84.
    • Si tu rencontres 7, avance 10.

    Division par 8 :

    • 8, 1, ajoute 2 en dessous.
    • 8, 2, ajoute 4 en dessous.
    • 8, 3, ajoute 6 en dessous.
    • 8, 4, augmente-le pour obtenir 5.
    • 8, 5, 62.
    • 8, 6, 74.
    • 8, 7, 86.
    • Si tu rencontres 8, avance 10.

    Division par 9 :

    • Pour diviser par 9, suis la tige actuelle en dessous.
    • Si tu rencontres 9, avance 10.

    Celui qui comprend cela à la première lecture, et en quoi cet algorithme implémente la division en arithmétique et est correct… je lui tire mon chapeau. ;-)

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Retour d'expérience sur la première session

    Posté par  . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 2.

    Enfin, à un moment, on préfère quand même éditer son code dans un vrai éditeur, surtout pour le projet final.

    Justement à ce sujet, pourrais-tu nous dire en quoi consiste précisément ce projet final ?

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Exemple judicieux ?

    Posté par  . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 1.

    Dans toutes la littérature que j'ai pu lire, j'ai toujours rencontré l'usage de l'appellation générique fold. Alors je l'ai reprise.

    Déjà, dans la bibliothèque standard OCaml, dans le module List on en trouve au moins deux exemplaires :

    List.fold_left;;
    - : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
    
    List.fold_right;;
    - : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b = <fun>

    Peut être que cela te donnera une idée de ce que l'on entend par ordre de parcours : de gauche à droite, ou de droite à gauche dans le cas des listes avec les fonctions au-dessus.

    Pour les arbres binaires, la fonction que j'ai codé est un parcours en profondeur qui commence par explorer le sous-arbre gauche.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

  • [^] # Re: Puisqu'on parle de grammaire ...

    Posté par  . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 1.

    Merci.

    Je me suis dit qu'ils étaient effectivement peut être passés inaperçus, et qu'en répondant à un de tes messages tu en serais informé. J'avais vu juste.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.