• Aucun résultat trouvé

Glace vanille imp´erative

N/A
N/A
Protected

Academic year: 2022

Partager "Glace vanille imp´erative"

Copied!
65
0
0

Texte intégral

(1)

Glace vanille imp ´erative

1. S ´eparer les jaunes et les blancs de 2 œufs 2. Garder les blancs au r ´efrig ´erateur!

3. Ajouter

½

tasse de sucre aux jaunes!

4. Y ajouter les graines d’une (voire 1

½

) gousse de vanille!

5. Brasser vigoureusement (c¸a devient un peu blanch ˆatre)!

6. Battre 2dl de cr `eme!

7. Battre les blancs en neige!

8. M ´elanger le tout et mettre au cong ´elateur!

(2)

Glace vanille fonctionnelle

1 gousse 2 œufs

↓ ↓

100g Sucre Extraire S ´eparer 2dl cr `eme

& ↓ . & ↓

Brasser Battre Battre

& ↓ .

M ´elanger

Congeler

(3)

Lambda-calcul

Invent ´e en 1941 par Alonzo Church

La base de la th ´eorie des langages de programmation Inspiration de Lisp, Scheme, ML, Haskell, ...

e ::= c | x | λx → e | e

1

e

2

S ´emantique:

(λx → e

1

) e

2

; e

1

[e

2

/x] β

-r ´eduction

Il y a aussi le renommage-

α

et la r ´eduction-

η

Chapitre 1 de Hudak, 8 et 14 de Sethi, 5 de Pierce

(4)

Haskell

Langages de la famille: Haskell, OCaml, Reason, F#, Coq, SML Utilis ´es dans l’industrie par:

Jane Street, Standard Chartered, J.P. Morgan, Facebook, BAE Systems, Cr ´edit Suisse, Microsoft, Docker, Wolfram, ...

(5)

Sucre syntaxique en Haskell

Haskell permet la notation infixe et pr ´efixe:

1 + 2

ou

(+) 1 2

A l’inverse:`

mod x y

ou

x ‘ mod ‘ y

D ´efinition de fonction:

double

o x = o x x ⇔

double

= λ o → λ x → o x x

Exemple

(∗) ‘

double

‘ 7

:

(λo → λx → o x x) (∗) 7 ; (λx → (∗) x x) 7 ; (∗) 7 7 ; 49

(6)

Expressions et valeurs

Une valeur est une expression irr ´eductible I.e. “pas de

β

-redex”

Exemples:

2

,

781

,

λx → [x, x]

, ...

Evaluer = r ´eduire une expression `a une valeur´

Est-ce que cela peut toujours se r ´eduire `a une valeur?

(7)

R ´ecursion

power

x 0 = 1

power

x y = x ∗ (

power

x (y − 1))

power

3 2 ; 3 ∗ (

power

3 (2 − 1))

; 3 ∗ (

power

3 1) ; 3 ∗ (3 ∗ (

power

3 (1 − 1)))

; 3 ∗ (3 ∗ (

power

3 0)) ; 3 ∗ (3 ∗ 1) ; 3 ∗ 3 ; 9

Un autre exemple: double power

3

(8)

Ordre d’ ´evaluation

¿ ¿ double

(∗) (1 + 2)

? ?

(9)

Ordre d’ ´evaluation

¿ ¿ double

(∗) (1 + 2)

? ?

¡Indiff ´erent!

double

(∗) (1 + 2) ;

double

(∗) 3 ; 3 ∗ 3 ; 9

double

(∗) (1 + 2) ; (1 + 2) ∗ (1 + 2) ; . . . ; 9

Propri ´et ´e fondamentale d’un langage fonctionnel pur

(10)

L’ordre importe quand m ˆeme

power

x y = if y = 0 then 1 else x ∗ (

power

x (y − 1))

power

3 0

; if 0 = 0 then 1 else 3 ∗ (

power

3 (0 − 1))

; if 0 = 0 then 1 else 3 ∗ (

power

3 (−1))

; if 0 = 0 then 1 else 3 ∗ ( if − 1 = 0 then 1 else 3 ∗ (

power

3 (−2)))

Haskell garanti qu’il termine si c’est possible

(11)

Transparence r ´ef ´erentielle

e

1 et

e

2 sont strictement ´equivalentes si

e

1

;

e

3 et

e

2

;

e

3

Remplacer

e

1 par

e

2 dans une expression

e

ne change pas le r ´esultat Modulo renommage

α

, bien s ˆur

C’est pour cela que l’ordre d’ ´evaluation n’importe pas

(12)

Types

Syst `eme de classification qui a deux origines ind ´ependentes:

