Fonctions caractéristiques

Cette page contient des exercices mettant en valeur les fonctions comme capables de représenter des données. L’exemple mis en place ici est celui des fonctions caractéristiques, et est décliné en deux parties, la première permettant de représenter des ensembles de points du plan, la seconde portant sur une application de gestion de listes de lectures de fichiers musicaux.

1ère partie : les fonctions caractéristiques

Soit $E$ un ensemble (de points du plan, de fichiers, d’espèces animales …). Une fonction caractéristique est simplement une fonction qui prend un paramètre $x$, et répond True si $x \in E$ et False sinon. Par exemple, la fonction suivante représente l’ensemble contenant tout :

def set_all(x):
	return True

Il s’agit d’un exemple simple de représentation des données par des fonctions. Ici, la donnée, i.e l’ensemble, est identifié à sa fonction caractéristique. Avec cet exemple, il est possible d’écrire en Python la fonction représentant l’ensemble vide. Noter que l’on peut restreindre l’usage de cette fonction à un ensemble particulier. Par exemple, si on considère que $x$ est restreint au points du plan, alors les ensembles que l’on va représenter seront des ensembles de points du plan.

Une fois qu’on a une fonction caractéristique s, il est facile de vérifier si x appartient à l’ensemble s : il suffit d’appliquer s (en tant que fonction) à x ! Ca donne ce genre de choses :

def belongs(s, x):
    return s(x)

Avec ça, on peut commencer à construire des ensembles non triviaux :

ens = {1,2,3}
s = lambda x : x in ens
belongs(s,1) # -> True
belongs(s,0) # -> False

Écrire la fonction représentant le singleton $x$ est déjà plus compliqué, puisque l’on désire une fonction qui prend en paramètre $x$ et renvoie une fonction caractéristique. Compléter le code suivant :

def set_single(x):
	return lambda y: (?? == ??)

Écrire une fonction qui prend un ensemble, et renvoie son complémentaire. Écrire une fonction qui prend deux ensembles, et renvoie son intersection, et une autre pour son union. Écrire une fonction qui prend un ensemble $E$ et un paramètre $x$, et renvoie l’ensemble $E \cup \{x\}$.

2ème partie : les ensembles de points du plan

Considérons la possibilité de dessiner des ensembles de points du plan, avec la bibliothèque matplotlib. Dans les exemples qui suivent, les points du plan sont des paires $(x,y)$. Par exemple, la fonction suivante permet de produire un dessin à partir d’un ensemble :

import numpy as np
import matplotlib.pyplot as mp

def set_display_2d_generic(c1, c2, n, s):
    """ Draw a set s with matplotlib inside a window
        c1 is the lower left point
        c2 is the upper right point
        n is the number of divisions """
    h1 = (c2[0] - c1[0]) / n
    h2 = (c2[1] - c1[1]) / n
    m = np.zeros((n,n))
    for i in range(n):
        for j in range(n):
            m[i,j] = 1 if s((c1[1] + j * h2,
                             c2[0] - i * h1)) else 0
    mp.imshow(m,extent=[c1[0],c2[0],c1[1],c2[1]])
    mp.show()

def set_display_2d(s):
    set_display_2d_generic((0,0), (10,10), 200, s)

Les ensembles dessinés à l’aide de set_display_2d sont affichés dans le carré d’extrémités $(0,0)$ et $(10,10)$.

PacMan

Écrire une fonction de distance euclidienne entre les points définis précédemment. Écrire la fonction caractéristique d’un disque centré sur un point $c$ de rayon $r$. Écrire la fonction d’un rectangle défini par ses deux extrémités $(gauche,bas)$ et $(droite, haut)$. Dessiner un Pac-Man.

Difficile Si le Pac-Man vous a semblé trop facile, voici un petit challenge à réaliser avec la même bibliothèque :

Moire

(ce n’est pas trivial à réaliser, il faut écrire quelques fonctions de transformations géométriques, comme une opération de rotation d’un ensemble)

3ème partie : les listes de lectures

Telles quelles, les fonctions caractéristiques gardent un parfum “mathématique”. Une application des ensembles de points consiste à manipuler des ensembles de fichiers (ici musicaux) répondant à un certain nombre de critères.

songs = [ \
{ "title": "Walking on Broken Glass", "artist": "Annie Lennox", "album": "Diva", "track": 2, "genre": "pop rock" },
{ "title": "Roar", "artist": "Katy Perry", "album": "PRISM", "track": 1, "genre": "power pop" },
{ "title": "Don't Wanna Fight", "artist": "Alabama Shakes", "album": "Sound & Color", "track": 2, "genre": "blues rock" },
{ "title": "Grace Kelly", "artist": "Mika", "album": "Life in Cartoon Motion", "track": 1, "genre": "glam rock" },
{ "title": "Don't Stop Me Now", "artist": "Queen", "album": "Jazz", "track": 6, "genre": "pop rock" },
{ "title": "Black Pearls", "artist": "Apollo Brown", "album": "Clouds", "track": 7, "genre": "hip hop underground" },
]

(le choix des morceaux dans cette liste a été aimablement fourni par une playlist aléatoire d’un site de musique en ligne, dans des conditions d’exercice, on pourrait demander à chaque élève de produire une musique, et les mettre ensemble)

Écrire une requête représentant l’ensemble des morceaux dont le genre contient la chaîne "rock". Écrire une requête représentant l’ensemble des morceaux dont le titre débute par "Don't".

Écrire une fonction prenant une requête, et générant une liste de lecture de morceaux répondant à cette requête.