|
Publicité ' | ||||||||||||||||||||||||
|
|
#81 | |||
|
Membre confirmé
![]() |
Citation:
Alors, la réponse courte : ce terme est bien typé et c'est une preuve de !x:T.?y:U.E => ?y:U.!x:T.E, en d'autres termes la permutation des deux quantificateurs. La réponse longue : on suppose une preuve p du fait qu'il existe un x de type T tel que pour tout y de type U, E(implictement de x,y) est vrai. On suppose également un élément y de type U. Avec tout ça, on sent bien qu'on va montrer qu'il existe un x tel que E est vrai (avec le y supposé, qui n'est plus libre, donc je devrais écrire E[y/y] en toute rigueur, mais bon...). En d'autre termes, on va construire une preuve de !x:T.E. Alors en maths, c'est facile, on dirait Citation:
Ca se traduit bien par le fait que le terme de la question commence précisément par p(!x:T.E), donc par l'utilisation de l'hypothèse existentiellement quantifiée p pour établir !x:T.E. Là, pas besoin de comprendre le reste, on sait déjà que si le terme est bien typé il aura ce type là (ou tout du moins un suffixe commun, si jamais le machiavélique DrT. l'appliquait à son tour à une nouvelle proposition q, etc etc). Mais vérifions quand même la suite Citation:
Voilà j'ai essayé d'être didactique comme ça si je me suis trompé on m'en voudra moins et merci à ceux qui auront lu jusqu'en bas
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
|||
|
|
00
|
|
|
#82 | ||||||||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Bonjour à tous.
Pour une raison que j'ignore, je ne reçois plus les mails automatiques concernant cette discussion à laquelle je suis pourtant abonné. Je viens donc tout juste de découvrir les 3 derniers messages (grâce à un mail envoyé par l'un des participants). Je me réjouis évidemment du rédémarrage de ce fil. J'ai cru qu'il était devenu trop abstrait, mais je vois qu'il n'en est rien. Citation:
Citation:
Code :
Citation:
Citation:
Citation:
Citation:
La raison pour laquelle j'ai posé la question 14 est que la solution qui avait été donnée pour la question 12 ne faisait pas usage des paires de Heyting. Le terme de la question 14 est une solution de la question 12 en faisant usage. Je vais bien sûr poser de nouvelles questions sous peu.
__________________
Ma page maths. |
||||||||
|
|
00
|
|
|
#83 |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Salut à tous,
Je me passionne pour ce fils. Mais j'avoue que depuis la page 3-4, j'ai décroché et je n'arrive plus à raccrocher Je n'ai plus trop l'habitude des maths, donc il m'a fallut relire relire plusieurs fois les 4 premières pages, pour tout assimiler Je suis aussi novice en langages fonctionnels, ce qui n'arrange sans doutes pas les choses. La preuve de programmes, je trouve ça passionnant, et ce fils m'a aidé à y toucher un peu du doigt (ainsi qu'un autre fils ouvert par DrTopos, [Fondements] Preuve de programme: utopie ou réalité ?) Mais pour l'instant, je manque encore d'exemples concrets: Par exemple comment prouver dans mon programme qu'une division par zero n'arrivera pas? Ou est écrit la preuve? juste après la division? Dans une zone réservés aux preuves? Que fait la preuve? Elle référence les identifiants de la "partie programme" pour prouver des propriétés de ceux-ci? Pourrait-on avoir un exemple simple en psoeudo-langage? Ce fils va vite (pour moi) et est devenu assez abstrait.. Ce qui serait sympa, ce serait d'avoir plus d'exemples dans la vie courante, comme dans ton post #67 DrTopos. Je vote aussi pour un petit récapitulatif pour brosser une image complète à ce stade En plus du lexique donné au post #2. Par exemple, j'ai zappé ce qu'était les paires de Heyting. Voila, j'espère que toutes ces demandes ne vous paraîtrons pas abusives. Et encore bravo pour ce fils didactique et instructif. |
|
|
00
|
|
|
#84 | |||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Citation:
Citation:
Citation:
Par contre, l'idée du récapitulatif est excellente. Il facilitera sans aucun doute la prise du train en marche, et devrait permettre à certains de participer alors qu'ils ont probablement renoncé à décrypter toutes les interventions. Je vais m'y coller sous quelques jours. Merci bien.
__________________
Ma page maths. |
|||
|
|
00
|
|
|
#85 | |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Citation:
Une question ma turlupine quand même. Je la pose ici, mais si tu le préfère je la déplace dans l'autre fils, les 2 sujets sont proches: Si je comprend bien, un programme est un énoncé. Dans la cadre d'un refactoring, on obtient un autre programme qui doit être sémantiquement équivalent. La preuve de programme peut-elle nous servir à prouver que les deux programmes sont "égaux"? Ce serait super! Cette preuve peut-elle être automatique? |
|
|
|
00
|
|
|
#86 | ||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Justement non. Ce sont plutôt les preuves qui sont des programmes. Les énoncés s'apparentent à des types. En effet, la donnée de l'énoncé E est équivalente à celle du type W(E). Par contre, les preuves de E (c'est à dire les termes de type W(E)) sont bien des programmes en général, puisque ce sont la plupart du temps des fonctions via la sémantique de Heyting.
D'ailleurs, comme je l'ai dit dans l'un des messages, les données de type O (les énoncés) s'implémentent sur zéro bits, bien que le type O soit loin d'être vide, puisqu'il y a plein d'énoncé. C'est dû à l'absence de destructeur pour le type O. Du fait qu'il n'y a pas de destructeur, un énoncé est inutilisable comme donnée. mais il est utilisable comme type via le W. Citation:
Citation:
Maintenant, évidemment, s'il s'agit non pas de refactoring automatique mais d'évolution, on peut avoir à modifier des preuves qui ne seraient plus correctes, et bien sûr des algorithmes de recherche automatique peuvent être utiles. Mais il ne faut pas en attendre de miracle (encore qu'ils nous étonnent parfois).
__________________
Ma page maths. |
||
|
|
00
|
|
|
#87 |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Je pensais plutôt à un refactoring manuel.
Dans mon métier d'informaticien, on est souvent amené à faire des refactoring, comme par exemple de déplacer des traitements d'un package à l'autre. Les réticences sont grandes, car ça n'apporte pas de nouvelles fonctionnalités, mais il faut quand même tout retester. Si un processus automatique pouvait prendre les 2 programmes et dire "OK, ils sont équivalents", ce serait énorme. Dans le cadre d'un programme où on n'a pas écrit de preuves, c'est possible? Dans le cas où des preuves sont écritent pour le programme, effectivement il doit suffir de porter les preuves pour la nouvelle architecture pour valider à nouveau le programme. |
|
|
00
|
|
|
#88 | |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Citation:
Toutefois, faire un tel logiciel sera de toute façon plus difficile que de faire un programme de refactoring automatique. Je pense donc qu'il vaut mieux abandonner cette idée et se concentrer sur les outils de refactoring automatique (avec éventuellement une part d'interactivité, par exemple pour choisir les noms des symboles).
__________________
Ma page maths. |
|
|
|
00
|
|
|
#89 | |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Effectivement,
un refactoring peut être vu comme une suite d'opérations élémentaires appliquées à un programme. Si ces opérations sont certifiées "invariants sémantiques", elles peuvent être appliquées au programme sans craintes. Citation:
|
|
|
|
00
|
|
|
#90 |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Voici quelques nouvelles questions. Ce ne sont que des classiques du genre, mais utiles pour la suite. La difficulté est variable.
Question 15. Trouver un terme de type W(?q:O (q => ~~q)). Question 16. Trouver un terme de type W(?q:O (~~~q => ~q)). Question 17. Montrer que si on a un terme de type W(?q:O (~~q => q)), alors on peut construire un terme de type W(?q:O (~q | q)), et réciproquement. Question 18. Trouver un terme de type W(?p:O ? q:O ~(p | q) => (~p & ~q)). Question 19. Trouver un terme de type W(?q:O ~~(q | ~q)).
__________________
Ma page maths. |
|
|
00
|
|
|
#91 |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Je tente la question 15. Mes maths sont bien rouillés, mais le ridicule ne tue pas
le type W(?q:O (q => ~~q)) est équivalent à (q:O) -> W( q => ~~q). qui est équivalent à (q:O) -> W( ?x:W(q) ~~q) car q => ~~q peut aussi s'écrire ?x:W(q) ~~q Donc le terme recherché est de type: (q:O) -> ((x:W(q)) -> W(~~q)) Heu comment conclure? Je pourrais dire ~~q équivalent à ((q => Faux) => Faux) soit q Mais je pense qu'il y a un hic. |
|
|
00
|
|
|
#92 | |||||||||||||||
|
Membre confirmé
![]() |
Citation:
Avec le terme Coq correspondant : Code :
Citation:
où Q15 correspond au terme de la question précédente. Avec le code Coq correspondant : Code :
Citation:
(EM : W(?q:O.~~q => q)) |-> (q : O) -> (p : O) -> (Hq : W(q => p)) |-> (Hnq : W(~q => p)) |-> EM p ((nP : W(~p)) |-> (r : O) |-> (aux ~q p Hnq nP (aux q p Hq nP) r)). où aux est un terme qui prouve en gros (A -> B) -> ~B -> ~A, soit la seule partie de la contraposition qui est vraie en logique intuitionniste : (a: O) |-> (b : O) |-> (H : W(a => b)) |-> (H' : W(~b)) |-> (abs : W(a)) |-> (r: O) |-> H' (H abs) r). De la droite vers la gauche, c'est plus simple : (EM : W(?q:O.(q | ~q))) |-> (q: O) |-> (nnq : W(~~q)) |-> EM q ((p : W(q)) |-> p) ((np : W(~q)) |-> nnq np q). Code :
Citation:
(r : O) |-> (Hpqr : W(~P => ~Q => R)) |-> Hpqr ((tp : W(p)) |-> H ((s : 0) |-> (Hp : W(p=>s)) |-> (_ : W(q=>s)) |-> Hp tp)) ((tq : W(q)) |-> H ((s : 0) |-> (_ : W(p=>s)) |-> (Hq : W(q=>s)) |-> Hq tq)) Avec encore une fois le code Coq correspondant : Code :
Citation:
Q18 r q (~q) H ((urd : W(~q)) |-> (abs : W(~~q)) |-> abs urd r). où Q18 est le terme de la question précédente. Code :
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
|||||||||||||||
|
|
00
|
|
|
#93 | |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 64 ![]() |
Steki-kun pourrait-tu m'expliquer:
Citation:
Mais ensuite comment combine tu deux preuves: (abs urd) et comment ça s'applique à une nouvelle énoncé p?? (Et dailleurs les -> ne devrait-il pas être des |->?) Question subsidiaire: Un énoncé peut-il être vu comme une proposition du style "le chat est gris"? Je n'ai pas très bien compris la différence entre signifiant et signifié évoqué plus tôt... KauKau, qui tente desepérément de nager vers la surface... |
|
|
|
00
|
|
|
#94 |
|
Membre confirmé
![]() |
Pour prouver ~~q, il faut prouver que ~q est absurde, ou encore que ~q => Faux.
Or, dans le formalisme du DrTopos (et pas seulement), Faux est en fait défini comme "pour tout P, P". Autrement dit, montrer que qque chose est absurde, ou encore "prouver Faux", revient à prendre n'importe quelle proposition et à la prouver. Donc pour prouver q => ~~q, je suppose q, ~q, et je m'attaque à une preuve de Faux : je prends une proposition quelconque p et je la montre. Pour la montrer, j'applique ma preuve de ~q (ie. q => Faux) à q lui même, ce qui me donne une preuve de Faux, et je l'applique ensuite à p, ce qui me donne une preuve de p. C'est la signification de ce (abs urd) p. J'aurais pu ne pas introduire p et montrer directement Faux en appliquant ~q à q, c'est ce que j'ai fait dans mon script Coq si tu regardes bien. De manière générale, remplacer un terme (x:T) |-> P x par P lorsque x n'apparait pas dans P s'appelle faire une êta-réduction, et tu comprends bien que deux tels termes sont équivalents. Ah oui, pour les flèches, j'ai pas fait gaffe (trop l'habitude de Coq) donc -> ou |->, mais ne te laisse pas décontenancer par ça
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
|
|
00
|
|
|
#95 | |
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Citation:
Un signifiant est de nature syntaxique. C'est une expression dans un langage. Le signifié correspondant est la chose qui est représentée par ce signifiant, autrement-dit son 'sens' ou sa 'signification' ou sa 'sémantique'. Par exemple, un énoncé est un signifiant, puisque c'est une expression du langage (un terme), alors qu'une valeur de vérité est un signifié, puisque c'est ce que représente un énoncé. De même, une preuve est un signifiant (terme de type W(...) par exemple dans ce système), alors qu'un témoin est un signifié puisque c'est ce que la preuve représente.
__________________
Ma page maths. |
|
|
|
00
|
|
|
#96 |
|
Invité(e)
![]() Messages : n/a ![]() |
Puisque Steki-kun se mets aussi à mettre du Coq à droite à gauche, pourrait-on avoir une idée de la puissance de la théorie présentée par rapport au calcul inductif des constructions ?
(Je rappelle au passage que dans celui là, le "pour tout" est un produit dépendant et que "faux" est un type sans constructeur, ce qui pour l'instant me semble globalement être les deux différence notable. J'attends de voir l'arithmétique et ce genre de chose) |
00
|
|
|
#97 | ||||
|
Membre confirmé
![]() |
Ben en ce qui concerne le Faux, les deux présentations sont strictement équivalentes : en fait forall P.P correspond exactement au schéma d'induction associé à un inductif sans constructeur. Autrement dit comme le type est vide, on montre n'importe quoi dès qu'on a un objet de type False sur lequel raisonner par induction.
Ex: Code :
que par Code :
Pour ma part, si je me souviens bien ce que j'ai vu en Master, on est pour l'instant dans un codage du 2nd ordre de la logique intuitionniste du premier ordre : on garde que la construction "quantification existentielle" et on se permet de quantifier sur les Propositions en plus des termes, ce qui permet de redéfinir les autres opérateurs logiques. Au passage, la sorte O est imprédicative puisqu'elle permet d'exprimer des choses sur elle-même. NB : je suis intarissable sur les vertus de Coq donc je me laisse facilement aller mais je veux pas troller le quizz très intéressant du DrTopos donc si tu veux approfondir n'hésite pas à me MP.
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
||||
|
|
00
|
|
|
#98 | ||
|
Membre éclairé
![]() ![]() Inscription : août 2005 Messages : 417 ![]() |
Citation:
En particulier, il y a une question à laquelle je ne parvient pas à répondre clairement concernant Coq. Quand on parcourt la bibliothèque standard, on trouve des théorème démontrant le principe de proof-irrelevance à partir de divers autres principes. Par ailleurs, j'ai vu dans le tutoriel de la version la plus récente que le principe de proof-irrelevance faisait partie des propriétés du système. Donc il y a quelque chose que je ne comprends pas: proof-irrelevance est-il obligatoire ou non en Coq ? C'est probablement une option, un paramétrage du système, autrement-dit il n'y a sans doute pas un système Coq, mais plusieurs. J'aimerais que les spécialistes nous renseignent sur ce point. Citation:
Dans un système comme Martin-Löf, le quantificateur existentiel est la somme indéxée, alias produit dépendant. Le résultat de cette définition, et des autres axiomes du système est que deux preuves de l'énoncé !x:T E réalisées par deux paires de Heyting <a,p> et <b,q> pour lesquelles a est différent de b sont elles-mêmes différentes. C'est rendu obligatoire par le fait que la première projection pour les paires de Heyting est une opération légale qui de plus respecte l'égalité. Ainsi donc ces deux preuves sont différentes, ce qui fait que le système de Martin-Löf est incompatible avec proof-irrelevance. D'après ce que j'ai lu dans le tutoriel Coq, l'obligation de proof-irrelevance est assortie d'une interdiction d'utiliser la première projection pour les paires de Heyting (qui portent un autre nom en Coq, je ne me souviens plus lequel). C'est évidemment indispensable pour conserver la cohérence logique. Donc, mon opinion (à ce jour du moins) est que c'est le fait qu'on puisse ou non travailler sous le régime de proof-irrelevance qui fait la différence (au moins sur le plan de la logique, voir plus loin) entre Coq et le système que j'ai en tête, dans lequel proof-irrelevance sera de toute façon obligatoire. En effet, j'ai expliqué dans mon exposé de Luminy pourquoi ce principe est patent en mathématiques aussi bien classiques qu'intuitionnistes, et pourquoi le fait d'avoir un système qui ne le satisfait pas conduit à des mathématiques exotiques. Je précise que je n'ai rien contre ces mathématiques, mais mon but est de formaliser les mathématiques traditionnelles, pas des mathématiques nouvelles qui ne seraient certainement pas acceptées par les mathématiciens (du fait en particulier que certaines inclusions de sous ensembles dans des ensembles ne sont pas prouvablement injectives). En fait, la grande question à mon avis à propos de tous ces systèmes, sur laquelle tout le monde a travaillé depuis 20 ans, est de trouver un système dans lequel les notions de sous-ensemble et d'ensemble quotient se comportent comme on a l'habitude de les voir se comporter en mathématiques traditionnelles. Ma conclusion est que sans proof-irrelevance, ce n'est pas possible. En conséquence, je comprends que les versions récentes de Coq imposent proof-irrelevance, du moins c'est ce qui apparaît dans le tutoriel. Malgré cela, Coq semble autoriser de très nombreuses variantes de systèmes d'axiomes (si j'en juge par le contenu de la bibliothèque) et reste donc un système très ouvert sur le plan de la logique et donc plutôt difficile à utiliser. Mon but est de faire un système simple, non exotique au sens décrit plus haut (donc satisfaisant obligatoirement proof-irrelevance), et dans lequel l'écriture des preuves ressemble de très près aux textes mathématiques usuels. Sur ce dernier point au moins, on est obligé de reconnaître que l'écriture des preuves en Coq ne ressemble pas du tout à un texte mathématique usuel. J'ai essayé de lire la section consacrée à l'intégrale de Riemann dans la bibilothèque Coq. C'est un véritable supplice, même pour quelqu'un qui connait bien le sujet. Coq est totalement ésotérique, au moins en ce qui concerne l'écriture des preuves, quelques soient ses qualités par ailleurs. Pour cette raison, la plupart des mathématiciens ne voudront jamais l'utiliser. En particulier, il est clairement inutilisable en tant qu'outil pédagogique pour l'enseignement des maths. Il y a donc de la place pour un autre système, et c'est pour cela que je n'ai aucun complexe à essayer d'inventer autre chose. Donc, autant que je puisse en juger, il y a deux différences essentielles: (1) obligation/non obligation de proof-irrelevance, (2) aspect des preuves. Bien entendu, en ce qui concerne (2), le quizz ne permet pas de juger de ce que j'ai en projet, puisque je n'ai pas parlé des preuves ``informelles'' mais seulement des preuves formelles. Les jolies formules, qui comme tu le dis deviennent difficiles à manier, seront générées par le compilateur à partir des preuves informelles. J'aurai sans doute l'occasion de donner quelques éclaircissements sur cette question dans le quizz. Se souvenir aussi qu'à ce point du quizz, je n'ai pas encore donné tous les axiomes du système. Il reste à parler des types récursifs, de l'égalité, des axiomes d'extentionalité (dont proof-irrelevance), du principe de description et de l'axiome du choix (au minimum), si on veut avoir une vision complète du système.
__________________
Ma page maths. |
||
|
|
00
|
|
|
#99 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
perso, lorsqu'on a voulu me présenter la théorie soujacente de Coq, on m'a parlé de logique intuitionniste, calcul des séquents, et seulement ensuite de systèmes de type (système T, Martin-Löf, système F) le poly en question... http://www.lix.polytechnique.fr/~dow...es_types.ps.gz |
|
|
|
00
|
|
|
#100 |
|
Membre confirmé
![]() |
Pour répondre à certaines de vos interrogations Dr T., l'axiome de Proof-irrelevance, ainsi que beaucoup d'autres qui sont parfois plus forts (ie qui l'impliquent) comme l'extensionnalité et le tiers exclu, ne font pas partie de la logique de Coq de base. Cependant, ils ne rendent pas le système inconsistent pour autant et on peut les ajouter sans risque : c'est au choix, et ils se marient assez bien avec la sorte Prop, qui correspond à votre sorte O. Tout ceci est expliqué en détail dans la FAQ Coq sur le site de Coq.
Aussi je ne comprends pas trop la distinction que vous opérez : on peut tout à fait travailler sous le régime de la proof irrelevance dans Coq. J'irais même plus loin, puisque vous voulez faire de 'vraies' maths, alors la logique classique ne serait-elle pas plus naturelle que la logique intuitionniste ? Et avec le tiers-exclu, on peut prouver la proof-irrelevance des propositions dans Prop. Il y a ici une distinction importante dans le système Coq qui est peut être à la source de la confusion : celle entre la sorte Prop et la sorte Set. On peut avoir la proof-irrelevance sur des propositions de Prop c'est à dire : Code :
Pour toute proposition P, toutes preuves p et p' de P, p = p'. Enfin, les scripts Coq sont peu lisibles c'est vrai mais là c'est un autre problème. On ne parle pas à une machine comme on parle à un humain, et c'est un problème des programmes informatiques en général, ils sont toujours moins faciles à comprendre que ce qu'ils font en réalité. Et puis, puisqu'on parle de proof irrelevance, lire un script Coq n'a d'intérêt que pour celui qui a changé son système et doit reprendre la preuve (de la "maintenance de preuve" si l'on veut...), la nature des théorèmes devrait suffire à comprendre de quoi ils parlent, et surtout le bon Coq-eur met les arguments de haut niveau dans des commentaires dans la preuve Maintenant, c'est sûr que je rêve d'un système qui me permettrait de faire des maths comme je fais des maths sur papier, et qui me permettrait aussi de créer des fonctions 'computables' et d'en extraire un programme, mais pour l'instant il n'y a bien que Coq qui réponde à mes besoins.
__________________
I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06 |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com