Logique math ´ematique: introduits pour ´eviter des probl `emes tels que le paradoxe de Russell

Langages de programmation: besoin de distinguer des valeurs de natures diff ´erentes (e.g. diff ´erente taille)

Un type est comme un ensemble d’objets similaires Similaires = acceptent les m ˆeme op ´erations

(13)

Genres de typages

Un langage peut utiliser les types de deux mani `eres:

Typage dynamique: les valeurs portent leur type

N’importe quelle variable peut contenir n’importe quelle valeur

Typage statique: le type est associ ´e aux variables

Une variable ne peut contenir que des valeurs du type sp ´ecifi ´e Le typage est dit fort ou faible selon s’il est possible d’utiliser une op ´eration sur une valeur du mauvais type

Certains langages ne sont simplement pas typ ´es du tout!

(14)

Types en Haskell

¿ ¿

3 +

power ? ?

¿ ¿ double

1 2

? ?

(15)

Types en Haskell

¿ ¿

3 +

power ? ?

¿ ¿ double

1 2

? ? Chaque expression

e

a un type

τ

:

Notation Haskell:

e :: τ

Si

v

1

:: τ

et

v

2

:: τ

, ils peuvent ˆetre utilis ´es aux m ˆemes endroits

3 :: Int

,

3.14 :: Float

,

True :: Bool

, power

:: IntIntInt

(16)

Polymorphisme

Certaines fonctions peuvent avoir plusieurs types:

id i

:: IntInt

id i

x = x

id s

:: StringString

id s

x = x

On peut alors utiliser une variable de type:

id

:: α → α

id

x = x

On dit alors que la fonction est polymorphe

(17)

Inf ´erence de types

En Haskell, il n’est pas indispensable d’ ´ecrire les types

% hugs [...]

Prelude> :type \ o x -> o x x

\o x -> o x x :: (a -> a -> b) -> a -> b Prelude>

Les annotations de type sont recommand ´ees:

Meilleurs messages d’erreur

Documentation

(18)

Types structur ´es

Paires:

(e

1

, e

2

)

,

fst

,

snd

de type:

1

, τ

2

)

Listes:

[]

,

e

h

: e

t,

[e

1

, ..., e

n

]

,

head

,

tail

de type:

[τ ]

(1, 2) : ( Int , Int )

(1, (2, 3)) : ( Int , ( Int , Int )) (1, [2, 3]) : ( Int , [ Int ])

[1, [2, 3]] :

Error

[[1], [2, 3]] : [[ Int ]]

[(1, 2), (2, 3)] : [( Int , Int )]

(19)

Exemples

length

:: [α] → Int

length

[] = 0

length

( : xs) =

length

xs + 1

(20)

Exemples

length

:: [α] → Int

length

[] = 0

length

( : xs) =

length

xs + 1

zip

:: ([α], [β ]) → [(α, β )]

zip

([], ) = []

zip

( , []) = []

zip

(x : xs, y : ys) = (x, y ) :

zip

(xs, ys)

(21)

Exemples

length

:: [α] → Int

length

[] = 0

length

( : xs) =

length

xs + 1

zip

:: ([α], [β ]) → [(α, β )]

zip

([], ) = []

zip

( , []) = []

zip

(x : xs, y : ys) = (x, y ) :

zip

(xs, ys)

Pourquoi pas:

length

xs = if xs == [] then 0 else

length

(

tail

xs) + 1

(22)

Polymorphisme avec Type Classes

applymin

f x y

| x ≤ y = f x y

| otherwise = f y x

x

et

y

peuvent ˆetre de type

Float

,

Int

, mais pas

Int → Int

applymin

:: Ord α ⇒ (α → α → β ) → α → α → β

M ˆeme chose pour l’op ´eration d’ ´egalit ´e, l’addition, ...:

(==) :: Eq α ⇒ α → α → Bool

(+) :: Num α ⇒ α → α → α

(23)

Cr ´eer de nouveaux types

Types de donn ´ees alg ´ebriques

data

t =

Tag1

τ

11

. . . τ

1n

|

Tag2

τ

21

. . . τ

2n0

| . . .

|

Tagm

τ

m1

