|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : mai 2011 Messages : 10 ![]() |
J'ai commencé à peine 1 semaine avec Coq. Je dois établir des preuves pour prouver l'équivalence deux notions.
Code :
Code :
Code :
Lemma sortedEq : forall l, sorted_i l <-> sorted_d l. pour découper l'équivalence, et puis monter les introductions. Mais ensuite, je me suis bloqué car je n'ai aucune idée pour quel tactique sur quel truc à applique. J'ai essayé avec Coq l'a monté comme un sorted_d : nat en haut et laisse en bas le corps de sorted_d. Mais après, vraiment, je suis perdu. Quelqu'un pourrait me donner un coup de main? |
||||
|
|
00
|
|
|
#2 | |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 512 ![]() |
Quand on a une propriété construite de façon inductive, généralement (ma connaissance de Coq est très très superficielle et très empirique) on la détruit avec induction.
induction l Après on doit prouver le lemme pour le cas de base sorted_i_nil puis pour le cas inductif sorted_i_cons. Après, je dis ça je dis rien hein, si c'est pas ça alors c'est autre chose, va savoir quoi Citation:
Quand tu sens que tu es allé dans une impasse tu peux annuler la(les) dernière(s) commande(s) avec Undo.
__________________
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. |
|
|
10
|
|
|
#3 | ||||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 961 ![]() |
tu connais forcément replace
connais-tu la commande unfold ? http://coq.inria.fr/V8.1/tutorial.html selon moi, il te faudra aussi inversion http://coq.inria.fr/refman/Reference...013.html#toc75 et prouver Code :
au passage es-tu sûr de sorted_d ? je verrais plutôt ceci : Code :
penses aussi à regarder le_refl dans Coq.Arith.Le |
||||
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 961 ![]() |
pour infos, j'ai essayé de la faire en entier... et je suis tombé sur un point non constructible :'(
mais peut-être y a-t-il une autre manière de procéder... je ne suis pas expert en Coq
|
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Le problème ici est un problème de bibliothèques. Les spécifications utilisent d'une part "nth_error" et de l'autre "In", mais évidemment dans la lib standard de Coq il n'y a rien de déjà prêt sur le lien entre "nth_error" et "In", il faut faire à la main le lien entre "nth_error" et "nth", ce qui est très pénible (parce que "nth" est laid pour commencer), et ensuite passer de "In" à "nth". Ou alors faire directement la preuve soi-même.
Mais bref tout ça c'est réimplémenter un petit bout de la bibliothèque standard, et ça n'a rien à avoir avec le domaine qui nous concerne qui est de parler de listes triées. gorgonite > ton ajout de "l = nil \/" n'est pas nécessaire puisque `sorted_d` est vraie en particulier pour une liste vide. Je n'ai pas essayé donc je ne sais pas pour la constructivité, mais à priori c'est plutôt une question de comment les définitions sont posées. Normalement comme les deux listes sont finies on doit pouvoir tout faire constructivement. |
|
|
00
|
|
|
#6 | ||||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 961 ![]() |
Citation:
Citation:
justement c'est cela que j'ai essayé... et je suis tombé sur un problème de constructivité, mais il y a peut-être une manière plus subtile EDIT: en gros, une fois que je prouve ce lemme, je m'en sors... mais je n'y arrive pas ![]() Code :
|
||||
|
|
00
|
|
|
#7 | |||||||||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Non, c'est toi qui est obsédé par la constructivité. Si tu veux juste raisonner comme d'habitude sans te prendre la tête, tu ajoutes le tiers exclu, on en a déjà parlé, c'est consistent, c'est prévu par la bibliothèque standard (qui apporte des tactiques de raisonnement classique), etc. Sur ce point ton raisonnement n'est pas rationnel.
(Par ailleurs si tu t'intéresses à Isabelle/HOL c'est très bien, hein, il faut avoir une vision un peu large et essayer des alternatives; je veux bien croire qu'Isabelle/HOL soit plus agréable à utiliser que Coq, je n'en sais rien malheureusement, je n'ai pas encore essayé ces outils. Mais l'argument n'est pas "bouh on n'a pas le tiers exclu".) Citation:
Code :
On a alors l'hypothèse ("error" veut dire None ici, c'est son nom dans la monade d'exception) : Citation:
Code :
Citation:
Cependant, ici, si tu as envie de faire ton puriste constructiviste, et c'est intéressant aussi, tu vois que la preuve qu'on te demande repose fondamentalement sur un objet fini. Tu as une liste "l" finie et tu veux montrer que si une condition décidable est vraie, alors une autre condition décidable est vraie. Il n'y a rien de non-constructif là-dedans, et un bon moyen de ne pas avoir d'ennui et de raisonner sur la liste qu'on sait finie. Code :
|
|||||||||
|
|
10
|
|
|
#8 | ||||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 961 ![]() |
Citation:
l'argument serait plutôt... quand j'ai besoin de quelque chose, y a sûrement le système logique ad-hoc déjà tout prêt à utiliser Citation:
![]() Citation:
Citation:
![]() en tout cas, tu utilises des tactiques de plus haut niveau que moi, ce qui raccourcit considérablement les preuves. il faut avouer que je me sers juste des bases... c'est carrément pas mon domaine (je suis plus dans l'interprétation abstraite et l'exécution symbolique )ok ce n'était pas l'exercice ici, mais aurais-tu un lien qui montre cet alourdissement ? |
||||
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Code :
|
||
|
|
00
|
|
|
#10 | ||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 961 ![]() |
au fait minhkhue, où en es-tu ?
parce qu'on parle (j'ai un peu fait digressé le sujet), mais on ne sait pas si de ton côté ça avance ? as-tu au moins compris où allait servir nth_not_error_impl_In ? en gros, à un moment, avec les tactiques que je t'ai citées (bluestorm ferait sûrement mieux en moins de ligne mais bon ), tu vas arriver à un stade de ce style:Code :
dis-nous où tu en es... |
||
|
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
PS : je suis flatté d'entendre dire de mon code Coq "il utilise des techniques avancées, moi je fais avec les outils de base", parce que c'est ce que je passe mon temps à me dire du code *des autres*. Comme quoi tout est une question de point de vue :p
Je ne l'ai pas fait dans le code de mon développement ci-dessus, car c'était juste un petit hack temporaire pour vérifier (et de préférence contredire hein, sinon c'est pas drôle) ce que disait gorgonite, mais j'encourage l'utilisation des macros "Case", que je tire du cours Software Foundations de Benjamin Pierce (c'est LE document pour apprendre Coq par la pratique, avec le Coq'Art éventuellement si vous avez la chance d'avoir une copie papier). La définition des macros en question est ici, et ça s'utilise comme ça : Code :
|
||
|
|
00
|
|
|
#12 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 961 ![]() |
Citation:
|
|
|
|
00
|
|
|
#13 | ||||
|
Membre chevronné
![]() Inscription : mars 2010 Messages : 281 ![]() |
Citation:
Code :
Citation:
Dans toutes les preuves que j'ai faites, la constructivité n'a pour ainsi dire jamais été un problème. Les seuls axiomes dont j'ai eu besoin, ça a été extensionnalité et proof irrelevence. Je veux bien que tu me cites des "vrais" problèmes... |
||||
|
|
00
|
|
|
#14 |
|
Membre chevronné
![]() Inscription : mars 2010 Messages : 281 ![]() |
|
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
D'ailleurs TropMDR je me souviens être tombé il y a quelques temps sur une page assez cool liée à Software Foundations, des gens avaient codé une variante de "coqdoc" telle que quand on passe la souris sur la preuve, à côté tu as les buts qui défilent selon la tactique sur laquelle tu es. Malheureusement j'ai cherché à retrouver cette démo récemment, et pas moyen.... Si jamais tu as un lien, ça m'intéresse.
|
|
|
00
|
|
|
#16 |
|
Membre chevronné
![]() Inscription : mars 2010 Messages : 281 ![]() |
Proof general 4 fait ça. Pour le reste, je ne sais pas !
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com