summaryrefslogtreecommitdiffstats
path: root/exercices-inf110.tex
diff options
context:
space:
mode:
Diffstat (limited to 'exercices-inf110.tex')
-rw-r--r--exercices-inf110.tex109
1 files changed, 109 insertions, 0 deletions
diff --git a/exercices-inf110.tex b/exercices-inf110.tex
index 7b163fd..14cf4cf 100644
--- a/exercices-inf110.tex
+++ b/exercices-inf110.tex
@@ -1704,6 +1704,115 @@ la portée de définition de la fonction dans un langage fonctionnel.
\end{corrige}
+%
+%
+%
+
+\section{Correspondance de Curry-Howard}
+
+
+\exercice\ (${\star}{\star}$)\par\nobreak
+
+Pour chacune des preuves suivantes écrites informellement en langage
+naturel dans le calcul propositionnel, écrire le $\lambda$-terme de
+preuve (c'est-à-dire le terme du $\lambda$-calcul propositionnel
+simplement typé étendu d'un type $\bot$ ayant pour type la proposition
+prouvée) qui lui correspond. Ces raisonnements sont-ils
+intuitionnistement valables ? Qu'en conclut-on ?
+
+\textbf{(a)} On va prouver $\neg\neg(A\Rightarrow B) \Rightarrow
+\neg\neg A\Rightarrow\neg\neg B$. Pour cela, supposons
+$\neg\neg(A\Rightarrow B)$ et $\neg\neg A$ et $\neg B$ et on veut
+arriver à une contradiction. Supposons $A\Rightarrow B$. Alors si on
+a $A$, on a $B$, ce qui contredit $\neg B$ ; donc $\neg A$ : mais ceci
+contredit $\neg\neg A$. Donc $\neg(A\Rightarrow B)$. Mais ceci
+contredit $\neg\neg(A\Rightarrow B)$, comme annoncé.
+
+\textbf{(b)} On va prouver $(A\Rightarrow\neg\neg B) \Rightarrow
+\neg\neg(A\Rightarrow B)$. Supposons $A\Rightarrow\neg\neg B$ ainsi
+que $\neg(A\Rightarrow B)$ et on veut arriver à une contradiction. Si
+on a $B$, alors certainement $A\Rightarrow B$, ce qui contredit
+$\neg(A\Rightarrow B)$ : ceci montre $\neg B$. Si on a $A$, alors
+notre hypothèse $A\Rightarrow\neg\neg B$ nous donne $\neg\neg B$, d'où
+une contradiction, et notamment $B$. On a donc prouvé $A\Rightarrow
+B$, d'où la contradiction recherchée.
+
+\textbf{(c)} On va prouver $(\neg\neg A\Rightarrow\neg\neg B)
+\Rightarrow (A\Rightarrow\neg\neg B)$. Mais on sait que $A$ implique
+$\neg\neg A$, donc $\neg\neg A \Rightarrow C$ implique $A\Rightarrow
+C$ (quel que soit $C$, et notamment pour $\neg\neg B$).
+
+\begin{corrige}
+\textbf{(a)} On commence par se placer avec $f_1:\neg\neg(A\Rightarrow
+B)$ et $x_1:\neg\neg A$ et $k:\neg B$ dans le contexte. Appelons
+encore $f_0$ l'hypothèse $A\Rightarrow B$. Le raisonnement « si on a
+$A$, on a $B$, ce qui contredit $\neg B$ » se formalise par le
+$\lambda$-terme $\lambda(x_0:A). k(f_0 x_0)$ de type $\neg A$ ; le
+« mais ceci contredit $\neg\neg A$ » s'obtient en lui appliquant
+$x_1$. Le $\lambda$-terme $\lambda(f_0:A\Rightarrow B).\,
+x_1(\lambda(x_0:A). k(f_0 x_0))$ est donc de type $\neg(A\Rightarrow
+B)$, et la contradiction avec $\neg\neg(A\Rightarrow B)$ s'exprime en
+lui appliquant $f_1$. Finalement, le $\lambda$-terme tout entier (de
+type $\neg\neg(A\Rightarrow B) \Rightarrow \neg\neg
+A\Rightarrow\neg\neg B$) est :
+\[
+\lambda(f_1:\neg\neg(A\Rightarrow B)).\,
+\lambda(x_1:\neg\neg A).\,\lambda(k:\neg B).\,
+f_1(\lambda(f_0:A\Rightarrow B).\,
+x_1(\lambda(x_0:A). k(f_0 x_0)))
+\]
+(ou en syntaxe Coq : \texttt{fun (f1 : \textasciitilde
+ \textasciitilde(A->B)) (x1 : \textasciitilde\textasciitilde A) (k :
+ \textasciitilde B) => f1 (fun f0 : A -> B => x1 (fun x0 : A => k (f0
+ x0)))}).
+
+\textbf{(b)} On commence par se placer avec $f_1:A\Rightarrow \neg\neg
+B$ et $k:\neg(A\Rightarrow B)$ dans le contexte. Appelons $y$
+l'hypothèse $B$ : alors $\lambda(z:A).y$ est de type $A\Rightarrow B$,
+donc $k(\lambda(z:A).y)$ est de type $\bot$, ainsi
+$\lambda(y:B).k(\lambda(z:A).y)$ est de type $\neg B$. Appelons $x$
+l'hypothèse $A$ : alors $f_1 x$ montre $\neg\neg B$, donc en
+l'appliquant au $\lambda$-terme $\lambda(y:B).k(\lambda(z:A).y)$
+précédemment trouvé on trouve une contradiction, et
+$\texttt{exfalso}^{(B)}(f_1 x \, \lambda(y:B).k(\lambda(z:A).y))$ est
+de type $B$. En abstrayant $x$ dans ce terme on a un terme de type
+$A\Rightarrow B$, et en lui appliquant $k$ on a la contradiction
+recherchée. Finalement, le $\lambda$-terme tout entier (de type
+$(A\Rightarrow\neg\neg B) \Rightarrow \neg\neg(A\Rightarrow B)$) est :
+\[
+\lambda(f_1:A\Rightarrow \neg\neg B).\,
+\lambda(k:\neg(A\Rightarrow B)).\,
+k(\lambda(x:A).\,\texttt{exfalso}^{(B)}(f_1 x \, \lambda(y:B).k(\lambda(z:A).y)))
+\]
+(ou en syntaxe Coq : \texttt{fun (f1 : A -> \textasciitilde
+ \textasciitilde B) (k : \textasciitilde (A->B)) => k (fun x : A =>
+ False\_ind B (f1 x (fun y : B => k (fun z : A => y))))}).
+
+\textbf{(c)} La preuve de $A \Rightarrow \neg\neg A$ s'écrit
+$\lambda(x:A).\lambda(k:\neg A).kx$. La preuve de $A\Rightarrow C$ à
+partir de $\neg\neg A \Rightarrow C$ s'obtient en composant avec cette
+fonction, donc finalement le $\lambda$-terme tout entier (de type
+$(\neg\neg A\Rightarrow\neg\neg B) \Rightarrow (A\Rightarrow\neg\neg
+B)$) est :
+\[
+\lambda(f_1:\neg\neg A\Rightarrow \neg\neg B).\,
+\lambda(x:A).f_1(\lambda(k:\neg A).kx)
+\]
+(ou en syntaxe Coq : \texttt{fun (f1 : \textasciitilde\textasciitilde
+ A -> \textasciitilde\textasciitilde B) (x : A) => f1 (fun k :
+ \textasciitilde A => k x)}).
+
+Les trois raisonnements sont parfaitement valables intuitionnistement
+(malgré les nombreux « supposons (...), contradiction », il s'agit à
+chaque fois de \emph{preuves de négation} et pas de \emph{preuves par
+l'absurde}) : le fait qu'on ait trouvé des $\lambda$-termes (sans
+aucun call/cc dedans) de ces types le montre.
+
+On peut retenir la conclusion que $\neg\neg(A\Rightarrow B)$,
+$\neg\neg A\Rightarrow\neg\neg B$ et $A\Rightarrow\neg\neg B$ sont
+tous les trois équivalents (en logique intuitionniste).
+\end{corrige}
+
%
%