. . . τ

mn00

Listes: data List

α =

Nil

|

Cons

α (

List

α)

Produits: data Pair

α β =

Pair

α β

Sommes: data Either

α β =

Left

α |

Right

β

Null: data Maybe

α =

Nothing

|

Just

α

On peut aussi cr ´eer des alias avec type

t = τ

(24)

Exemples sur arbres

data

Tree

α =

Leaf

|

Node

(

Tree

α) α (

Tree

α)

sum

::

Tree

Int → Int

sum Leaf

= 0

sum

(

Node

t

l

n t

r

) =

sum

t

l

+ n +

sum

t

r

insert

::

Tree

Int → Int

Tree

Int

insert Leaf

n =

Node Leaf

n

Leaf insert

(

Node

t

l

m t

r

) n

| n < m =

Node

(

insert

t

l

n) m t

r

| otherwise =

Node

t

l

m (

insert

t

r

n)

(25)

Manipulation de listes

(++) :: [a] → [a] → [a]

[] ++ ys = ys

(x : xs) ++ ys = x : (xs ++ys)

Est-ce que

xs ++ [] ≡ xs

? Est-ce qu’on peut le prouver ? Qu’est-ce que cela implique ?

(26)

Efficacit ´e de la concat ´enation

Combien d’op ´erations sont-elle n ´ecessaires pour ´evaluer:

([1, 2, 3] ++ [4, 5, 6]) ++ [7, 8, 9]

Qu’en est-il de

[1, 2, 3] ++ ([4, 5, 6] ++ [7, 8, 9])

Qu’elle est l’associativit ´e de

++

?

(27)

Inverser les listes

reverse

:: [a] → [a]

reverse

[] = []

reverse

(x : xs) =??

(28)

R ´ep ´etition uniforme

type

Polygon

= [( Int , Int )]

transX

:: Int

Polygon

Polygon transX

o [] = []

transX

o ((x, y) : vs) = (o + x, y) :

transX

o vs

toupper

[] = []

toupper

(c : cs) = let c

0

= if c ≥

a

&& c ≤

z

then c −

a

+

A

else c

in c

0

:

toupper

cs

(29)

Fonctions d’ordre sup ´erieur

Les fonctions sont des objets normaux: objets de premi `ere classe On peut les passer en argument

Les renvoyer comme valeur de retour

Les stocker dans des structures de donn ´ees

(30)

Currying

double

o x = o x x

En r ´ealit ´e:

double

≡ λo → λx → o x x

Donc

double

(+) ; λx → (+) x x

(31)

Map

map

:: (a → b) → ([a] → [b])

map

f [] = []

map

f (x : xs) = f x :

map

f xs

transX

o vs =

map

(λ(x, y ) → (o + x, y)) vs

toupper

s =

map toupper’

s

where

toupper’

c = if c ≥

a

&& c ≤

z

then c −

a

+

A

else c

(32)

R ´eduction η

En plus de la r ´eduction

β

et de l’ ´equivalence

α

, le

λ

-calcul d ´efini aussi la r ´eduction

η

:

λx → e x ; e

Cette r `egle n’est pas utilis ´ee aussi couramment Variantes:

( fst e, snd e) ; e

if e then

True

else

False

; e

(33)

R ´eductions de listes

sum

:: [ Int ] → Int

sum

[] = 0

sum

(x : xs) = x +

sum

xs

prod

:: [ Int ] → Int

prod

[] = 1

prod

(x : xs) = x ∗

prod

xs

(34)

Un r ´educteur g ´en ´erique

foldr

:: (a → b → b) → b → [a] → b

foldr

op i [] = i

foldr

op i (x : xs) = x ‘op‘

foldr

op i xs

sum

=

foldr

(+) 0

prod

=

foldr

(∗) 1

concat

=

foldr

(++) []

Remarque (

η

-r ´eduction sur les listes): foldr

(:) [] xs ≡ xs

(35)

Efficacit ´e

foldl

:: (a → b → a) → a → [b] → a

foldl

op i [] = i

foldl

op i (x : xs) =

foldl

op (i ‘op‘ x) xs

flip

f x y = f y x

revcons

=

flip

(:)

reverse

=

foldl revcons

[]

(36)

Filtrage

