Les ordinateurs sont-ils logiques ? 2 : Logique des prédicats

vendredi 8 janvier 2010
par  Alain BUSSER

Le logiciel CoqIde ressemble à un environnement de programmation mais son moteur est Coq, un logiciel libre qui permet de faire des déductions dans la logique des prédicats. L’article qui suit ressemble à un tutoriel pour Coqide, tout simplement parce qu’un tel tutoriel n’existe pas !

Propositions

Comme dans l’article précédent, CoqIde permet aussi de faire du calcul propositionnel. Par exemple, si on veut savoir si une proposition peut être à la fois vraie et fausse, on peut demander à CoqIde de le démontrer sous la forme d’un théorème que l’on va appeler Th1, et dont l’énoncé sera que pour toute proposition p, on ait p \wedge \neg p :

PNG - 19.7 ko

Les deux doubles-points ont des sens différents, le premier sépare le nom du théorème de son énoncé, et le deuxième signifie « de type » ; ainsi p est de type Prop c’est-à-dire que c’est une proposition. En effet le plus gênant pour l’utilisation de Coq dans l’enseignement secondaire est que celui-ci est basé sur la théorie des types... On constate la coloration syntaxique.

Pour essayer de faire démontrer le théorème Th1, on clique sur la flèche bleue qui va vers le bas, ce qui produit l’effet suivant :

PNG - 25.1 ko

On voit que la ligne courante est coloriée en vert, et que à droite CoqIde commence à élaborer une stratégie de démonstration (choisir entre le raisonnement par cas, la démonstration par récurrence etc.). Il énumère les sous-buts, ici il n’y en a qu’un. Pour choisir une stratégie de démonstration, on peut cliquer sur l’entrée « tactics » du menu mais il y en a des dizaines dont toutes ne sont pas forcément adéquates (par exemple, la théorie des anneaux semble peu appropriée ici). Alors une liste de stratégies de démonstrations par défaut est proposée par CoqIde (dans l’ordre, CoqIde cherche si le théorème à démontrer est trivial, puis si c’est une tautologie, puis essaye de démontrer par recherche automatique de stratégie, puis par une tactique nommée Omega, puis par une tactique récursive, et à défaut par la logique intuitionniste). Le meilleur moyen de tester tout ça est de cliquer sur l’icône représentant une lampe, ce qui produit cet effet :

PNG - 25.4 ko

Le mot « Intuition » écrit par CoqIde montre que celui-ci a testé toutes ses stratégies de démonstration : La première par exemple a échoué. La réponse apparaît dans le cadre de droite : p\wedge \neg p est faux.

Si maintenant on cherche à regarder ce que CoqIde pense du principe du tiers exclu, on constate qu’il échoue même avec la stratégie « tauto » :

PNG - 28.4 ko

Tout ce qu’il a réussi à faire, c’est remplacer \neg p par p \Rightarrow \bot et c’est tout. Ceci ne signifie pas que CoqIde est bogué mais que la logique intuitionniste refuse le tiers exclu. De même, la double négation n’équivaut pas à une affirmation en logique intuitionniste. Sous CoqIde on vérifie avec

Theorem T1: forall p: Prop, p->~~p.

CoqIde répond dès la stratégie Tauto par l’affirmative (démonstration complétée) alors qu’avec

Theorem T2: forall p: Prop, ~~p->p.

CoqIde transforme l’hypothèse du « théorème » en \left(p\Rightarrow \bot\right)\Rightarrow \bot et s’arrête sur p à l’étape « Intuition », ce qui confirme que pour CoqIde \neg\neg p \Rightarrow p n’est pas un théorème alors que p \Rightarrow \neg\neg p est un axiome...

Ceci est bien sûr très gênant parce que, avec un tel choix, la logique intuitionniste s’interdit le raisonnement par l’absurde ; on verra dans le prochain onglet que le raisonnement par contraposition est également inaccessible à CoqIde. Le problème est ancien : Déjà à l’époque de Prolog, on pratiquait la négation par l’échec... Une solution serait de rajouter la double négation comme axiome (la contraposition en découlera alors) avec un Axiom DoubleNeg : forall p q : Prop, ~~p->p

Les autres exemples de l’article sur la logique propositionnelle peuvent être traités sous CoqIde à titre d’exercice, ne serait-ce que pour voir lesquels sont traités à l’identique en logique intuitionniste, et lesquels ne le sont pas...

Prédicats

Pour tester CoqIde sur un problème faisant intervenir la logique des prédicats, on va utiliser un exemple extrait du cours de Logique sans peine de Lewis Carroll :

Les bébés sont illogiques ;
Nul n’est méprisé s’il peut venir à bout d’un crocodile ;
Les gens illogiques sont méprisés.

