|
Publicité ' | ||||||||||||||||||||||||
|
|
#121 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Très bien. Dans ce cas, je ne vais pas attendre plus longtemps pour donner la réponse à la question 24, qui est de toute façon une question un peu particulière. Je signale tout de suite que dans le point de vue que je développe ici je suis arrivé aux même conclusions que celles qui ont été exposées par Steki-kun concernant Coq. Pour cela j'ai deux arguments, et je vais exposer le premier plus loin.
La réponse est donc ``non'' pour la question 24, c'est à dire ``non en général'', mais pas forcément non dans tous les cas. En effet si a est tout simplement identique à b (disons alpha-equivalent), il est bien clair que W(E[ a/x ]) et W(E[ b/x ]) sont le même type et donc que c est bien un terme de type W(E[ b/x ]). Mais en général la réponse est ``non'', tout simplement parce que les règles de ce système ne donnent aucun moyen d'identifier les deux types. Si on parcourt le fil, on verra que le seul endroit où on énonce une égalité entre types est la règle dite ``Sémantique de Heyting'' qui identifie W(?x:T E) avec (x:T) -> W(E). C'est clairement insuffisant pour pouvoir répondre ``oui'' à la question 24. Voyons maintenant les deux arguments évoqués plus haut. Le premier est très simple. Si E=F entrainait W(E) = W(F) alors pour tout énoncé E, démontrable (donc égal à vrai par un axiome d'extentionalité que je n'ai pas encore évoqué; I'm sorry !), toute preuve de vrai serait aussi une preuve de E. Comme il existe une preuve triviale de vrai (on l'a vue plus haut), cette preuve triviale serait une preuve de tout énoncé démontrable. En soi, ce n'est sans doute pas contradictoire, mais on voit bien que vérifier que notre preuve triviale de vrai est une preuve de E revient à rechercher une preuve de E, et donc qu'un compilateur devient incapable de vérifier les preuves. Par ailleurs, le fait d'identifier W(E[ a/x ]) et W(E[ b/x ]) quand a et b ont la même forme normale rend un appréciable service. Cela nous évite d'avoir à écrire des preuves pour le cas où a=b résulte d'un simple calcul. Enorme simplification pour l'utilisation du système. En fait, si on procédait pas ainsi, chaque règle de calcul devrait faire l'objet d'un axiome. En d'autres termes, il faudrait ``Hilbertiser'' le système, ce qui le rendrait beaucoup moins maniable. L'écriture des preuves serait un vrai cauchemar. L'autre argument vient de la Théorie des Topos. L'exposer requiert pas mal de préliminaires. Il n'est pas exclu que je le fasse, mais sans doute pas dans un post, plutôt dans un document séparé.
__________________
Ma page maths. |
|
|
00
|
|
|
#122 | |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Citation:
Mais une somme? c'est juste une juxtaposition des éléments? Et pourquoi, pour le type booléen, ne pas prendre un type à deux éléments? Bfaux = *+One et Bvrai = One+* Bvrai et Bfaux sont donc des termes (d'après le résumé)? Si je comprend bien, Bfaux correspond à l'élément du premier One, plus n'importe lequel du second One (donc soit aucun, soit le seul élément de ce One)? Il faudrait trouver un truc tel que: f(Bfaux) => ?q:O q f(Bvrai) => ?q:O ?x:W(q) q Mais euh... |
|
|
|
00
|
|
|
#123 |
|
Membre confirmé
![]() |
Salut ta confusion vient du fait que tu n'as pas compris ce qu'est un type somme en maths. Tu connais le produit cartésien de deux ensembles A et B, qui consiste à prendre l'ensemble des couplets (a,b) où a est dans A, et b est dans B : il correspond qque part à la conjonction de A et B.
Et de même que la conjonction a un opérateur logique dual, la disjonction, eh bien le produit cartésien a comme opérateur dual la somme d'ensembles, que l'on peut définir comme suit : A + B = {(a,1) | a dans A} U {(b,2) | b dans B} Autrement dit, c'est l'ensemble qui comprend d'un côté les éléments de A, et de l'autre les éléments de B. Je dis bien "d'un côté .... et de l'autre", car cette opération est différente de l'union traditionnelle ! Dans le cas d'une union, les éléments qui sont à la fois dans A et dans B seraient "fusionnés" dans A U B. Ici, on tagge les valeurs qui viennent de A avec un 1, et celles qui viennent de B avec un 2, comme ça même si A et B ont des éléments en commun, la somme A + B réalise bien une union disjointe des deux ensembles A et B. Maintenant, quand tu fais la somme A+B, tu disposes des "injections canoniques" inj1 et inj2 qui sont des fonctions respectivement de A -> A+B et de B -> A+B telles que : pour tout a dans A, inj1(a) = (a,1) ; pour tout b dans B, inj2(b) = (b,2). Note que dans ma définition et dans mes injections, j'ai mis 1 et 2 pour tagger les éléments qui proviennent du premier opérande et ceux qui proviennent du second, mais j'aurais pu mettre n'importe quoi, et en particulier l'autre ensemble. C'est ce que fait le docteur Topos en écrivant :
Edit : si tu vois le produit comme une structure C, alors tu peux voir la somme comme une union C
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
|
|
00
|
|
|
#124 | ||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Citation:
Citation:
Oui, c'est exactement ce qu'il faut faire, et bien sûr l'écrire sous forme d'un terme bien typé.
__________________
Ma page maths. |
||
|
|
00
|
|
|
#125 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Bon on a encore posté presque en même temps. Si j'avais lu ton post, je n'aurai sans doute pas écrit le mien de cette façon. Ce n'est pas grave bien sûr.
Là je ne suis pas d'accord. La structure du C est bien un produit, mais l'union du C est très loin d'être une somme. Comme il se fait tard et qu'il me reste moins de 6 heures pour dormir, je développerai cette question dans la semaine. Bonne nuit à tous.
__________________
Ma page maths. |
|
|
00
|
|
|
#126 | ||
|
Membre confirmé
![]() |
Citation:
Citation:
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
||
|
|
00
|
|
|
#127 | |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Citation:
Bfaux:Boole |-> q:O |-> q et Bvrai:Boole |-> q:O |-> x:W(q) |-> q Pour aller plus loin, il faudrait utiliser un genre de projection (p1 et p2)? |
|
|
|
00
|
|
|
#128 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Si tu utilises Bfaux comme variable locale, il n'a plus rien à voir avec le Bfaux défini dans le post #117. Indication: il faut utiliser la règle D2 du résumé (et non pas des projections).
__________________
Ma page maths. |
|
|
00
|
|
|
#129 | |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
La règle D2! Justement celle que j'ai le moins compris
![]() Citation:
Γ(x:T) C'est un contexte augmenté d'un élément? Effectivement dans la définition T+U fait partie de Γ, mais T n'en fait pas nécessairement partie. Ou alors c'est un ensemble de types dans lequel on s'autorise une variable dépendants de type T... Que signifie la règle D2? Elle permet de sélectionner E ou F (ou un peu des deux) selon le "a" qu'on met? Dans notre cas, ça donnerais: si on pose T=U=One et V=O (pourquoi pas!): [*+One > q:O, One+*> p:O] (a:Boole) avec q=?r:O r et p=?r:O ?x:W(r) r Pour se rapprocher du résulat... |
|
|
|
00
|
|
|
#130 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Je vais revenir sur la question des sommes dans un prochain post. Je donnerai des explications détaillées.
C'est une succession de déclarations. Les contextes sont construits récursivements par les règles Γ1 et Γ2. Ils permettent d'utiliser les symboles qui y sont déclarés. Cette utilisation est régie par les règles S1 et S2. Syntax error: dans une expression de la forme [x > E, y > F](a), x et y doivent être des symboles. Petite indication: comme indiqué dans le résumé, le terme [x > E, y > F](a) est une conditionnelle. Ce terme se lit comme suit: ``si a provient d'un x de T, alors E, et s'il provient d'un y de U, alors F''. Bien entendu, E peut faire usage de x, puisqu'il a un sens dans le contexte Γ(x:T). De même, F peut faire usage de y. Ces notions relatives au contextes sont très habituelles et existent (nécessairement) dans tous les langages qui font usage de variables. Ce qui est dit ici sur les contextes n'a rien d'original.
__________________
Ma page maths. |
|
|
00
|
|
|
#131 |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Je comprend mieux ce qu'est un contexte. J'aurais du percuter plus tôt, c'est comme un contexte en C par exemple (avec les notions de porté et de visibilité)... Je vais vraiment chercher 12h à 14h...
Sinon est-ce que je suis parti dans la bonne direction avec mon p, q:O et mon a:Boole? |
|
|
00
|
|
|
#132 | |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Citation:
(a:Boole) |-> [x > faux, y > vrai](a) qui est bien de type Boole -> O, et où faux et vrai sont bien sûr respectivement ?q:O q et ?q:O ?x:W(q) q. Je te laisses nous faire le type-checking de ce terme (qui consiste tout simplement à bien comprendre comment on applique la règle D2). Remarque: On peut se demander pourquoi j'ai adopté la notation tordue [x > E, y > F](a) pour les conditionnelles, qui auraient peut-être été mieux représentées par: if a is x+One then E, One+y then F c'est à dire en y mettant le sucre syntaxique usuel. La raison est que la notation [x > E, y > F](a) est celle que m'inspire la théorie des catégories. J'expliquerai cela plus loin dans le post que je consacrerai aux somme. Cette notation permet (via quelque chose qui ressemble à une eta-réduction) de considérer [x > E, y > F] comme une fonction de T+U vers le type commun à E et F. Ceci fait que le terme qui est la solution de la question 25 pourrait aussi s'écrire plus simplement: [x > faux, y > vrai] C'est sous cette forme que les conditionnelles apparaîssent en théorie des catégories (dans le problème universel qui définit les sommes), et non pas sous une forme comprenant aussi l'argument a.
__________________
Ma page maths. |
|
|
|
00
|
|
|
#133 |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
C'est vrai que la notation [x > E, y > F](a) m'a beaucoup perturbé, surtout parceque on dirait qu'on compare 2 choses de types différents avec le symbole ">".
Ce qui m'embète encore c'est qu'on utilise des variables x et y sans les déclarer... Il est implicite que x est du premier type de la somme et y du second? Dans notre cas, E n'utilise pas d'occurence de x et de même pour F, rassure moi? Merci pour ta patience en tout cas |
|
|
00
|
|
|
#134 | |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Je regarde la
Citation:
Si c'est le cas je dirais intuitivement (a:Boole) |-> [x > vrai, y > faux](a) En inversant vrai et faux. On voit bien qu'on aura toujours f|~f pour toute valeur booléene. Si c'est f-1, elle est du type O -> Boole. J'imagine qu'il faut utiliser les "inclusions canoniques” (Règle C2). Je reposte le lien du résumé: résumé |
|
|
|
00
|
|
|
#135 | |||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Citation:
Citation:
Citation:
C'est bien de cela qu'il s'agit.
__________________
Ma page maths. |
|||
|
|
00
|
|
|
#136 |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Pour le question 26 il faut utiliser une conditionnelle aussi?
On pourrait construire le type somme des propositions vrai et des propositions fausses. A cause du tiers exclus, ce type somme = O. On peut donc écrire une conditionnelle [x > *+One, y > One+*]... |
|
|
00
|
|
|
#137 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Non, on ne peut pas écrire ceci, car O n'est pas une somme.
__________________
Ma page maths. |
|
|
00
|
|
|
#138 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Je viens de m'apercevoir que la question 26 était prématurée. J'aurais dû vérifier la solution avant de poser la question. Mea culpa !
On commence par définir !1x:T E (lire: ``il existe un unique x dans T tel que E'') comme une abbréviation pour: !x:T (E & ?y:T E[ y/x ] => x = y) (où y est une variable fraîche c'est à dire distincte de x et non utilisée dans T ni dans E). Cet énoncé parle de lui-même: il affirme l'existence d'un x de T ayant la propriété E et ajoute que si un autre élément y de T a aussi la propriété E, alors il est égal à x. Autrement-dit il affirme l'existence et l'unicité d'un x de T ayant la propriété E. L'opérateur de description sera noté #. C'est une fonction de type (pour tout type T et tout énoncé E pouvant dépendre d'un x de type T): W(!1x:T E) -> T L'idée est que si p est une preuve de !1x:T E, alors #(p) représente l'unique élément dont l'existence est prouvée par p. Aussi étonnant que cela puisse paraître, cet opérateur est constructif. L'opérateur de description est le destructeur que j'avais anoncé pour les types de témoins depuis le début de ce fil (post #16). Ce destructeur a un compagnon qu'on va noter ## qui est de type: W(!1x:T E) -> W(E[ #(p)/x ]) Autrement-dit, ##(p) prouve que #(p) a la propriété E. Note: # et ## sont les deux projections pour les paires de Heyting qui correspondent à un cas où il y a unicité. J'en profite pour poser une question à propos de cet opérateur. Question 28. Soit T un type, et E un énoncé pouvant dépendre de x de type T. Trouver un terme de type: W(?p:W(!1x:T E) ?y:T E[ y/x ] => y = #(p))
__________________
Ma page maths. |
|
|
00
|
|
|
#139 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Bonjour à tous.
Voici les explications promises sur les sommes de types (et sur les produits de types par la même occasion). Commençons par une notion qui doit être familière aux informaticiens, celle de graphe. Un graphe (orienté) est composé de deux sortes de choses:
qui représente un graphe avec seulement deux sommets A et B et une seule arête a, dont la source est A et dont le but est B. Une catégorie n'est rien d'autre qu'un graphe ayant des propriétés particulières. Ces propriétés sont les suivantes:
L'exemple le plus classique de catégorie est celle des ensembles. Les objets sont tous les ensembles et les flèches sont toutes les applications entre ensembles. Celle qui nous intéresse plus précisément ici est la catégorie des types et des programmes. Les objets sont les types et les flèches du type T vers le type U sont les progammes (disons les fonctions) prenant un argument de type T et renvoyant une donnée de type U. Il est clair qu'il s'agit d'une catégorie. Une autre catégorie intéressante est celle des énoncés et des démonstrations (le tout dans un contexte donné). Ici on ne considère que les démonstrations ayant une seule hypothèse (la source de la flèche) et une seule conclusion (le but de la flèche). On considérera deux démonstrations de même source et même but comme égales (proof-irrelevance). Un objet final dans une catégorie est un objet F qui a la propriété suivante:
Je vous laisse vous assurer vous-même que tout singleton est un objet final dans la catégorie des ensembles, que le type One est un objet final dans la catégorie des types et que l'énoncé vrai est un objet final dans celle des énoncés. Un objet initial dans une catégorie est un objet I tel que:
Je vous laisse vous assurer que l'ensemble vide est initial dans la catégorie des ensembles, que le type Empty (voir le résumé) est initial dans la catégorie des types, et que l'énoncé faux est initial dans celle des énoncés. On aura remarqué la symétrie entre les notions d'objet final et d'objet initial, symétrie qui consiste tout simplmeent à renverser le sens des flèches. C'est ce qu'on appelle la dualité catégorique. Un isomorphisme dans une catégorie est une flèche A --- f ---> B telle qu'il existe une flèche B --- g ---> A (appelée l'inverse de f) telle que f o g = 1 et g o f = 1. Exercice: Montrer que si F1 et F2 sont tous les deux finals dans une catégorie, alors il existe un unique isomorphisme entre eux. Même chose pour deux objets initiaux. Il résulte de l'exercice ci-dessus que le fait de déclarer qu'un objet est final dans une catégorie, même si cela n'implique par l'existence de cet objet, le définit néanmoins parfaitement à isomorphisme unique près. Par exemple, le fait d'être final dans la catégorie des ensembles caractérise les singletons, qui sont tous isomorphes d'une unique façon. La caractérisation comme objet final ou initial dans une catégorie appropriée est donc une méthode pour définir des concepts. Ceci n'a l'air de rien, mais ça a révolutionné les mathématiques, et les informaticiens théoriciens en font aussi grand usage. Il faut remarquer plusieurs choses très importantes:
Cette philosophie de la définition peut être qualifiée de behavioriste (en Français: comportementaliste) puisqu'elle définit les objets non pas en les construisant, mais en disant comment ils se comportent par rapport à tous les autres objets de même nature. Suite dans un prochain post. Help ! J'aimerais include des diagrammes dans mes posts pour illustrer ces explications. Je sais faire de très jolis PDF avec des diagrammes en utilisant LaTeX+xypic+dvipdfm, mais j'ai du mal à les convertir en images (par exemple PNG). J'ai essayé avec Gimp, mais le résultat est pratiquement illisible (je n'arrive pas à trouver des réglages corrects). Quelqu'un connaîtrait-il un outil pratique et facile d'emploi. Je suis sous Linux Ubuntu.
__________________
Ma page maths. |
|
|
00
|
|
|
#140 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
En même temps pourquoi refaire ce que vous avez déjà fait ?
Les diagrammes correspondants (et plus encore) sont disponibles par le lien Ma page maths de votre signature, et si ma mémoire est bonne votre Leçon 2: Catégories bicartésiennes traite justement de ce sujet, de façon au moins aussi claire, avec les diagrammes et les égalités appropriées. Le diagramme ci-dessous représente la catégorie:
![]() c'est une simple copie d'écran Avec F = {a,b,c,d} on aurait sans doute un joli hyper-cube.
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
|
00
|
Copyright © 2000-2013 - www.developpez.com