Variable: accepte tout et le lie `a la variable

Filtre sp ´ecial : accepte tout, ne lie rien

Constante: accepte seulement une value de la bonne forme et seulement si les sous- ´el ´ements sont accept ´es par les sous-filtres

Garde: expression bool ´eenne quelconque

Filtre-OU:

(f

1

|f

2

|f

3

)

accepte une valeur ssi elle est accept ´ee par

f

1,

f

2, ou

f

3 et lie les m ˆemes variables

Filtre-AS:

(x as f )

comme

f

mais en plus lie la valeur `a

x

Filtres r ´ep ´et ´es: par exemple

(x, x)

(37)

Exemple de filtre

merge

:: Ord α ⇒ ([α], [α]) → [α]

merge

((xs, [])|([], xs)) = xs

merge

(a @ (x : xs), b @ (y : ys))

| x ≤ y = x :

merge

(xs, b)

| otherwise = y :

merge

(a, ys)

(38)

Exemple de filtre, le retour

merge

:: Ord α ⇒ [α] → [α] → [α]

merge

xs [] = xs

merge

[] xs = xs

merge

(x : xs) (b @ (y : )) | x ≤ y = x :

merge

xs b

merge

a (y : ys) = y :

merge

a ys

(39)

S ´emantique statique de STLC

Γ, x : τ ` x : τ

Γ ` e

1

: α → β Γ ` e

2

: α Γ ` e

1

e

2

: β

Γ, x : τ

1

` e : τ

2

Γ ` λx : τ

1

→ e : τ

1

→ τ

2

Γ ` n : Int Γ ` (+) : IntIntInt

(40)

Types, m ´ethodes formelles, v ´erification

V ´erification

6=

Tests

M ´ethodes formelles:

Logique de Hoare: lourd, co ˆuteux, Sisyphe

V ´erification de mod `ele: plus l ´eger, plus limit ´e, pas toujours formel

G ´en ´eration automatique de code: bugs dans la spec?

Types: tr `es l ´egers, tr `es limit ´es, tr `es formels Seuls les types sont utilis ´es `a grande ´echelle Hardware en avance sur le software

(41)

Polymorphisme en λ -calcul

Le

λ

-calcul typ ´e avec polymorphisme s’appelle System F

Cœur des langages OCaml/Haskell (en th ´eorie et en pratique)

e ::= c | x | λx : τ → e | e

1

e

2

| Λt → e | e[τ ] τ ::= Int | τ

1

→ τ

2

| t | ∀t.τ

La fonction identit ´e est en fait traduite comme suit:

id

:: ∀α.α → α

id

= Λα → λx : α → x

r ´eponse

=

id

[ Int ] 42

Invent ´e en 1972/1974 par Girard/Reynolds

(42)

S ´emantique statique de System F

Γ, x : τ ` x : τ

Γ ` e

1

: α → β Γ ` e

2

: α Γ ` e

1

e

2

: β

Γ, x : τ

1

` e : τ

2

Γ ` λx : τ

1

→ e : τ

1

→ τ

2

Γ ` e : τ

Γ ` Λt → e : ∀t.τ

Γ ` e : ∀t.τ

1

Γ ` e[τ

2

] : τ

1

2

/t]

(43)

Curry-Howard

Intime connection entre logique et langages de programmation

Γ ` e

1

: α → β Γ ` e

2

: α

Γ ` e

1

e

2

: β

vs

P

1

⇒ P

2

P

1

P

2

La r `egle de typage de l’application correspond au modus ponens La

β

-r ´eduction correspond au cut-elimination

Type = Proposition; Programme = Preuve

Γ ` e : ∀t.τ

2

Γ ` e[τ

1

] : τ

2

1

/t]

vs

∀x.P P [e/x]

Il n’existe pas de fonction de type

∀t

1

, t

2

.t

1

→ t

2

(44)

Noms et port ´ee

Un m ˆeme identificateur peut d ´esigner plusieurs choses Une d ´eclaration donne un sens `a un identificateur

La port ´ee d’une d ´eclaration = le r ´egion du programme o `u l’identificateur r ´ef `ere `a cette d ´eclaration

A l’inverse, les r `egles de port ´ee d ´efinissent pour chaque usage d’une` variable, `a quelle d ´eclaration il se r ´ef `ere

Chap. 5.3 de Sethi

(45)

Port ´ee lexicale

La port ´ee et dite statique ou lexicale si elle est d ´elimit ´ee textuellement La d ´eclaration correspondant `a un usage de variable est la d ´eclaration pr ´ec ´edente la plus proche dans le texte

