<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>philippewang.info</title>
    <link>http://philippewang.info/</link>
    <description>
Le Lambda Calcul... en express
</description>
    <language>fr</language>
    <generator>BASHGXD Another Super HTML Generator XD</generator>
    <item>
    <guid>http://philippewang.info/cs.lambdacalculus.xml</guid>
      <title>
Le Lambda Calcul... en express
</title>
      <link>http://philippewang.info/cs.lambdacalculus.htm</link>
      <pubDate>Mon, 5 Feb 2007 01:37:08 +0100</pubDate>
      <description><![CDATA[
<!-- BODY - N LINES -->
<div>
  <h1>Le Lambda Calcul en moins de 5 (?) minutes... (QUICK DRAFT)</h1>

  <h2>Introduction</h2>
  Le lambda calcul est un langage de programmation fonctionnel Turing-complet.
  Il sert à comprendre certains fondements de la programmation.

  <h2>Syntaxe</h2>
  Il existe plusieurs syntaxes pour ce langage. 
  En voici <strong>une</strong>...

  <h3>Variable</h3>
  Une variable est un mot composé de lettres. En général on limite les lettres
  de l'alphabet (a à z). Certaines syntaxes proposent que les noms de variables
  tiennent sur un seul caractère.

  <h3>Abstraction</h3>
  <p>
    <span>\</span> et <span>.</span> permettent de définir une abstraction.
    Équivalents Objective Caml : mots-clef <span>fun</span>
    et  <span>-></span>
    (c'est un choix arbitraire ! 
    Si la touche <span>λ</span>
    (il y a marqué la lettre grecque lambda, je précise pour
    ceux qui ne peuvent pas afficher les lettres grecques) 
    était disponible sur le clavier de tout le monde, 
    on utiliserait cette lettre à la place de <span>\</span> 
    ou de <span>,\</span> etc.)
  </p>
  <p>
    exemple : <span>\</span>x<span>.</span>x
  </p>

  <h3>Application</h3>
  <span>(</span> et <span>)</span> 
  Les parenthèses permettent de définir l'application.
  Équivalents Objective Caml : c'est la même chose. Sauf qu'en Objective Caml
  les parenthèses ne sont pas toujours obligatoires.
  <p>
    exemple : <span>(</span>a b<span>)</span>
  </p>


  <h4>Remarque</h4>
  <p>
    Rappelons que cette syntaxe est une syntaxe parmi d'autres.
    Ensuite, notons qu'il est utile d'autoriser les parenthèses autour des
    définitions d'abstractions. Notons également qu'il est prudent d'imposer
    les parenthèses autour des applications.
    (tout ça dans le but de simplifier l'analyse syntaxique)
  </p>
  <p>
    Limiter les variables à un seul caractère permet d'écrire
    <span>\</span>xzy<span>.</span><span>(</span>x y z<span>)</span>
  </p>


  <h2>Exemples</h2>
  <table>
    <tr><th>Lambda-Calcul</th><th>Objective Caml</th></tr>
    <tr>
      <td>
	\x.x
      </td>
      <td>
	fun x -> x
      </td>
    </tr>
    <tr>
      <td>
	(a b)
      </td>
      <td>
	(a b)
      </td>
    </tr>
    <tr>
      <td>
	((\x.x) 42)
      </td>
      <td>
	(fun x -> x) 42
      </td>
    </tr>
    <tr>
      <td>
	(\x.x 42) <span>Attention, cette notation peut souvent signifier autre chose avec une autre syntaxe</span>
      </td>
      <td>
	(fun x -> x) 42
      </td>
    </tr>
    <tr>
      <td>
	(\x y z. x z y) (\x.x) (\x.(x 42)) (\y z.(y z))
      </td>
      <td>
	(fun x y z -> x y z) (fun x -> x) (fun x -> x 42) (fun y z -> y z)
      </td>
    </tr>
  </table>

  <strong>Si vous avez compris ça, vous avez compris la syntaxe du lambda-calcul... </strong>


  <h2>Structures de données</h2>
  Le lambda-calcul permet de représenter des données avec des fonctions !
  (il le faut bien, puisqu'il est Turing-complet)

  <h2>Booléens</h2>
  <p>
    <strong>Voici un codage possible des booléens, parmi d'autres !</strong>
  </p>
  <table>
    <tr>
      <th>Valeur représentée</th>
      <th>Codage</th>
    </tr>
    <tr>
      <td>TRUE</td>
      <td>\x y.x</td>
    </tr>
    <tr>
      <td>FALSE</td>
      <td>\x y.y</td>
    </tr>
    <tr>
      <td>IFTHENELSE</td>
      <td>\x y z.(x y z)</td>
    </tr>
    <tr>
      <td>IFTHENELSE COND A B</td>
      <td>(\x y z.(x y z)) COND A B</td>
    </tr>
  </table>

  <h3>Choix de codage</h3>
  Le codage des booléens proposé ci-dessus est arbitraire.
  En BASH, le code de retour 0 signifie que l'application a bien
  terminé. Ce qui correspond à TRUE.
  En C, 0 est équivalent à FALSE, et tous les autres entiers sont
  équivalents à TRUE.
  En Lambda-Calcul, vous avez le choix puisque c'est un langage
  un peu "vide"... en revanche il vous permet de coder n'importe
  quelle donnée (mais à vous de définir la représentation et les
  opérations associées à ces données)

  <h2>Alpha conversion</h2>
  <p>
    Deux lambda-termes sont alpha-équivalents signifie qu'ils calculent
    exactement la même chose.
  </p>
  Par exemple :
  <p>\x.x et \y.y calculent exactement la même chose.</p>
  
  <p>\a.(a b) et \a.(a c) ne calculent pas forcément exactement la même
  chose. Il faut prouver que b et c sont pareils pour pouvoir dire 
  que les deux termes sont alpha-équivalents</p>
  
  <h2>Beta réduction</h2>
  <p>
    La beta-reduction, c'est pour réduire (attention parfois ça agrandi...)
    les lambda-termes. S'il existe une beta-réduction qui permet de passer
    d'un terme A à un terme B, alors A et B calculent la même chose.
  </p>
  Par exemple :
  <p>
    ((\x.x) a) se beta-réduit en a
  </p>
    
  <h1>Aller plus loin</h1>
  Pour aller plus loin, il existe de nombreuses sources
  plus complètes et plus techniques sur le sujet ;-)
  
  <ul>
    <li>
      Lambda calcul pur (M2 UPMC) :
      <div><a href="http://www-calfor.lip6.fr/~chaillou/Public/enseignement/2006-2007/tep/public/COURS/COURS1.pdf">http://www-calfor.lip6.fr/~chaillou/Public/enseignement/2006-2007/tep/public/COURS/COURS1.pdf</a></div>
    </li>
    <li>
      Lambda calcul simplement typé (M2 UPMC) :
      <div><a href="http://www-calfor.lip6.fr/~chaillou/Public/enseignement/2006-2007/tep/public/COURS/COURS2.pdf">http://www-calfor.lip6.fr/~chaillou/Public/enseignement/2006-2007/tep/public/COURS/COURS2.pdf</a></div>
    </li>
    <li>
      Le cours de Conception de langages (M2 UPMC) :
      <div><a href="http://www.pps.jussieu.fr/~eleph/Enseignement/2006-07/CL/cl.pdf">http://www.pps.jussieu.fr/~eleph/Enseignement/2006-07/cl.pdf</a></div>
    </li>
    <li>
      Cours de lambda calcul par Jean Goubault-Larrecq :
      <div><a href="http://www.lsv.ens-cachan.fr/%7Egoubault/Lambda/lambda.pdf">http://www.lsv.ens-cachan.fr/%7Egoubault/Lambda/lambda.pdf</a></div>
    </li>
    <li>
      Théorie des types, par Gilles Dowek :
      <div><a href="http://www.lix.polytechnique.fr/~dowek/Cours/theories_des_types.ps.gz">http://www.lix.polytechnique.fr/~dowek/Cours/theories_des_types.ps.gz</a></div>
      (contient le lambda-pi calcul et le lambda-1 calcul)
    </li>
  </ul>
</div>
      ]]></description>
    </item>
  </channel>
</rss>