La question que posait Lewis Carroll était « Que peut-on en déduire ? ».

On imagine l’ensemble X des humains, et les propriétés bebe, logique, meprise et champion définies sur X avec les significations suivantes :

  • bebe(x) signifiant que x \in X est un bébé ;
  • logique(x) signifiant que x \in X est logique ;
  • meprise(x) signifiant que x \in X est méprisé (on évite les accents par prudence) ;
  • champion(x) signifiant que x \in X peut venir à bout d’un crocodile.

L’énoncé de Lewis Carroll se traduit alors par

\begin{array}{l}\forall x \in X, bebe(x) \Rightarrow \neg logique(x) \\ \forall x \in X, champion(x) \Rightarrow \neg meprise(x) \\ \forall x \in X,  \neg logique(x) \Rightarrow meprise(x) \end{array}

La transitivité de l’implication permet alors, à partir des affirmations 1 et 3, d’obtenir \forall x \in X, bebe(x) \Rightarrow meprise(x) (on a déjà démontré que les bébés sont méprisés !). Mais la deuxième hypothèse de l’énoncé donne par contraposition \forall x \in X, meprise(x)\Rightarrow \neg champion(x) (si quelqu’un est méprisé, c’est qu’il ne peut venir à bout d’un crocodile). Récapitulons :

\begin{array}{l} \forall x \in X, bebe(x) \Rightarrow meprise(x)  \\ \forall x \in X, meprise(x)\Rightarrow \neg champion(x) \end{array}

On en déduit alors \forall x \in X, bebe(x) \Rightarrow \neg champion(x) : Aucun bébé ne peut venir à bout d’un crocodile.

Sous CoqIde, on doit d’abord déclarer la variable X de type ensemble, par Variable X : Set ; puis les prédicats bebe etc. sont définis comme des fonctions de X dans l’ensemble des propositions ; en effet pour tout humain x \in X, ou bien x est un bébé, ou bien x n’est pas un bébé : On associe bien une proposition à chaque humain. Ensuite les trois phrases de l’énoncé sont écrites comme des axiomes A1, A2 et A3. Enfin la phrase \forall x \in X, bebe(x) \Rightarrow \neg champion(x) prend le statut de théorème à démontrer :

PNG - 71.9 ko

Las ! Non seulement CoqIde n’arrive pas à le démontrer, mais en plus il déclare la phrase comme fausse ! (voir l’onglet précédent pour une explication de ce phénomène)

Pour ne pas terminer cet onglet sur un échec, on va voir ce que dit CoqIde sur la propriété suivante :

Si le carré de tout entier est positif, alors le carré de 2 est positif

En notant par magique(n) le fait que n^2\geqslant 0 alors on veut démontrer que \left(\forall n \in \N, n^2\geqslant 0 \right)\Rightarrow \left(2^2\geqslant 0\right) (certes, il y a des manières plus simples de démontrer que 4 est positif...). Dans CoqIde, l’ensemble des entiers naturels est noté nat :

PNG - 28.4 ko

Parfait : CoqIde considère la propriété comme triviale.

Existence

En notation abrégée,

\neg\left( \forall x, P(x)\right) \right)\Leftrightarrow \left(\exists x, \neg P(x) \right)

Cet extrait du livre Coq’Art montre que CoqIde sait montrer la propriété ci-dessus mais avec Intuition la démonstration n’aboutit pas ; et trouver manuellement la suite de tactiques menant à la démonstration n’est pas facile (il faut pas mal d’expérience en Coq pour penser à ça !).

Du coup, la simple démonstration de propriétés comme

\left(\forall x, P(x)\right)\Rightarrow\left(\exists x, P(x)\right)

devient un exercice intéressant mais difficile ; et l’analyse de cette propriété en classe risque d’être riche en surprises !

Idem pour

\left( \exists x,y , P(x)\wedge Q(y) \right) \Rightarrow \left((\exists x, P(x))\wedge(\exists y, Q(y)) \right)

ou sa réciproque...

Un autre grand classique : La différence qu’il y a entre \forall x, \exists y, R(x,y) et \exists y, \forall x, R(x,y)...

Algorithmique

Sous Ubuntu, le lanceur de CoqIde se trouve à côté de ceux d’Eric et de Scratch, c’est parce que c’est un IDE donc a priori fait pour écrire des programmes. Ceci dit les fonctionnalités de CoqIde ne le rendent pas spécialement propice à la programmation en lycée. En effet le logiciel CoqIde est écrit en CamL et est donc un langage fonctionnel basé sur la récursivité (hors programme). Cependant l’excellent livre de Guillaume Connan sur l’algorithmique comprend une foule d’exercices dont la moitié en CamL...