Plusieurs d ´eclarations d’un m ˆeme identificateur peuvent ˆetre actives

let

double

o x = o x x

f =

double

(+)

g =

double

(∗)

o = λo → o

in f 3 + g 4

(46)

Les droits fondamentaux des variables

Dans une expression

e

on dit qu’une variable

x

est libre si elle est utilis ´ee sans ˆetre d ´efinie par

e

.

Expression Variables libres map

(λx → x + y) {

map

, y }

(x + y, λz → z ) {x, y } (x + y, λx → x) {x, y }

Le renommage-

α

n’affecte pas les variables libres

(47)

Port ´ee dynamique

La port ´ee est dite dynamique si elle est d ´elimit ´ee temporellement

La d ´eclaration correspondant `a un usage de variable est la plus r ´ecente d ´eclaration du m ˆeme identificateur encore active:

y = 1

f x = x + y

g n = (let y = f n in f y) + f (n + 1) h m = (let y = g m in g y) + g (m + 1)

Un m ˆeme usage de variable peut donc r ´ef ´erer `a diff ´erentes d ´eclarations

`a diff ´erents moments

(48)

Propri ´et ´es de la port ´ee dynamique

Acc `es direct aux variables “locales” de la fonction appelante!

Probl `eme de capture de nom:

transX (x, vs)

= map (\(a,b) -> (a + x, b)) vs

Le choix des identificateurs a de l’importance: pas de renommage-

α

! En Emacs Lisp, on utilise une convention

{

pkg

}

-

{

name

}

Pas de currying:

let f = \x -> \y -> x + y in f 1 2

(49)

Pourquoi port ´ee dynamique

let

dest

=

stdout

--

envoyer `a stdout par d ´efaut printfoo

x =

write dest

(

show

x)

in . . .

let

dest

=

open

"foobar" in

printfoo foo

Passage implicite d’arguments qui changent rarement Implantation na¨ıve dans un interpr ´eteur

(50)

Pourquoi port ´ee lexicale

Permet l’analyse statique (automatique ou humaine)

M `ene `a du code plus efficace Libert ´e de choix des identificateurs

let x = 3 in

foo

0 + x

Est-ce correct de remplacer

x

par 3 ?

Est-ce correct ensuite d’ ´eliminer la variable

x

? Fermetures, types, ordre d’ ´evaluation

(51)

Fermetures

λx → o x x

a besoin d’un contexte qui d ´efini

o

Une fermeture associe une fonction `a son environnement:

λ

E

x → e

On distingue entre les expressions

λx → e

et les valeurs

λ

E

x → e (E ; λx → e) ; (E ; λ

E

x → e)

(E

2

; (λ

E1

x → e

1

) e

2

) ; (E

1

, x 7→ e

2

; e

1

)

Seules les variables libres dans

e

sont n ´ecessaires dans

E

(52)

Fermetures comme objets

Les fermetures sont des donn ´ees:

mkpair a b = \f -> if f then a else b fst p = p true

snd p = p false

La fermeture “capture” les variables libres (ici, a et b) Repr ´esentation en m ´emoire tr `es raisonnable

(53)

Ordre d’ ´evaluation

Choix principal: ´evaluer les arguments avant ou apr `es l’appel

CBV = avant appel par valeur

CBN = apr `es appel par nom

let x = f 0 in g x

o `u

g

pourrait ˆetre

g x = x + x

ou au contraire

g x = 1

(54)

Structures de donn ´ees infinies

zipWith

:: (α → β → γ ) → [α] → [β ] → [γ ]

zipWith

f

xs1 xs2

=

map

(

uncurry

f ) (

zip xs1 xs2

)

zipWith

f (x : xs) (y : ys) = f x y :

zipWith

f xs ys

zipWith

f = []

ones

= 1 :

ones

numbers

= 0 :

zipWith

(+)

ones numbers

numbers

≡ [0, 1, 2, 3, 4, . . . ]

(55)

R ´ecursion cach ´ee

Comment utiliser la r ´ecursion avec des fonctions anonymes?

fact’ fact 0 = 1

fact’ fact n = n * fact (n - 1) fact = fact’ fact

Il semble qu’on a seulement repouss ´e le probl `eme.

Sauf que fact’ n’a pas besoin de fact mais seulement de fact’:

fact’ fact’ 0 = 1

