
L3 ENS Cachan Programmation 2 13 mars 2017
TP5 Prog 2 : Continuations et générateurs à la
Python
Dans ce TP nous allons utiliser les continuations pour imiter un code python
à base de générateurs.
Votre but est de programmer en OCaml un équivalent du générateur de
permutations suivant :
def gen er at e (n) :
if n > 1:
for iin rang e (n -1) :
for sin g e ne ra te ( n - 1) :
yield s
if ( n % 2 == 0) :
yield (i , n - 1)
else :
yi el d (0 , n - 1)
for sin g ene rat e (n -1) :
yield s
def print_pe rm s (n ):
a = r ang e (n)
for (i , j ) in ge ne ra te ( n) :
print a
a[ i ] , a [j] = a[j ] , a [ i]
print_perms(n) va afficher toutes les permutations de {0, . . . , n −1}. Intui-
tivement, generate génère une suite de transpositions qui engendre toutes les
permutations. Plus précisément, cette suite de transpositions décrit un che-
min hamiltonien dans le graphe dont les sommets sont les permutations de
{0, . . . , n −1}et les arètes les paires de permutations égales à une transposition
près.
L’algorithme utilisé ci-dessus est dû à Heap (cf wikipedia). Pour ce TP, peu
importe de comprendre comment fonctionne cet algorithme.
Exercice 1 : premiers générateurs
On se fixe les types suivants
type cont = unit -> unit
type ’a succe ss = ’a -> cont -> unit
type fai lur e = cont
type ’a gen = ’a succ ess -> f ailur e - > unit
Intuitivement, un ’a gen est un générateur de valeurs de type ’a. Le premier
argument qu’il prend est une continuation de succès sk qui fait quelque chose
avec un agénéré et continue avec la continuation qu’on lui a spécifié. Le deuxième
argument d’un générateur est une continuation d’échec fk qui est appellée quand
il n’y a plus rien à générer. Les générateurs qui génèrent respectivement un et
aucun élément peuvent être définis ainsi :
1