Voyons toutefois comment on peut définir et calculer les deux suites u_n=2n+3 et v_n, arithmétique de premier terme v_0=3 et de raison 2. En Coq, une fonction s’appelle un Fixpoint (l’héritage d’Haskell Curry), alors on écrit Fixpoint u(n:nat) :nat :=2*n+3. pour dire que u est une fonction dont la variable n est entière, dont l’ensemble d’arrivée est \N et par laquelle l’image de n est 2n+3. Alternativement, on aurait pu déclarer u comme une fonction de \N dans \N par Definition u := fun (n: nat) => 2*n+3..

Après pour calculer u_3 on peut écrire Eval compute in u(3) ou cliquer sur « Queries » et là, choisir « eval compute in » puis entrer « u(3) » :

PNG - 26.3 ko

Pour définir la suite v_n qui est récurrente, c’est un peu plus compliqué :

PNG - 35.2 ko

La notation S(k) désigne k+1 (le « successeur » de k). On voit avec le « query » que v_3=u_3 mais ceci ne prouve pas que u_n=v_n pour tout n. Mais CoqIde est un outil de preuve alors autant essayer de prouver cette égalité avec quantificateur : \forall n \in \N, u_n=v_n. Le théorème s’appellera suites :

PNG - 26.6 ko

En essayant toutes sortes de tactiques (entrée « try tactics » du menu) la seule qui donne quelque chose est induction : La récurrence sur n ; on voit ci-dessus l’étape d’initiation de la récurrence : Le début c’est de prouver que u_0=v_0. La tactique trivial donne immédiatement ce résultat (3=3) :

PNG - 26.5 ko

On voit maintenant que l’hypothèse de récurrence s’appelle Hn et que c’est u_n=v_n (en haut à droite). On voit aussi qu’il reste à démontrer que u_{n+1}=v_{n+1} (en effet n+1 se note Sn comme on l’a vu plus haut).

Hélas pour continuer la récurrence il faut charger d’autres théories (au moins l’arithmétique de Peano) faute de quoi CoqIde ne trouve pas spontanément la démonstration. Alors la voici : Puisque u_n=v_n alors u_{n+1}=2(n+1)+3=2n+2+3=2n+3+2=u_n+2=v_n+2=v_{n+1}

Conclusion

Faire des démonstrations avec CoqIde, ça a l’air encore plus compliqué que les faire de tête ; est-ce à dire que son usage n’est pas recommandé au lycée ?

  • Oui puisque ce logiciel utilise la logique intuitionniste qui n’est pas au programme du lycée ;
  • Mais tout de même, il a déjà servi, notamment en géométrie. Un outil analogue à CoqIde mais en ligne s’appelle Coqweb et se trouve sur le serveur wims. Son intérêt est que chaque fois qu’un élève réussit à démontrer un nouveau théorème avec Coqweb, le théorème est ajouté à une base de données qui par suite va s’agrandir et Coqweb va devenir de plus en plus puissant. C’est par ce processus que le logiciel de théorie des types ScratchPad est devenu le logiciel de calcul formel Axiom...

Commentaires

Brèves

Histoire de la comptabilité

vendredi 28 décembre 2012

Sur ce site (en anglais) dédié à la comptabilité, on trouve des informations intéressantes sur l’histoire et les pratiques de ce domaine, qui peuvent être utiles aux professeurs enseignant des mathématiques financières (et aussi aux autres...).

La CGE et la réforme des lycées

lundi 16 janvier 2012

La Conférence des Grandes Écoles publie 19 préconisations pour la réforme du lycée.

Sur le Web : Les 19 préconisations

Pratique des mathématiques en série STD2A

lundi 16 janvier 2012

Le site de l’IGEN offre des recommandations et des ressources pour enseigner les mathématiques en série STD2A. Les thèmes abordés (couleurs et nuances de gris, arcs et architecture, jeux vidéos, photo et tableur, perspectives parallèles...) sont de nature à donner aussi des idées d’activités aux enseignants des autres séries !

En cheminant avec Kakeya

lundi 16 janvier 2012

Un livre (à télécharger) de Vincent Borelli et Jean-Luc Rullière qui présente le calcul intégral et la dérivation en s’appuyant sur la question de Kakeya. Pour les lycéens, les étudiants et tous les esprits curieux qui souhaitent voir les mathématiques sous un jour différent.

Sur le Web : Livre à télécharger

Bicentenaire Galois

lundi 12 septembre 2011

À l’occasion du bicentenaire de la naissance d’Évariste Galois (1811-2011), l’Institut Henri Poincaré et la Société mathématique de France organisent un ensemble de manifestations et proposent un site contenant diverses ressources documentaires susceptibles d’intéresser les enseignants.