Une TM qui stoppe ssi ZFC est inconsistant

Bonjour,

petit partage: une machine de Turing avec seulement 748 états (!!!) qui s'arrête si et seulement si ZFC est inconsistant. Vous pouvez même jouer avec !

Réponses

  • Elle s'est arrêtée ! Ah non pardon c'est mon ordi qui bug :-D
  • Il faut 748 état pour juste faire l'instruction STOP ????

    Non, je blague !
  • En même temps je ne blague pas tant que ça.

    Un des deux programmes suivants est le bon :

    A: STOP

    B : LOOP

    et ils donnent chacun une Machine de Turing à 1 état.
  • Merci héhéhé. Dommage qu'ils n'aient pas fait comme moi il y a 10ans, où on affichait l'écran tout entier donc 1000000 de pixels servaient de ruban, et s'exécutait en live sous nos yeux 10000000 d'opérations par seconde.

    Cela dit de mon expérience justement devant ces écrans "reposants", 748 états, ça devient en quelque microsecondes une apparence d'aléatoire.

    En gros, avec l'alphabet $\{0;1\}$, 5 ou 6 états suffisent déjà à rendre l'écran "gris" sans motifs simples qui se dégagent. Alors 748...
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • Bien sûr que c'est vite complètement "aléatoire". Cela dit je trouve ça quand même impressionnant (d'un point de vue de béotien) qu'il ne faille que 748 états, qui est un nombre relativement "petit" et accessible à la compréhension humaine.
  • Je t'assure que c'est beaucoup et dû à la petitesse de l'alphabet (2 lettres 0 et 1). ZFC est une théorie très simple qui peut s'aborder de plein de manières différentes en programmation. Mais faire défiler tous les entiers un par un et vérifier s'il constitue (une fois vu comme suites de lettres) une preuve de $ZFC\vdash \perp$ ne nécessite pas beaucoup de complexité.

    Il suffit pour ça qu'il existe une suite finie $A_1,..,A_n$ d'axiomes de ZFC (logiques comprises) tels que:

    $$A_1 = (A_2\to (A_3\to (\dots (A_{n-1} \to (A_n\to \perp) \dots ))) $$

    or vérifier si une suite de lettres est un axiome de ZFC n'est pas très compliqué. Un axiome de ZFC est TOUJOURS de la forme :

    $$ \forall \dots (\exists a\forall x: \ [(x\in a)\iff (R(x))]) $$

    et en écriture polonaise, il y a donc juste à vérifier si $R$ est "modeste".
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • Décidément, j'ai toujours autant de difficulté à me faire comprendre.

    Théorème : étant donnée une théorie T (comme ZFC), il existe une Machine de Turing à 1 état qui s'arrête si et seulement si
    T est inconsistante (ou n'importe quelle autre propriété)

    Preuve : C'est soit la machine qui n'a pas d'instruction et s'arrête, soit la machine qui boucle sur son état initial.
  • @serge : Moi j'ai compris, t'inquiète (:D
  • Je pense que tout le monde t'avait compris Serge.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • j'ai été compris…youpiiiii !
  • Je rappelle l'ADN de ZF. Mécontents de ne pouvoir avoir $E \supset P(E)$, on a opté par dépit pour $E\supset P(F)$ et $E,F$ indiscernables l'un de l'autre. Toute l'axiomatique scientifique se construit toujours comme ça (vouloir un système puissant, donc qui démontre un max de choses, et vouloir qu'il ne prouve pas 0=1. On est marrant en un certain sens)
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • La boutade de Serge est parfois utilisée pour vendre l'intuitionnisme. Par exemple "il existe un programme P qui affiche oui si la conjecture de Syracuse est vraie et non si elle est fausse"

    Preuve en blanc:
    Si la conjecture de Syracuse est vraie prendre P := print "oui". Sinon prendre P:= print non.
    Cette preuve utilise le tiers exclu.
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • @Foys

    En effet...tout ensemble fini de K énoncés est décidable.

    Il existe un programme parmi les 2^K possibles qui donne la bonne réponse pour chacun d'eux.
    La question est peut-être de savoir lequel ?

    Pour "Syracuse" ce qui est indécidable, c'est l'ensemble infini des généralisations de cette question.
  • Décidable veut dire "qu'on peut trancher avec une machine".
    Dit comme ça ça reste vague.
    Formellement il y a par exemple:

    1°) Les propriétés décidables: les ensembles de suites de bits (ou de n'importe quoi qui puisse servir à encoder de l'information) dont la fonction caractéristique est calculable. La très grande confusion qui existe dans la tête des gens entre fonctions/valeurs prises par ces fonctions (faute d'avoir proprement réglé le "problème de la lettre" et de cet abominable "x") peut entretenir un flou à ce sujet.
    2°) La décidabilité des mathématiques dites constructives (à la coq en gros): l'énoncé $P$ est décidable quand $P\vee \neg P$ est prouvable dans un tel formalisme (intuitionniste).

    Le point 2° n'est pas juste un caprice: on ne peut pas confondre "il existe un programme qui s'arrête si et seulement si ZFC est contradictoire" avec "on dispose(*) d'un programme qui s'arrête si et seulement si ZFC est contradictoire".

    Bref Syracuse, ZFC et autres listes finies d'énoncés bien choisis ne sont décidables en aucun sens raisonnable (pour ce qui est du point 1° j'aimerais qu'on me donne cette fonction caractéristique. Ce n'est pas clair).

    [size=x-small](*) Il existe un milliard d'euros dans la masse monétaire européenne; j'aimerais bien disposer d'une telle somme.[/size]
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • Il faut être prudent, y compris avec l'intuitionnisme, comme je l'ai souvent rappelé, la "soit disant constructibilité" revendiquée est essentiellement fausse.

    Le théorème qui dit que

    si $\vdash_{intu} (A\vee \neg A)$
    alors $\vdash_{intu} (\neg A)$ ou $\vdash_{intu} (A)$

    n'a a priori aucun intérêt et fonctionne dans plein de logiques. Les gens confondent avec une sorte de "théorème de rêve" qui dirait

    si $X\vdash_{intu} (A\vee \neg A)$
    alors $X\vdash_{intu} (\neg A)$ ou $X\vdash_{intu} (A)$

    qui lui est évidemment faux, il suffit de prendre $X:=(A\vee \neg A)$ pour le voir.

    La revendication, et le slogan faux sont nés de la manière suivante, dont on peut prouver que par quelque bout qu'on la prenne elle conduit à des contradictions:

    1/ Un preuve de (A ou B) consiste à prouver l'une des deux phrases, en signalant laquelle
    2/ Une preuve de (A et B) consiste à prouver les deux phrases avec deux preuves que l'on présent en couple (ou l'un à la suite de l'autre) peu importe
    3/ Une preuve de $\exists xR(x)$ consiste en la donnée d'un objet $a$ et d'une preuve de $R(a)$
    4/ Une preuve de $A\to B$ consiste en un programme qui associe à toute preuve de $A$ une preuve de $B$.
    5/ Une preuve de $\forall xR(x)$ est un programme qui à chaque $a$ associé une preuve de $R(a)$

    Ce rêve est contradictoire, je signale une preuve simple qui l'établit, mais les patchs pour tenter de réparer ne marchent pas:

    Les 5 points précédents permettent de prouver toute formule vraie dans $(\N, + , \times)$
    En effet, par récurrence sur la taille de la phrase, le seul moment "chaud" est quand on suppose que $\forall xR(x)$ est vrai et qu'on veut le prouver. Par récurrence, pour chaque $n$, on dispose d'une preuve de $R(n)$. Le programme qui à chaque $n$ associe : "find proof $p$ of $R(n)$; return p" est alors une preuve de $\forall xR(x)$.

    Ce "rêve inaccessible" qui ne marche pas, a cependant dessiner les contours d'un système déductif ayant lui des règles claires, et renonce (de façon extrêmement brutale et bisounours) à l'injectivité de non.

    Il y a eu un intérêt à faire ça, c'est de permettre de "délégitimer" (donc de forcer à assumer) certains axiomes. Je prends un exemple:

    Une preuve de $\forall x: [(R(x)) $ ou $ A]$ associe à tout $a$, une preuve de $[R(a)$ ou $A]$. Alors qu'une preuve de $[(\forall xR(x))$ ou $A]$ va vous donner ou bien une preuve de $A$, ou bien pour chaque $a$, une preuve de $R(a)$. On voit bien que le deuxième cas est particulièrement exigeant quand le premier est plutôt "relax".

    Idem avec $\exists x: [R(x)\to A]$ qui vous donne $a$ et une preuve qui prouve $R(a)\to A$, c'est à dire un programme qui envoie toute preuve de $R(a)$ sur une preuve de $A$. Alors qu'une preuve de $ [(\forall x:R(x))\to A]$ va vous donner un programme qui pour chaque $b$, et chaque preuve de $R(b)$ vous donnera une preuve de $A$

    Bref, vous avez toute une liste de formes qui classiquement se valent à préfixe près et qui sont très différentes, à commencer par la plus célèbre d'entre elles, ci-dessous :

    $ [\forall x\exists y(R(x)\to R(y))] ==$
    $[\forall x: (R(x) \to [\exists yR(y)])] == $
    $( [\exists xR(x)] \to [\exists yR(y)] ) == $
    $ \exists y: ( [\exists xR(x)] \to [R(y)] ) == $
    $ \exists y\forall x: ( [R(x)] \to [R(y)] )$

    Pour les gens qui aiment la topologie, une preuve de $A\vee \neg A$ garantit que la forme $A$ sera dans chaque espace topologique un ouvert ayant une réunion avec l'intérieur de son complémentaire égale à l'espace entier. Et dans les connexes, l'un des morceaux sera forcément l'espace entier par exemple. Cette connexité rejoint la tentative de constructibilité.

    En fait, pour bien comprendre ce qu'il se passe en logique intuitionniste, il suffit de se rappeler que dans les jeux, l'implicatoin intuitionniste est définie par

    $A\to_{intuitionniste } B:=$

    j'ai le droit de rejouer autant que je veux en statut nonA, et avec ça, je dois gagner B (ou l'un des nonA sur une des tables).

    Par contre, je ne peux pas redemander à rejouer en ce qui concerne B. Ca rend donc très asymétrique les rôles gauche et droit. Prouver $A$ ou $A\to Paradis$, par exemple, c'est gagner dans le jeu

    " contre A, ou avec tout plein de tentatives en attaque contre A, gagner le paradis".

    N'importe qui voit bien qu'il ne réussira pas ça, sauf à savoir d'avance gagner $[A$ ou gagner $(A\to Paradis)]$.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • christophe c écrivait:
    > Les 5 points précédents permettent de prouver toute formule vraie dans $(\N, + , \times)$.
    > En effet, par récurrence sur la taille de la phrase, le seul moment "chaud" est quand on suppose que $\forall xR(x)$ est vrai et qu'on veut le prouver. Par récurrence, pour chaque $n$, on dispose d'une preuve de $R(n)$. Le programme qui à chaque $n$ associe : "find proof $p$ of $R(n)$; return p" est alors une preuve de $\forall xR(x)$.

    C'est surprenant, j'aurais dit que le "vrai" cas compliqué est le cas de l'existentiel : $\exists x.R(x)$. En effet, dans ce cas là, tu dois exhiber le témoin et tu n'as pas de procédure sous la main pour le construire (enfin tu peux tous les essayer, mais ça c'est une semi-décision et donc ne contredit rien du tout).
  • L'hypothèse de récurrence est qu'il existe $a$ tel que $R(a)$ est vrai et que $\exists xR(x)$ est la plus petite formule non prouvable et vraie. Tu as donc une preuve de $p$ de $R(a)$.

    Le couple $(a,p)$ est une preuve de $\exists xR(x)$. Il n'y a pas :-D de supposées considérations humaines de "décision", de "semi-décision".

    D'ailleurs, exercice, si une formule est fausse alors il existe une procédure RECURSIVE pour battre le défenseur de vrai dessus, à la condition d'avoir sa stratégie comme oracle implémenté.

    De toute façon, rassure-toi, aucun système formel n'est construit sur ces bases, on a découvert plus tard qu'une preuve de $\forall xR(x)$ est une preuve de $R(x)$ (enfin "découvert", on aurait pu s'en rendre compte avant :-D vu que tout le monde le savait), ou pour dire les choses plus opératoirement, une preuve de $\forall xR(x)$ est un objet $q$ qui prouve tous les $R(a)$. Et ce n'est SURTOUT PAS UN programme qui prend $a$ en entrée!!!.

    Si on veut se forcer à parler de programme, c'est un programme qui dit "allez-y, je me bouche les yeux, placez $a$ sur le plateau secret, je vous prouve $R(a)$ sans le connaitre"

    Le seul endroit où tu as un succédané de fonction c'est pour $A\to B$.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • Il y trop de militantisme mensonger dans tes messages christophe c.
    christophe c a écrit:
    La revendication, et le slogan faux sont nés de la manière suivante, dont on peut prouver que par quelque bout qu'on la prenne elle conduit à des contradictions:

    1/ Un preuve de (A ou B) consiste à prouver l'une des deux phrases, en signalant laquelle
    2/ Une preuve de (A et B) consiste à prouver les deux phrases avec deux preuves que l'on présent en couple (ou l'un à la suite de l'autre) peu importe
    3/ Une preuve de $\exists x R(x)$consiste en la donnée d'un objet $a$ et d'une preuve de $R(a)$
    4/ Une preuve de $A \to B$consiste en un programme qui associe à toute preuve de A une preuve de B.
    5/ Une preuve de $\forall x R (x)$est un programme qui à chaque $a$ associé une preuve de $R(a)$

    C'est un slogan légitime. Il s'applique du reste à toutes les catégories dans lesquelles il y a des produits et coproduits arbitraires (dont un objet initial et final) et des exponentielles.

    Exemple détaillé:

    C'est contradictoire? Les algèbres de Heyting n'existent pas? les espaces topologiques non plus? $\{0,1\},\leq $ non plus?

    Ca se fait vite:
    Si $A,B\in \{0,1\}$ on définit "$Preuve(A,B) :=\{\emptyset\}$" si $A\leq B$ et $Preuve(A,B):=\emptyset$ si $A>B$ (donc $Preuve (A,B) $ est non vide si et seulement si $A\leq B$). Puis on pose $A\wedge B:= \inf (A,B)$, $A \vee B:= \sup (A,B)$, $A \to B:= \sup \{C\mid |A \wedge C \leq B\}$, $\perp := 0$, $\overline{\forall}_I F:= \inf{F(f) \mid t \in I}$; $\overline{\exists}_I F:= \sup{F(f) \mid t \in I}$, $\forall x:I, E:= \overline{\forall}_I (x\in I\mapsto E)$, $\exists x:I, E(x):= \overline{\exists} (x\in I \mapsto E)$.
    $\{0,1\},\leq $ est remplaçable par n'importe quel treillis complet et si de plus dans le treillis on a $\inf \{b \vee a_i \mid i \in I \} = b \vee \inf \{a_i \mid i \in I\}$ pour tous $a,b,I$ alors le treillis en question est une algèbre de Heyting et on rerouve les théorèmes intuitionnistes.
    christophe c a écrit:
    Le programme qui à chaque n associe : "find proof p of R(n); return p" est alors une preuve de $\forall x R(x)$.
    Prière d'insérer ci-dessous le programme qui fait ça avant de traiter tout le monde d'abruti. Je ne sais pas qui est ce find.

    Dans les premières versions de COQ quand quelque chose n'allait pas les gens ne postaient pas des pages et des pages de militantisme engagé pour influencer l'avis des usagers. Ils postaient des fichiers informatiques qui compilent i.e. des preuves de FALSE dans les versions COQ concernées. Les auteurs de HOL (un autre prouveur basé sur des fondements similaires) continuent de proposer de l'argent sur leur page aux auteurs de preuve de 1=0 (par contre les mails leur disant "je n'ai pas cette preuve mais votre paradigme est faux" iraient à la poubelle je pense).
    christophe c a écrit:
    De toute façon, rassure-toi, aucun système formel n'est construit sur ces bases,

    Ben voyons, c'est pourtant ce que fait COQ.

    Il y a une preuve de ce que COQ est contradictoire en 5 lignes? (c'est à dire un programme dans le langage)Ca m'intéresse.
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • foys a écrit:
    militantisme mensonger

    Comme tu y vas, si je ne savais pas que c'est toi, je te trouverais violent (verbalement). Je pense que tu te trompes, et surtout, que me connaissant, tu en es arrivé à me faire des procès d'intention automatiques. Ce n'est pas la première fois que je le remarque.

    Le plus "incroyable" est ta première citation, suivie de choses qui n'y répondent pas du tout. Il me semble que j'étais été clair, je n'ai jamais nié ces intentions comme existant, j'ai juste dit qu'elles ne sont pas réalisables (et de fait n'ont pas été réalisées). J'ai l'impression que tu considères que "le fait d'avoir juste jeté la règle du $\forall$" est un petit détail.

    Il n'en est rien, ça "annule" tout le paradigme, le reste étant trivial. Par ailleurs je ne comprends pas du tout pourquoi tu me vois comme un ennemi de la logique intuitionniste. Tu n'as peut-être une vue globale de la communauté des logiciens du monde, donc fais-moi confiance, dans le genre "j'aime la logique intuitionniste", je suis au top (dans les 10 premiers pourcents très probablement).

    Si tu avais lu la preuve que j'ai mise juste en dessous de ta première citation, ça t'aurait peut-être évité d'ailleurs de te tromper à ce point. Le $\forall$ n'est pas et ne peut pas être un produit, ailleurs que dans de braves fantasmes accompagnant l'activité. C'est une intersection, et COQ comme tout autre prouveur n'utilise que des fonctions constantes (éventuellement sans le dire).
    foys a écrit:
    Ben voyons, c'est pourtant ce que fait COQ.

    Bon, tu n'as pas lu, c'est clair (au moins ça a le mérite d'être simple). Il est bien évident que ni COQ, ni aucun prouveur n'est capable de produire la vérité intégrale de l'arithmétique de Peano, ça n'a rien de militant (j'aimerais bien au contraire avoir tort) et bien évident qu'une preuve de $\forall xR(x)$ "en général" n'est pas une fonction (au sens ou le lecteur est invité à la croire) qui à chaque entier $n$ associe une preuve de $R(n)$.

    Mais si tu ne lis pas....
    foys a écrit:
    Prière d'insérer ci-dessous le programme qui fait ça avant de traiter tout le monde d'abruti. Je ne sais pas qui est ce find.

    Menfin foys:

    p:=0
    while $p$ ne code pas une preuve de $R(n)$, do $p:=p+1$ done
    return $p$


    (L'hypothèse de récurrence fait qu'il termine ou que le paradigme n'a pas de valeur)

    Tu es un grand expert, mais parfois si on ne lit pas on se trompe et surtout ne saisis pas le niveau auquel est envoyé le discours. Il n'y a rien dans ce que j'ai dit avec quoi tu n'es pas d'accord, et tu as trouvé le moyen de m'accuser de militantisme et de faire la pub de COQ en me tapant dessus au passage. Comme quoi, on est parfois emporté par ses convictions, pour ce qui te concerne c'est une évidence.

    Et sors-toi de la tête que je serais hostile à la logique intuitionniste, c'est une erreur monumentale sur mes goûts, je l'ADORE. Quand je rappelle qu'elle ne réalise que peu des rêves inaccessibles des constructivistes, je pense à des faits objectifs que sont:

    - Théorème de Statman (elle est PSPACE-complète, bonjour le progrès en simplicité :-D)
    - Gens qui oublient qu'on ne peut pas mettre de "vraies" hypothèses à gauche du $\vdash$
    - Indécidable dans son second ordre propositionnel (Statman est une anecdote à côté de cet os, la classique est "juste" PSPACE complète)


    Ca n'en fait pas moins une logique que j'aime et analyse souvent. Tu confonds ça je pense avec ma critique du caractère non fondationnel du paradigme catégorique (qui est pourtant une évidence) où je propose souvent le mot "unificateur" qui irait mieux que fondationnel à la place.

    Ce n'est pas parce qu'on aime la TDE qu'on déteste ce que font les autres :-D

    En tout cas, je trouve ton appréciation de tout ça extrêmement mystérieuse, dans la mesure où je te sais très explorateur de ces trucs, donc il y a peut-être quelque chose qui m'échappe dans ta pensée.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • christophe c a écrit:
    Le $\forall$ n'est pas et ne peut pas être un produit, ailleurs que dans de braves fantasmes accompagnant l'activité. C'est une intersection, et COQ comme tout autre prouveur n'utilise que des fonctions constantes (éventuellement sans le dire).
    Alors pourquoi dans COQ, l'expression "p: forall x:U,T x" déclare un élément p du produit cartésien de la famille de types (x \mapsto T x) paramétrée par U?

    Tu déclares quand même qu'il est impossible de faire un truc que les gens FONT tous les jours!
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • christophe c a écrit:
    De toute façon, rassure-toi, aucun système formel n'est construit sur ces bases, on a découvert plus tard qu'une preuve de $\forall x R(x)$ est une preuve de $R(x)$
    J'ai failli demander tel l'élève de 4ième en désarroi devant les fautes de rédaction de son prof: "mais qui est x dans cette phrase ?"

    Je n'ai pas interprété tes propos comme un rejet de l'intuitionnisme mais plutôt une façon de dire que les travaux dans la théorie des types dépendants n'existent pas. J'utilise des prouveurs. Tu écris que les fichiers que j'ai écrits n'existent pas (et que les gens sont naïfs de croire que de tels fichiers puissent exister. Mais les gens ne croient rien, ils produisent des termes d'un certain type).
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • On est d'accord là dessus (que les gens produisent). Je t'ai donné une preuve que ce n'est pas possible de réaliser le rêve affiché, je ne me suis pas contenté de l'affirmer. Tu me rétorques que "parfois", il arrive que telle fonction très simple (récursive, voire primitive récursive) puisse associer à $n$ une preuve de $R(n)$.

    Mais je n'ai jamais nié ça en aucune manière ou alors je me suis très très mal fait comprendre.

    Lorsque "des naifs" (pardon pour le mot, et tu n'en fais pas partie) lisent

    "une preuve de $\forall xR(x)$ est une fonction qui à chaque $n$ associe une preuve de $R(n)$"

    et c'est à ces naifs potentiels, sur le forum les maths point net que je me suis adressé, ils comprennent (et je l'ai vu des centaines de fois en vrai de vrai) qu'il suffit pour chaque $n$, de prouver $R(n)$ pour gagner.

    Pas à des experts de COQ. Les gens qui ont programmé COQ n'ont pas besoin de moi pour savoir qu'en dehors de rarissimes exceptions, la plupart des énoncés vrais $\forall xR(x)$, tels que pour tout $n$, l'énoncé $R(n)$ est prouvable ne sont pas prouvables. Et tu le sais tout autant, je ne vois pas où est le problème.

    Par ailleurs en tant que mathématicien le plu sfort du forum, il ne t'a pas échappé que quand tu prouves $\forall xR(x)$, tu prouves $R(x)$, puis utilise un tag syntaxique te permettant de dire "donc $\forall xR(x)$".

    (Et ne t'inquiète pas, je ne suis pas en train de m'auto-détruire en libérant la variable $x$ :-D je reste attaché aux variables liées comme il faut, je ne trahis pas norte cause commune :-D (je blague, ne gaspille pas des minutes sur cette parenthèse))

    Il y a quelque chose qui m'échappe dans ta véhémence, que je ne devine sincèrement pas. Je ne me suis pas relu, peut-être ai-je donné l'impression de dire "NON JAMAIS une preuve de $\forall xR(x)$ ne permettra d'avoir une fonction qui pour chaque $n$, vous convaincra que $R(n)$ est vrai", mais ça n'aurait pas de sens et je ne crois pas avoir dit ça. Je vais me relire.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • Idem, il ne faut pas confondre, réalisabilité, typage et preuves.

    - Le typage est une sorte de succédané artisanal pour se garantir que des énoncés ou des théories faibles ne sont pas contradictoires (que des termes vont terminer)

    - une preuve est une argumentation formelle avec des "donc", etc.

    - la réalisabilité étudie le fait qu'une preuve s'exécute comme un programme. Dans ce contexte typer offre une (parmi d'autre) attestation de terminaison future, mais ça va pas très loin comme tu le sais du fait de Godel.

    Il est important de rappeler que les "bons programmes" ne terminent pas et que c'est même leur vocation de ne pas terminer.

    Les seuls qui sont "un peu intéressants" pour les matheux qui terminent sont ceux qui renvoient le résultat d'un calcul. Mais ton OS, tu le préfères "ne terminant pas", ton lecteur de vidéos ou de musiques, tu le préfères ne terminant pas (quelle frustration que le programme se mette subitement à faire la grève alors que tu prenais ton pied à écouter du Bethoveen), etc. Tes traitements de texte ne terminent pas.

    Ton navigateur ne termine pas.

    Bref, rien ne termine en dehors de programmes triviaux (j'entends par là, dont l'ADN est de délivrer "une information définitive").

    Pour l'étude de ces phénomènes, à moins d'être un peu de mauvaise foi en considérant, comme caml le fait , que la déclaration :

    type pied = L of (pied->pied) | Racine

    entre dans l'activité des typeurs, il est abandonné depuis longtemps qu'il soit de bon conseil de se servir des "preuves de terminaison" et des "garanties ou espoirs de consistance" pour avancer dans le domaines des "programmes importants" qui ne terminent pas.

    Je sais qu'on est capable de tout et de renommer le lambda calcul pur en lambda calcul "gentiment typé", mais bon.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • Bon, après avoir plaisanté, je vais éclaircir.
    La question concerne la calculabilité et non la décidabilité…il y a une nuance.

    L'énoncé devrait donc être : il existe une MT ayant 748 états qui calcule et s'arrête sur une preuve dans ZFC du faux écrite sur son ruban si une telle contradiction existe.

    C'est évident si on enlève la propriété d'avoir 748 états et notez aussi que l'on pourrait remplacer "preuve du faux" par "preuve de P" pour n'importe quel énoncé P donné et même en tant que paramètre écrit sur le ruban à l'état initial.

    De cette propriété de "calculabilité" on peut déduire une propriété de "décidabilité" : l'ensemble des énoncés prouvables dans ZFC est semi-décidable.
  • Merci pour cette précision Serge.
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • En fait ça doit être parce que tu nies le fait que le produit cartésien est la construction catégorique.
    Ce n'est pas parce que "pour tout $x$, il existe (au sens méta) une preuve de $R(x)$" qu'il existe une preuve de $\forall x R(x)$.

    Même ensemblistement, $\left ( \forall i\in I, R(i) \neq \emptyset \right ) \Rightarrow \left (\prod_{i \in I} R(i) \neq \emptyset\right ) $ (ça revient à supposer l'axiome du choix).
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • G.A. a écrit:
    Elle s'est arrêtée ! Ah non pardon c'est mon ordi qui bug :-D
    Je l'ai laissée tourner jusqu'à 10 000 étape et elle ne s'est pas arrêté. Si ça c'est pas une preuve que ZFC est consistant je ne sais pas ce qu'il vous faut ! Ce serait tout de même plus pratique d'avoir une machine de Turing qui s'arrête si ZFC est consistant (:D


    Blagues à part, dans les commentaires du code on peut lire qu'en corollaire le nombre castor affairé 748 ($CA(748)$ pour abréger) ne peut pas être déterminé dans ZFC. Est-ce que je raisonne bien en disant que si ZFC est consistant alors on ne peut même pas donner une borne supérieure de $CA(748)$ ? Mon raisonnement est le suivant : si ZFC est consistant alors la machine de Turing boucle, supposons qu'on sache que $CA(748) \leq M$, il "suffit" alors de faire tourner la machine de Turing pendant $M+1$ étape, voir qu'elle ne s'est pas arrêtée et en déduire qu'elle ne s'arrêtera jamais. Ceci serait alors une preuve, dans ZFC, de la consistance de ZFC, ce qui est impossible.

    Ce qui me fait me poser une autre question. Est-ce qu'on connait le nombre minimal d'états qu'une machine de Turing doit posséder pour que le problème de l'arrêt soit indécidable dans ZFC ? Je suppose qu'on peut faire beaucoup mieux que 748.
  • @Foys:

    1/ Je ne nie pas les catégories, je n'en parle tout simplement pas. MON avis est qu'elles confondent "trop" les choses (en particulier $\otimes$ et $\oplus$, et c'est dans leurs gênes, et non une question de définition (mais ce n'est qu'un avis, et de toute façon on peut tout leur faire dire, un produit cartésien catégorique peut très bien représenter une borne, il n'y a pas de "critère absolu" vu qu'une borne inf comme l'est $\forall$, est un produit cartésien dans la catégorie idoine).

    Mais ce n'est que mon avis et ne me conduit qu'à les ignorer (même si je pense que je saurais reconstruire le produit catégorique ici sous-jacent)

    2/
    Foys a écrit:
    il existe (au sens méta) une preuve de

    Mais je ne parle pas de preuve "méta" !!!!!!! :-X Je te parle de bonnes et dues preuves de chez preuves de chez le marchand de formel le plus acariatre :-D . Je te parle du fait que dès lors que pour chaque $n$, tu as une preuve de chez preuve absolue de $R(n)$, tu as un programme qui à chaque $n$ t'associe une preuve de chez Super-preuve!

    L'axiome du choix n'y est pour rien. C'est la procédure p est-il une preuve de A qui est en cause. Rien de plus.

    @Corto, oui, ton raisonnement est bon.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • christophe c a écrit:
    Mais je ne parle pas de preuve "méta" !!!!!!! angry smiley Je te parle de bonnes et dues preuves de chez preuves de chez le marchand de formel le plus acariatre grinning smiley . Je te parle du fait que dès lors que pour chaque n, tu as une preuve de chez preuve absolue de $R(n)$, tu as un programme qui à chaque $n$ t'associe une preuve de chez Super-preuve!
    Je ne suis pas sûr de ce que tu veux dire. Mon propos est une réponse à l'idée (c'est comme ça que je l'ai interprété) que, puisqu'en gros il existe des énoncés à une lettre libre $P(x)$ tels que pour tout entier $n$ ("explicite" ?) on a une preuve de $P(x:=n)$ mais que $\forall x P$ n'est pas prouvable pour autant, alors il faudrait en conclure que le paradigme où l'ensemble des preuves de $\forall n P(n)$ est le produit cartésien indexé par les entiers serait illégitime (ou pire, jamais réalisé ce qui est démenti par l'existence de prouveurs formels qui font ça quotidiennement). Mon propos est que non il n'est pas illégitime. Du reste c'est pour ça que j'ai mentionné l'axiome du choix: avoir $\prod_{n\in \N} preuves(P(n))$ vide et $preuves (P(k))$ non vide quel que soit l'entier $k$ ne devrait pas être considéré comme un problème (comme une remise en cause de $\forall=\prod$).
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • Depuis le début j'ai vraiment l'impression qu'on ne se comprend pas. Je n'ai jamais parlé "d'illégitimité", j'ai parlé de pure et simple impossibilité de réaliser intégralement un projet (la notion de réalisation partielle ici, ne voulait pas dire grand chose dans mon post initial).

    Depuis tes premières réponses, il semble que tu veuilles me faire dire ou me crois disant que je "rejette" même les réalisations partielles de ce projet.

    C'est très étonnant comme échange, et vu que c'est toi, je me demandais si tu ne voulais pas soulever un lièvre, mais apparemment non, on est juste restés sur ce malentendu trivial.

    Je n'ai jamais eu de problème (ni même eu une grosse envie de parler de) avec "les projets partiels". Tout est dans la proportion qu'on prétend réaliser. Réaliser epsilon d'un projet s'appelle réaliser partiellement un projet.

    L'ensemble des fonctions constantes n'est pas vide et le fait qu'il existe des fonctions constantes envoyant chaque $n$ sur une garantie de $R(n)$ n'est pas zéro-vide-total, etc, c'est une "réalisation partielle" comme une autre, elle juste "très partielle".

    Même si une seule fonction au total de chez total envoyait pour une certaine R, dans une seule certaine circonstance, chaque $n$ sur une preuve de $R(n)$, ce serait une réalisation partielle, l'ensemble ne serait pas vide.

    Je pense qu'il faut que nous sortions de ce malentendu.

    Entre autres parce que j'ai l'impression, malgré ton étude, solitaire et personnelle (et très remarquable et admirable) du lambda calcul, de la logique combinatoire, et (peut-être, je t'ai moins vu poster) de théorie de la démonstration, qu'il y a une distinction que tu as loupé lors de ces voyages d'étude:

    il s'agit de ce que j'appelle faute de mieux, des "tags".

    A la base, c'est très simple: une garantie de $\forall R(x)$ c'est un élément de l'intersection des ensembles $R(a)$ (j'amidonne un peu les notations) quand $a$ parcourt l'univers.

    C'est vraiment important. J'insiste bien que $\forall xR(x)$ est un ENSEMBLE qui est INCLUS DANS $R(a)$.

    J'utilise bien le mot "garantie". (Du peu que je sais de COQ, il y aurait une option qui restitue cette garantie une fois entrée ta preuve, mais je connais trop peu ce logiciel, c'est juste une rumeur que j'ai entendue.)

    Maintenant, les être humains, eux n'aiment pas trop ça, ils aiment bien ajouter des balises. Ils n'ont pas envie d'analyser $z$ de voir que ça garantit $R(a)$, mais aussi $S$, mais aussi ceci, cela, mais aussi $\forall xR(x)$.

    Du coup ils ont inventé le "fameux mot usine à gaz" : typer. Lui-même réutilisé dans un sens plutôt différent en catégorie.

    Ainsi ils GARDENT UNE TRACE de comment ils ont construit la garantie de leur machin, autrement tout bêtement, ils le mettent "en couple" avec la garantie pour pouvoir appeler ça une preuve. Plutôt que le choix d'un simple couple $(a,P)$ où $a$ garantit $P$, ils peuvent aussi choisir des façons plus "vantardes" de faire, mais ce n'est pas très important.

    ainsi, face à la situation d'avoir construit une garantie $w$ de $\forall xR(x)$ (exprimée disons par le couple $(w,\forall x R(x))$), ils diront "et maintenant, je "l'applique" à $a$, ce qui me donne une garantie de $R(a)$"

    Et ils écriront qu'ils ont comme preuve $(w,R(a))$ et non plus comme preuve $(w,\forall x R(x))$. quelque chose aura changé. Mais c'est le membre de droite qui aura changé!!! , c'est à dire la décoration.

    S'ils sont vraiment fumeurs de moquette, ils iront jusqu'à dire qu'ils ont appliqué la fonction constante $Kw$ à $Ind(R,a)$ ou tout autre démarche de ce genre de façon à disposer de l'apparence d'une fonction qui à chaque $a$, associe la preuve $(w, R(a))$.

    Mais toute cette partie est bien connue et porte le nom depuis des décennies de "commentaires dans les programmes" quand on retourne vers la CCH pour tenter de trouver à quel endroit on parlerait de ça. D'un point de vue CCH, ce que tu crois important et qui porte parfois le nom "type" dans les soirées mondaines, s'appelle objectivement et factuellement un commentaire dans un programme.

    Il ne s'agit pas d'une "nécessité" émergeant de la preuve et encore moins d'une procédure artisanale comme le fait de typer en C ou en Pascal. Il s'agit d'une "aide à l'humain" pour qu'il s'y retrouve. C'est ce que j'appelle parfois "un tag" car c'est court à écrire.

    Par exemple $K$ peut recevoir à tel heure, pour telles raisons le commentaire $A\to (B\to A)$, mais ça n'en fera pas un $K$ tout nouveau tout beau qui a envie de sortir la nuit pour montrer ses nouveaux habits. Ca reste ton bon vieux $K$ bien familier tel que $\forall x,y: Kxy := x$, qui est un commutateur langagier AVANT qu'on tente de l'enfermer dans une sémantique partielle où il y aurait "un K, en quelque sorte ,par $(A^B)^A$.

    Bien sûr qu'on peut "conter" ça autrement pour les faire rêver, mais c'est à ses risques et périls et comme tu le vois ça génère des malentendus peu reluisant. Je n'y pensais pas mais il y a peut-être une semaine, j'ai lu tout un document usine à gaz que m'avait recommandé maxtimax où ce genre de platonisation non assumée du constructivisme était carrément pleinement annoncée aux lecteurs naifs, et je ne trouvais pas ça très élégant de procéder ainsi (surtout que le document pour faire savant compliquait très largement des notions bien connues et simples dans d'autres contextes).

    Et force est de constater que ce n'est jamais totalement innocent et j'en ai été 15mn LA PREMIERE VICTIME, je peux donc témoigner: j'avais été apâté par une déclaration il y a longtemps de Max disant qu'il y a des modèles de "tout est calculable" et je me demandais si "c'était sérieux" ou de l'habituelle promotion de supposée magie.

    Je n'ai rien contre ça, mais tu vois bien que le militant ce n'est pas moi, je me suis contenté de donner des précisions techniques qui me semblaient utiles. Je peux t'assurer que je ne suis pas le seul à être appâté et que des centaines de gens (alors certes il y a plus grave), beaucoup moins armé que moi, je pense en particulier à certains aspirants philosophes jeunes ou certains préretraités qui ont envie d'approfondir des choses en fin de carrière de matheux/géomètre/expert en edp, je ne sais qui lisant "modèle où tout est calculable" vont vraiment y croire et ne pas voir l'esbrouffe.

    Voilà, je ne pense pas être "le vilain pessimiste", mais au contraire, le "joyeux préciseur". La science est passionnante, pas besoin de raconter que les eaux s'ouvrent devant la communauté des typeurs et autres experts en catégorico-programmes d'assistance à la preuve. Je ne crois pas que les matheux vont leur accorder pluss de crédit parce qu'ils exagèrent quand les négociations de budget se font.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • christophe c a écrit:
    Par exemple $K$ peut recevoir à tel heure, pour telles raisons le commentaire $A \to (B \to A)$, mais ça n'en fera pas un $K$ tout nouveau tout beau qui a envie de sortir la nuit pour montrer ses nouveaux habits. Ca reste ton bon vieux $K$ bien familier tel que $\forall x,y: Kxy$qui est un commutateur langagier AVANT qu'on tente de l'enfermer dans une sémantique partielle où il y aurait "un $K$, en quelque sorte ,par $(A^B)^A$.

    Dans ZFC, si $A_1,A_2,B$ sont des ensembles avec $A_1$ et $A_2$ de cardinal différent alors $(A_1^B)^{A_1} \cap (A_2^B)^{A_2}$ est vide (une fonction quelconque de $E\to F$ est en bijection avec $E$ pour tous $E,F$). Pourtant
    $K_{A,B}:=x\in A \mapsto y \in B \mapsto x = \{(x,y)\in A\times B^A \mid \forall z\in B, (z,x)\in y \}$ existe bel et bien.
    On a également une preuve $\left (K_{\N,\N}= K_{\R,\N}) \right) \Rightarrow 1=0$ par ce qui précède.

    Dans COQ les preuves sont littéralement des termes de lambda calcul typé (dans un système de types dépendants où le calcul de chaque terme se termine: les termes admissibles en coq sont fortement normalisants).
    christophe c a écrit:
    A la base, c'est très simple: une garantie de $\forall x R(x)$c'est un élément de l'intersection des ensembles $R(a)$ (j'amidonne un peu les notations) quand a parcourt l'univers.

    C'est vraiment important. J'insiste bien que $\forall x R(x)$ est un ENSEMBLE qui est INCLUS DANS $R(a)$.

    J'utilise bien le mot "garantie". (Du peu que je sais de COQ, il y aurait une option qui restitue cette garantie une fois entrée ta preuve, mais je connais trop peu ce logiciel, c'est juste une rumeur que j'ai entendue.)
    Il y a les commandes
    "Check" qui affiche le type d'un objet.
    "Print" qui affiche le lambda-terme en question.
    "Compute" qui affiche sa forme normale (les termes de COQ sont fortement normalisants).

    Un exemple: on prend un théorème "plus_com" qui dit que l'addition est commutative dans $\N$ (c'est moi qui l'ai écrit, il doit y en avoir un dans la librairie mais flemme, ça prend 30 secondes).

    Le type de l'objet plus_com:
    Coq < Check plus_com.
    plus_com
         : forall a b : nat, a + b = b + a
    

    Son expression
    Coq < Print plus_com.
    plus_com = 
    fun a : nat =>
    nat_ind (fun a0 : nat => forall b : nat, a0 + b = b + a0)
      (fun b : nat =>
       nat_ind (fun b0 : nat => 0 + b0 = b0 + 0) eq_refl
         (fun (b0 : nat) (IHb : 0 + b0 = b0 + 0) =>
          eq_ind (0 + b0) (fun n : nat => S b0 = S n) eq_refl (b0 + 0) IHb) b)
      (fun (a0 : nat) (IHa : forall b : nat, a0 + b = b + a0) (b : nat) =>
       eq_ind_r (fun n : nat => S n = b + S a0)
         (eq_ind (S (b + a0)) (fun n : nat => S (b + a0) = n) eq_refl 
            (b + S a0) (plus_n_Sm b a0)) (IHa b)) a
         : forall a b : nat, a + b = b + a
    
    Argument scopes are [nat_scope nat_scope]
    

    Résultat du calcul de "plus_com" en forme normale.
    Coq < Compute plus_com.
         = fun a : nat =>
           (fix Ffix (x : nat) :
              forall x0 : nat,
              (fix Ffix0 (x1 x2 : nat) {struct x1} : nat :=
                 match x1 with
                 | 0 => x2
                 | S x3 => S (Ffix0 x3 x2)
                 end) x x0 =
              (fix Ffix0 (x1 x2 : nat) {struct x1} : nat :=
                 match x1 with
                 | 0 => x2
                 | S x3 => S (Ffix0 x3 x2)
                 end) x0 x :=
              match
                x as c
                return
                  (forall x0 : nat,
                   (fix Ffix0 (x1 x2 : nat) {struct x1} : nat :=
                      match x1 with
                      | 0 => x2
                      | S x3 => S (Ffix0 x3 x2)
                      end) c x0 =
                   (fix Ffix0 (x1 x2 : nat) {struct x1} : nat :=
                      match x1 with
                      | 0 => x2
                      | S x3 => S (Ffix0 x3 x2)
                      end) x0 c)
              with
              | 0 =>
                  fun x0 : nat =>
                  (fix Ffix0 (x1 : nat) :
                     x1 =
                     (fix Ffix1 (x2 x3 : nat) {struct x2} : nat :=
                        match x2 with
                        | 0 => x3
                        | S x4 => S (Ffix1 x4 x3)
                        end) x1 0 :=
                     match
                       x1 as c
                       return
                         (c =
                          (fix Ffix1 (x2 x3 : nat) {struct x2} : nat :=
                             match x2 with
                             | 0 => x3
                             | S x4 => S (Ffix1 x4 x3)
                             end) c 0)
                     with
                     | 0 => eq_refl
                     | S x2 =>
                         match Ffix0 x2 in (_ = x3) return (S x2 = S x3) with
                         | eq_refl => eq_refl
                         end
                     end) x0
              | S x0 =>
                  fun x1 : nat =>
                  match
                    match
                      Ffix x0 x1 in (_ = x2)
                      return
                        (x2 =
                         (fix Ffix0 (x3 x4 : nat) {struct x3} : nat :=
                            match x3 with
                            | 0 => x4
                            | S x5 => S (Ffix0 x5 x4)
                            end) x0 x1)
                    with
                    | eq_refl => eq_refl
                    end in (_ = x2)
                    return
                      (S x2 =
                       (fix Ffix0 (x3 x4 : nat) {struct x3} : nat :=
                          match x3 with
                          | 0 => x4
                          | S x5 => S (Ffix0 x5 x4)
                          end) x1 (S x0))
                  with
                  | eq_refl =>
                      match
                        plus_n_Sm x1 x0 in (_ = x2)
                        return
                          (S
                             ((fix Ffix0 (x3 x4 : nat) {struct x3} : nat :=
                                 match x3 with
                                 | 0 => x4
                                 | S x5 => S (Ffix0 x5 x4)
                                 end) x1 x0) = x2)
                      with
                      | eq_refl => eq_refl
                      end
                  end
              end) a
         : forall a b : nat, a + b = b + a
    

    On peut spécifier ce théorème (c'est-à-dire appliquer le programme en question) à des nombres.
    Commençons par afficher le type des termes obtenus.
    Ici on le fait sur 1; on obtient donc un autre théorème (pour tout entier b, 1+b = b+1)
    Coq < Check (plus_com 1).
    plus_com 1
         : forall b : nat, 1 + b = b + 1
    

    Puis avec 0
    Coq < Check (plus_com 0).
    plus_com 0
         : forall b : nat, 0 + b = b + 0
    

    Avec 1 et 2 on obtient le théorème 1+2 = 2+1
    Coq < Check (plus_com 1 2).
    plus_com 1 2
         : 1 + 2 = 2 + 1
    

    Que se passe-t-il si on calcule ce genre de termes?
    Affichage du terme obtenu en appiquant "plus_com" à 0.
    Coq < Compute (plus_com 0).  
         = fun b : nat =>
           (fix Ffix (x : nat) :
              x =
              (fix Ffix0 (x0 x1 : nat) {struct x0} : nat :=
                 match x0 with
                 | 0 => x1
                 | S x2 => S (Ffix0 x2 x1)
                 end) x 0 :=
              match
                x as c
                return
                  (c =
                   (fix Ffix0 (x0 x1 : nat) {struct x0} : nat :=
                      match x0 with
                      | 0 => x1
                      | S x2 => S (Ffix0 x2 x1)
                      end) c 0)
              with
              | 0 => eq_refl
              | S x0 =>
                  match Ffix x0 in (_ = x1) return (S x0 = S x1) with
                  | eq_refl => eq_refl
                  end
              end) b
         : forall b : nat, 0 + b = b + 0
    

    On voit donc que le termes "plus_com" et "plus_com 0" n'ont pas la même forme normale, ce qui invalide l'affirmation
    péremptoire "une preuve de 'pour tous a,b, a+b = b+a' " est contenue dans l'intersection des 'pour tout b, x+b=b+x' où x parcourt N. (en fait: l'idée que le passage de forall x P(x) à P(t) est une simple inclusion)


    appliquons le même théorème, cette fois en 1:
    Coq < Compute (plus_com 1).
         = fun b : nat =>
           match
             match
               (fix Ffix (x : nat) :
                  x =
                  (fix Ffix0 (x0 x1 : nat) {struct x0} : nat :=
                     match x0 with
                     | 0 => x1
                     | S x2 => S (Ffix0 x2 x1)
                     end) x 0 :=
                  match
                    x as c
                    return
                      (c =
                       (fix Ffix0 (x0 x1 : nat) {struct x0} : nat :=
                          match x0 with
                          | 0 => x1
                          | S x2 => S (Ffix0 x2 x1)
                          end) c 0)
                  with
                  | 0 => eq_refl
                  | S x0 =>
                      match Ffix x0 in (_ = x1) return (S x0 = S x1) with
                      | eq_refl => eq_refl
                      end
                  end) b in (_ = x) return (x = b)
             with
             | eq_refl => eq_refl
             end in (_ = x)
             return
               (S x =
                (fix Ffix (x0 x1 : nat) {struct x0} : nat :=
                   match x0 with
                   | 0 => x1
                   | S x2 => S (Ffix x2 x1)
                   end) b 1)
           with
           | eq_refl =>
               match
                 plus_n_Sm b 0 in (_ = x)
                 return
                   (S
                      ((fix Ffix (x0 x1 : nat) {struct x0} : nat :=
                          match x0 with
                          | 0 => x1
                          | S x2 => S (Ffix x2 x1)
                          end) b 0) = x)
               with
               | eq_refl => eq_refl
               end
           end
         : forall b : nat, 1 + b = b + 1
    
    Le terme obtenu est deux fois plus long.
    Coq < Compute (plus_com 2).
         = fun b : nat =>
           match
             match
               match
                 match
                   (fix Ffix (x : nat) :
                      x =
                      (fix Ffix0 (x0 x1 : nat) {struct x0} : nat :=
                         match x0 with
                         | 0 => x1
                         | S x2 => S (Ffix0 x2 x1)
                         end) x 0 :=
                      match
                        x as c
                        return
                          (c =
                           (fix Ffix0 (x0 x1 : nat) {struct x0} : nat :=
                              match x0 with
                              | 0 => x1
                              | S x2 => S (Ffix0 x2 x1)
                              end) c 0)
                      with
                      | 0 => eq_refl
                      | S x0 =>
                          match Ffix x0 in (_ = x1) return (S x0 = S x1) with
                          | eq_refl => eq_refl
                          end
                      end) b in (_ = x) return (x = b)
                 with
                 | eq_refl => eq_refl
                 end in (_ = x)
                 return
                   (S x =
                    (fix Ffix (x0 x1 : nat) {struct x0} : nat :=
                       match x0 with
                       | 0 => x1
                       | S x2 => S (Ffix x2 x1)
                       end) b 1)
               with
               | eq_refl =>
                   match
                     plus_n_Sm b 0 in (_ = x)
                     return
                       (S
                          ((fix Ffix (x0 x1 : nat) {struct x0} : nat :=
                              match x0 with
                              | 0 => x1
                              | S x2 => S (Ffix x2 x1)
                              end) b 0) = x)
                   with
                   | eq_refl => eq_refl
                   end
               end in (_ = x) return (x = S b)
             with
             | eq_refl => eq_refl
             end in (_ = x)
             return
               (S x =
                (fix Ffix (x0 x1 : nat) {struct x0} : nat :=
                   match x0 with
                   | 0 => x1
                   | S x2 => S (Ffix x2 x1)
                   end) b 2)
           with
           | eq_refl =>
               match
                 plus_n_Sm b 1 in (_ = x)
                 return
                   (S
                      ((fix Ffix (x0 x1 : nat) {struct x0} : nat :=
                          match x0 with
                          | 0 => x1
                          | S x2 => S (Ffix x2 x1)
                          end) b 1) = x)
               with
               | eq_refl => eq_refl
               end
           end
         : forall b : nat, 2 + b = b + 2
    
    Bref: les formes normales des termes "plus_com x" varient en fonction de x (leur longueur dépend de x notamment).


    Lorsqu'on applique plus_com à 1 et 2 en revanche on obtient une preuve très courte de "1+2 = 2+1"
    Coq < Compute (plus_com 1 2).
         = match plus_n_Sm 2 0 in (_ = x) return (3 = x) with
           | eq_refl => eq_refl
           end
         : 1 + 2 = 2 + 1
    
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • christophe c écrivait :
    > Lui-même réutilisé dans un sens plutôt différent en catégorie.

    Christophe, peux-tu préciser ? Il me semble que tu aimes bien parler en négatif de choses que tu ne connais pas et que tu seras incapable de préciser.
  • @708, j'irai lire te essayer de retrouver le passage, ta citation est trop courte et je dois faire attention de ne pas trop utiliser l'ordi qui me nique les yeux sinon. Tu aurais pu copier coller un contexte plus long.

    @foys: merci pour ces détails très intéressants. Je ne connais pas tellement COQ, je le redis, et pour tout avouer, j'ai "faitma formation" à la CCH auprès de JLKrivine entre 2004 et 2006 quelque chose comme ça, j'allais discuter avec lui des heures dans son bureau. Je n'invente pas mes connaissances à la petite semaine sur ce sujet, il y a eu une investigation, même si j'ai une approche personnelle 15 ans plus tard.

    Pour ce queje me rappelle JLK était, euphémisme, très peu élogieux quant aux artisanalités très artificielles qui avaient présidé aux débuts de COQ, il charriait tout le temps ces projets où les gens "forcent" ce qui leur plaisent au lieu de poursuivre leurs recheches. Je me rappelle d'une phrase rigolote d'ailleurs "c'est très bien, ils prouvent que si le programme termine, il donne la bonne solution", et il éclatait de rire (évidemment le sous-entendu était qu'on produit facilement de tels programmes pour n'importe quel problème.

    Il était aussi assez agacé de la non-intégration de la réalisation du RPA et de son introduction ad-hoc comme hypothèse, disant, et m'ayant convaincu maintenant que je connais bien le sujet, que les reste (c'est à dire la partie intuitionniste de la CCH, ce qui est vrai) étant trivial, on ne voit pas trop en quoi ces activités, en dehors d'être évidemment des occasions de programmer des logiciel. Il m'a plusieurs fois dit que le théorème de Timothy Griffith GRIFFIN était pour lui la plus importante découverte depuis Godel, et il faut reconnaitre qu'il a raison qu'on ne le retrouve nulle part exploité dans les applications (ce qui me semble à moi aussi un peu stéril: à quoi sert de ne pas implémenter le seul truc non trivial du domaine?? :-S )

    Tu as le mérite de le rappeler: COQ est fortement normalisant!!!! Autrement dit, il n'assume que ce qui ne pose aucun problème et n'a pas grand intérêt "supplémentaire" par rapport aux prouveurs que j'ai pu mille fois programmer les dimanche de pluie. Maintenant, d'accord, c'est un projet abouti, avec des adeptes, des habitués, etc, donc il ne me viendrait pas à l'idée de contester la popularité de COQ. Voilà à peu près ce que je peux dire, et je pense avoir "tout donné" :-D

    Maintenant, bien évidemment, ce n'est pas en me donnant COQ comme exemple d'outil logiciel qui relie un produit $\pi_x R(x)$ à $\forall xR(x)$, que je vais changer de discours (enfin amender mon post précédent). La seule chose que ça fait, c'est que ça me confirme que JL avait raison 15ans plus tard , bon bin, me voilà ravi de ce voyage dans mes souvenirs. Tu m'aurais dit que COQ utilise la réalisabilité de JLK, là oui j'aurais pensé à une coopération entre acteurs de cette spécialité.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • Du coup ils ont inventé le "fameux mot usine à gaz" : typer. Lui-même réutilisé dans un sens plutôt différent en catégorie.

    qui a écrit
    708 a écrit:
    Christophe, peux-tu préciser ? Il me semble que tu aimes bien parler en négatif de choses que tu ne connais pas et que tu seras incapable de préciser.

    1/ Je ne suis pas sûr de comprendre de manière autrement qu'impressionniste ton évocation de ma négativité à l'égard de ce que je ne connais pas. D'autant que je suis souvent le premier à critiquer une telle attitude, donc, je devrais me critiquer moi-même (ce qui n'a rien de contradictoire)

    2/ Dans le cas présent, c'est une telle évidence que je ne comprends pas ta demande: en catégorie les types sont des objets tout à fait sémantiques, et donnés par la catégorie elle-même que tu observes, alors que mon évocation du typage dans le post au passage que tu évoques est une évocation de commentaires extérieurs dans les programmes (par exemple en caml, un commentaire s'écrit entre "(*" et "*)" sauf erreur de ma part. Et même les types "officiels de CAML n'ont rien à voir avec des commentaires, pas besoin d'aller jusqu'aux catégories.

    Ca ne fait pas de moi pour autant un expert es catégories, je le précise bien, je ne revendique rien ici. Je réponds juste à ta demande.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • CC a écrit:
    Il m'a plusieurs fois dit que le théorème de Timothy Griffith était pour lui la plus importante découverte depuis Godel

    Quel théorème ? Il n'y aucun résultat Google en tapant Timothy Griffith math, logic ou autre...
  • Je crois que c'est Griffin, et non Griffith.
  • Un grand merci à vous 2, je corrige (je n'arrive jamais à me rappeler, je ne cherche même plus, j'y vais au bluff à chaque fois maintenant. J'ai trop souvent permuté !!
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • Le théorème de Griffin (Timothy) dit que le RPA est "constructif" au sens où on peut le réaliser informatiquement. Il s'agit de l'instruction qui essaie et revient (try... finally)

    En caml par exemple (je le fais à types fixes):

    exception Stop of int;;

    let bluff x = raise (Stop x);;

    let callCC u = try u bluff with | Stop x-> x;;


    qui (la fonction callCC) appliquée à une $u$ de type $(int \to A) \to int$, renverra une valeur de type $int$, réalisant ainsi le théorème classique, mais pas intuitionniste: ((A\to int)\to int)\to int

    [size=x-large]$$ ([int\to A]\to int)\to int $$[/size]
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • Christophe c a écrit:
    le théorème classique, mais pas intuitionniste: $((A\to int) \to int)\to int$

    J'aimerais bien en voir une preuve. ;-)
  • Oula, merci alesha, c'est quoi ce prodige, qu'est-ce que j'ai bricolé?????? :-S Me vla devenant dyslexique, manquait plus que ça.

    Je corrige la coquille, merci.
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
  • Bon, ouf au comptage, c'étaient deux symboles inversés (mais quand j'ai lu, j'ai eu peur :-D )
    Aide les autres comme toi-même car ils sont toi, ils sont vraiment toi
Connectez-vous ou Inscrivez-vous pour répondre.