fact’ fact’ n = n * fact’ fact’ (n - 1) fact = fact’ fact’

Maintenant, on a un probl `eme de type.

(56)

Classes de type

Programmation orient ´ee objet en Haskell Cousin des interfaces de Java:

class Drawable a where

draw :: Display → aIO ()

Sp ´ecifie les m ´ethodes que les instances doivent fournir Peut fournir des impl ´ementation par d ´efaut

draw :: Drawable a ⇒ DisplayaIO ()

(57)

Instances de classes de type

Les instances sont d ´efinies s ´epar ´ement du type correspondant:

instance Drawable Square where

draw :: Display → SquareIO () draw s d = ...

instance Drawable Circle where

draw :: Display → CircleIO () draw c d = ...

On peut donc les d ´efinir longtemps apr `es avoir d ´efini Square

(58)

Exemple: listes num ´eriques

instance Num a => Num [a] where x + y = zipWith (+) x y

x * y = zipWith (*) x y negate x = map negate x signum x = map signum x abs x = map abs x

fromInteger n = nlist

where nlist = fromInteger n : nlist

et ainsi:

[1, 2, 3] + 6 = ⇒ [7, 8, 9]

6 − [[1, 2, 3], [42, 43]] = ⇒ [[5, 4, 3], [−36, −37]]

(59)

Contraintes sur les types

Les classes sont des contraintes sur les types

dist :: (Ord a, Num a) => a -> a -> a

dist x y = if x > y then x - y else y - x

Une classe de type peut h ´eriter d’un (ou plusieurs) autres

classe (Ord a, Num a) => OrdNum a where ...

alors

dist :: OrdNum a => a -> a -> a

dist x y = if x > y then x - y else y - x

(60)

Contraintes sur des types “impropres”

Int

et

Maybe Int

sont des proper types

Maybe

est un constructeur de type: sorte de fonction sur les types Les classes de types se g ´en ´eralisent aux constructor classes

class Functor f where

fmap :: (a -> b) -> f a -> f b instance Functor [] where

fmap = map

instance Functor Maybe where fmap f Nothing = Nothing

fmap f (Just x) = Just (f x)

(61)

Concepts: Syntaxe

Analyse lexicale, analyse syntaxique

Backus-Naur Form

Arbre de syntaxe abstraite

Infixe/postfixe/pr ´efixe

Sucre syntaxique

Notation sans s ´emantique

(62)

Concepts: Types

Types primitifs

Types produits

Types somme

Types r ´ecursifs

Types param ´etriques

Interfaces, classes, signatures, contraintes

Inf ´erence de types

Egalit ´e´

(63)

Concepts: Expressions

D ´efinitions locales

Expressions conditionnelles

Construction

Filtrage

R ´ecursion

(64)

Concepts: Fonctions et variables

Variables locales, port ´ee

Evaluation CBV, CBN, paresseuse´

Fonctions d’ordre sup ´erieur

Currying, fermetures

(65)

Concepts manquants

Effets de bord, mutation

Non-d ´eterminisme

Gestion m ´emoire

Pointeurs, r ´ef ´erences

Modularit ´e, abstraction de donn ´ee

Références

Documents relatifs

D` es que la pr´ ecision de calcul est limit´ ee, elle

On dit qu’un entier naturel N est de type J n si N peut être écrit en utilisant une fois et une fois seulement chacun des nombres 1, 2, 3…, n dans l’ordre, ces nombres

On dit qu’un entier naturel N est de type J n si N peut être écrit en utilisant une fois et une fois seulement chacun des nombres 1, 2, 3…, n dans l’ordre, ces nombres

Trouvez la formule la plus courte permettant de calculer 2011 en écrivant, dans l'ordre, les premiers nombres entiers, séparés par des opérateurs (+, -, *, /, racines

Permet à l’élève d’apprendre à utiliser un document de référence.. Une proposition mathématique est une phrase dont on peut dire avec certitude si elle est vraie ou si elle

Such results are very similar to the ones known for the Hardy inequality, see [5] for some recent result and further refer- ences, or equivalently for the lower estimates for

badigeonnez le fond de caramel, couper les meringues en deux et disposer la moitié dans le moule en les enfonçant. Vous pouvez ajouter 3 goutes de colorant dans le reste de

Créer une fonction qui permet, à partir des dictionnaires dossards et temps, d’élaborer un nouveau dictionnaire dont les clés seront les noms des candidats et les valeurs le temps