56
Th´ eorie de la Programmation http://perso.ens-lyon.fr/daniel.hirschkoff/ThPr hop

Théorie de la Programmation

Embed Size (px)

Citation preview

Theorie de la Programmation

http://perso.ens-lyon.fr/daniel.hirschkoff/ThPr

hop

Programmation,

Theorie de la programmation

Langages de programmation

I il existe de nombreuxlangages de programmation

I un langage de programmation, c’est:

une grammaire,un compilateur,un manuel de reference,un environnement de developpement,une communaute d’utilisateurs,un ensemble de bibliotheques,un “parc de realisations”,. . .

Exprimer le calcul

la notion de calcul joue un role central en informatique

I la notion de fonction est volontiers extensionnelle

I plusieurs algorithmes pour resoudre un probleme

I plusieurs manieres d’exprimer un algorithme

un certain nombre de gensvivants a la cour duroyaume du Danemark

→ → a peu pres tous morts

Theorie de la programmationI les programmes comme objets mathematiques

ce qu’il y a de concret, c’est le langageI programme 6= algorithmeI abstraction plus ou moins grande vis-a-vis de la machine

(memoire, constituants)

I enoncer et prouver des proprietes des programmes(recherche, enjeux scientifiques/industriels)

lors de l’execution de ce programme. . .

· a la fin, la valeur de R sera egale a la racine carree de la valeurde X· une fonction attendant un entier ne sera pas utilisee avec une chaıne

de caracteres en entree · telle zone de la memoire ne sera pas accedee· la valeur contenue a l’adresse memoire p ne sera pas revelee· au plus 10 utilisateurs auront acces simultanement a telle ressource· l’appel a ce bout de code utilisera une quantite de memoire

proportionnelle au carre de la valeur de la variable X

I equations entre programmesI que peut signifier P1 = P2 ? pour quelle egalite?I peut-on resoudre des equations sur les programmes ?

Plus concretement

pour ce cours, deux “petits” langages

I Imp, petit langage imperatif

I µML, petit langage fonctionnel

Demo

I declinaisonsI langage imperatif / langage fonctionnelI compilateur / interprete

I les deux langages ont en communles expressions arithmetiqueswhile (x + 2) ∗ y − 5 > 2 do. . .let t = (a ∗ b + 2) in . . .

Sujets traites dans ce cours

I decrire les programmes, et l’execution des programmes

outils:I definitions inductivesI semantique operationnelle

I exprimer des proprietes sur les programmesI semantique axiomatique (logique de Floyd-Hoare) ImpI typage µML

I proprietes abstraites des programmes, notions de reecritureI terminaison, confluence, determinismeI quelques “bouts de maths discretes” quand c’est necessaire

I liens en passant avec la logique, avec la compilation

L’outil Coq(demonstration assistee par ordinateur)

I http://coq.inria.fr

installez-le sur votre machinepas de “je n’ai pas pu travailler car Coqne marche pas sur mon ordinateur”

et/ou utilisez les machines des salles libre-service

I avec l’interface coqide

petite demonstration

Coq — quelques idees a retenir

I on peut definir et manipulerI des types inductifs

Inductive nat : Set := O : nat | S : nat -> natI ainsi que des fonctions agissant sur ces types inductifs

I on peut prouver des proprietes sur ces objetsraisonnement par recurrence

I demonstrateur interactif:on “lutte” contre un ensemble de sous-buts a prouver,jusqu’au Qed.

I on dispose pour cela de tactiques, dont notammentI intro(s) trivialI rewrite

on reviendra sur tout cela, et approfondira,dans les prochaines semaines

Organisation

I enseignant responsable: Daniel HirschkoffTPs: Alexandre Isoard, Jean-Marie Madiot, Antoine Plet

I jeudi, 8h-10h: 2 groupesI vendredi, 8h-10h

repartissez-vous de facon equilibree,et tachez de rester dans le meme groupe

I cours: un peu sur transparents, beaucoup au tableau

I essentiellement des TPs, un peu de TDsce qui est fait sur machine est a relire !

I evaluation: un partiel, un examen, des devoirs a rendre

I prerequis: une certaine familiarite avec la programmation

I independamment du langageI qui n’a aucune experience de Caml?

si Projet1, alors Caml au debut

Partie 1

Semantique operationnelledes langages de programmation

—definitions inductives, raisonnements inductifs

Reference pour Imp 24/9/14

G. Winskel, “The Formal Semantics of Programming Languages”

disponible a la bibliotheque

nous couvrons les chapitres 2,3,4 (plus tard, le chapitre 6)

Langage Imp: syntaxe, semantique operationnelle

I grammaire de Imp

expressions arithmetiquesexpressions booleennescommandes

constructeurs c ::= . . . if b then c1 else c2 . . .

I semantique operationnelle a grands pas de Imp

regles d’inferenceσ, b ⇓ true σ, c ⇓ σ′ σ′, while b do c ⇓ σ′′

σ, while b do c ⇓ σ′′

terminologie: I execution, evaluation des programmes

(on ne parle que de programmes qui terminent)

I on definit par induction le jugement σ, c ⇓ σ′

a l’aide de regles d’inference

TPs

I la semaine derniere: premiers pas en Coq

repartissez-vous mieux

I cette semaine: definitions inductivesI d’ensemblesI de predicats

I par exemple:etant donnee la definition inductive des entiers de Peano, ondefinit par induction le jugement (inf n k) a l’aide des reglesd’inference suivantes

(inf 0 k)

(inf n k)

(inf (n + 1) (k + 1))

en Coq:

Inductive inf: nat -> nat -> Prop :=

inf ax : forall k, inf 0 k

| inf reg : forall n k,

inf n k -> inf (S n) (S k).

Retour sur Knaster-Tarski 01/10/14

theoreme de Knaster-Tarski: justification des definitions inductives

I f croissante (pour ⊆) sur l’ensemble des parties de ?. . .

I principe de preuve par induction sur t ∈ E

montrer que la propriete que l’on prouve est preservee par lesconstructeurs

exemple: ∀n : N, (n ≥ 1)⇒((double n) > n

)I definition de fonctions sur un ensemble inductif

Definitions inductives de predicats

anatomie des regles d’inference

σ, a1 ⇓ k1 σ, a2 ⇓ k2

σ, a1 + a2 ⇓ kk = k1 + k2

σ, b ⇓ true σ, c1 ⇓ σ′

σ, if b then c1 else c2 ⇓ σ′σ, a ⇓ k

σ,X := a ⇓ σ′ σ′ = σ[k/X ]

I ∀σ, b, c1, σ′, c2. (σ, b ⇓ true ∧ σ, c1 ⇓ σ′) ⇒ (σ, if b then c1 else c2 ⇓ σ′)

I σ, b, c1, σ′, c2: metavariables

I k = k1 + k2 condition d’application (side condition)

elle ne mentionneI ni un predicat pre-existant (comme σ, a ⇓ a)I ni le predicat que la regle d’inference definit

Retour sur les definitions inductives de predicats

I un ensemble fini de regles d’inferenceH1 . . .Hm

CSC

pour definir un jugement note ρ(t1, . . . , tn)

I Knaster-Tarski: un ensemble de derivations (finies) dont laconclusion est de la forme ρ(t1, . . . , tn)

I ambiguıte: une telle definition induit un ensemble de n-uplesI ceux pour lesquels il existe une derivation de ρ(t1, . . . , tn)I ex.: σ, c ⇓ σ′ ↔ sous-ensemble de M × com×M

I preuve par induction sur la derivationI propriete de la forme ∀y1 . . . yn.ρ(y1, . . . , yn) ⇒ P(y1, . . . , yn)

ambiguıte: . “si ρ(y1, . . . , yn), alors. . . ”. “s’il existe une derivation δ de ρ(y1, . . . , yn), alors. . . ”

I un sous-cas par regle d’inferencela propriete P vaut pour les premisses de la forme ρ(. . . )

Aspects organisationnels

I TD et non TPI jeudi: B1 & B2I vendredi: B1

I mise en place du soutienI principe

I a la carteI vous avez travaille

I venez laisser votre nom a la fin du cours

(ou ajoutez-vous par mail [email protected] plus tard)

I un DM a venir, un partiel dans un mois environavez-vous des echeances deja prevues?

Passages obligesdirectives pour la redaction

Passages obliges – definitions par inductionen rouge, ce qui est exige dans une copie

I on se donnedes ensembles pre-existants, des relations pre-existantes

I on definit par inductionI soit un ensemble, donne par les constructeurs suivants . . .

(ou par la grammaire suivante . . . )

I soit un jugement,note . . . , [[ precisions eventuelles sur les metavariables apparaissant

dans le jugement ]],

(p.ex. note σ, c ⇓ σ′, ou c est une commande et σ, σ′ sont des etats

memoire)

donne par les regles d’inference suivantes . . .

Passages obliges – preuves par inductionen rouge, ce qui est exige dans une copie

I on demontre l’enonce suivant: [[ecrire l’enonce]] par induction

I sur la structure de totolorsque toto est un element d’un ensemble E definiinductivementet l’enonce est de la forme ∀toto ∈ E , blabla ou bien

I sur la derivation de titilorsque titi est un jugement defini inductivementet l’enonce est de la forme ∀..∀.., (titi)⇒ blabla

I il y a k cas:cas 1:. . .

cas k:

ici il faut etre raisonnable: detailler les cas qui le

meritent, regrouper les cas qui sont traites iden-

tiquement — on n’est pas des gallinaces

l’hypothese d’induction dit blabla, ce qui permet dededuire. . . (enoncer l’hypothese d’induction)

Passages obliges – definition de fonctions par inductionen rouge, ce qui est exige dans une copie

lorsque E est (un ensemble/ un predicat) defini par induction

on definit la fonction f par induction sur son argument toto ∈ Eil y a k cas

NB: toto peut aussi etre une derivation

Grands et petits pas

grands pas petits pas

execution, evaluation reductionspecification implementation

Semantique operationnelle – exempleI Imp

I sa grammaire, sa semantique a grands pas σ, c ⇓ σ′

I semantique a petits pas pour Imp (σ, c −→ σ′, c ′)correspondance entre ⇓ et −→

I “Imp realiste”I la memoire σ : V → Z, uniquement pour ecrire/lire des valeursI les registres R = [r1, . . . , rk ]: c’est avec eux qu’on calcule (+, ∗)I commandes

I read(X,ri ) write(ri ,X)I add(ri ,rj ,rk ) mult(ri ,rj ,rk ) cst(n,ri )I if then else sequence (;) while do skip

I semantique a petits pas σ,R, c _ σ′,R′, c′

I compilation: Imp Imp realistec 7→ c

(definie par induction sur

la commande)

X := Y + 5 devient

read(Y,1);cst(5,2);add(1,2,3);write(3,X)

validation de la compilation:σ, c ⇓ σ′ ssiσ,R, c _∗ σ′,R′, skip

cf. projet Compcert

(

Tres rapidement,

quelques elements de compilation

analyses lexicale et syntaxique: fabriquer des arbres

Intepreter / compiler

I interprete: implementation de la semantique operationnelleexecuter

I compilateur: traduction (p.ex. Imp assembleur)traduire (en preservant le sens)

interpretes et compilateurs sont des programmes manipulant desprogrammes (en un certain sens, c’est aussi le cas pour Coq)

Un compilateurI traducteur de code a code (de fichier source a fichier objet)I anatomie sommaire 1 → 2 → 3

1. front enddu fichier de texte a une representation arborescente"let x = 3 in (f x)+2"

ou plutot[’l’;’e’;’t’;’ ’;’x’;’ ’;’=’;’ ’;’3’;’ ’;’i’;’n’;’ ’;’ ’;’(’;’f’;’ ’;’x’;’)’;’+’;’2’;’\n’]

Let( Var "x", Cst 3, Add(App(Var "f", Var "x"), Cst 2) )

2. des tas de transformations (representations intermediaires)3. back end

generation de code: d’une representation arborescente a unfichier de texte[Push(rx);Set(rj,f addr);Call;Pop;Set(r0,2);Add]start: push(rx);

set(rj,f addr);

call;

pop;

set(r0,2);

add;

I “tout” est dans l’etape 2: analyses, transformations,reecritures, algorithmique, optimisations, . . .

Front end:

analyse lexicale, analyse syntaxique

Les deux etapes

I analyse lexicale

flot de caracteres (source) → flot de lexemes

I lexeme (token): “atome” du langageI typiquement:

I mots-clefs (let, begin, while,. . . )I symboles reserves ((, +, ;;, ;,. . . )I identificateurs (f, toto, . . . )

ainsi 32*52+(let x = 5 in x*x)

→ INT(32), MULT, INT(52), ADD, LPAREN, LET, ID("x"), EGAL, INT(5),

IN, ID("x"), MULT, ID("x"), RPAREN

(INT et ID ont un attribut, entier et chaıne de caracteres respectivement)

I analyse syntaxiqueflot de lexemes → arbre de syntaxe abstraite

→ Add( Mult(Int(32), Int(52)),

Let("x", Int(5), Mult(Var("x"), Var("x"))) )

I etape intermediaire: arbre d’analyse syntaxique (parse tree)

Analyse lexicale

I chaque lexeme est decrit par une expression reguliereI principaux elements (syntaxe de ocamllex):

I caractere ’$’, chaıne de caracteres "else"I intervalle [’0’-’9’] (un chiffre)I disjonction (de caracteres)

[’\t’ ’ ’] (tabulation ou espace)I juxtaposition [’A’-’Z’][’a’-’z’ ’A’-’Z’]

(mot de 2 lettres commencant par une majuscule)I repetitions: + signifie au moins 1, * zero ou plus

[’a’-’z’]+[’a’-’z’ ’0’-’9’]*

(ca commence par une lettre puis des lettres ou des chiffres)I disjonction a* | b*

I en sortie de l’analyse lexicale: des mots

Expression reguliere ↔ automate non deterministe

s0 S1a b c

NFA pour b|c

s2b

c

s3

s4 s5

ε

s6 s7

ε

ε

ε

s2b

c

s3

s4 s5

ε

S6s6 s9

εε

ε

ε

s8ε

ε

NFA pour a(b|c)*

s0 s1εa

s2 s3 s4 S1

s2b

c

s3

s4 s5

ε

S6s6 s9

εε

ε

ε

s8ε

ε

NFA pour (b|c)*

Determinisation, minimisation

I a partir de l’automate du transparent precedent, on dispose deprocedures pour determiniser l’automate (explosion dunombre d’etats), puis le minimiser

I on aboutit a

s0 S1

a

b

c

I comment implementer l’automate resultant?

I une table (tres creuse)etat a b c d e

e1 - e2 e3 - -e2 e4 - - - -e3 - - e3 - -

I eliminer les etats: un plat de spaghetti, fait de if et de goto

Analyse syntaxique

I l’analyse syntaxique se fonde sur une approche plus puissante:regles de grammaire

I les regles de grammaire font intervenir les lexemes et des“variables” (les non terminaux)

I exemple de grammaire:

E ::= K | E + E | E ∗ E | (E ) | let Id = E in EI E : non terminal (il peut y en avoir plusieurs)I K , let, Id ,+, ∗, (, ), in,=: lexemes

presentation alternative:

E → K E → E + E E → E ∗ E E → (E) E → let Id = E in + E

on parle de grammaire hors contexte

I analyse lexicale: du flot de caracteres au flot de lexemesI analyseur syntaxique (ou parser): applique les regles de

grammaire pour reconnaıtre une suite de lexemesI on change la structure: un flot (de lexemes) devient un arbreI on construit des phrases a partir de mots

Reconnaıtre une sequence de lexemes

I l’idee est de construire un arbre de derivation permettant dereconnaıtre le flot de lexemes

I grammaire: P ::= P + P | P ∗ P | K K un entierI soit le flot 32, +, 26, *, 2I on peut reconnaıtre de deux manieres:

P → P + P→ K32 + P→ K32 + P ∗ P→→ K32 + K26 ∗ K2

ou alors

P → P ∗ P→ P ∗ K2

→ P + P ∗ K2

→→ K32 + K26 ∗ K2

deux arbres differents: ambiguıte

I aucun moyen en revanche de reconnaıtre9 * 1 + + 1

Ce que fait le parser

E ::= E + E | E ∗ E | (E ) | a | b | c a+b*c

pile entree action$ a + b ∗ c$ shift$a +b ∗ c$ reduce : E → a$E +b ∗ c$ shift$E + b ∗ c$ shift$E + b ∗c$ reduce : E → b$E + E ∗c$ shift (tres malin)$E + E∗ c$ shift$E + E ∗ c $ reduce : E → c$E + E ∗ E $ reduce : E → E ∗ E$E + E $ reduce : E → E + E$E $ accept

I a la fin, on a un arbre add(id(a),mul(id(b),id(c)))

I construction d’une derivation “par la droite” Demo

I remarque: avec yacc, on ote les ambiguıtes en “bricolant”,pas en reecrivant la grammaire (comme en FDI)

Au total

I analyses lexicale et syntaxique fabriquent du sens

I de la donnee brute a l’expression d’un calcul

I elles constituent le front end d’un interprete ou d’uncompilateur

I ce qu’on fait de l’arbre de syntaxe abstraite:

“exprimer le sens” du calcul en lui-meme

)

Devoir numero 1

I disponible sur la page www du cours

I a rendre le 23 octobre a 19h au plus tardI du papier dans mes mains ou dans mon casierI un fichier par mail

I partiel: apres les vacances de la Toussaint

I DM 2: quelque part avant les vacances de Noel

I examen: en 2015

Organisation

Les semaines qui viennent

I cette semaineTD et non TP salles B1 et B2

I la semaine prochaineTD egalement

I la semaine 17-21 novembreI mercredi 19: partiel

I programme: jusqu’a aujourd’hui inclusI tous documents analogiques autorisesI le sujet de l’an dernier est en ligne

I jeudi 20 et vendredi 21: visite a l’Universite de Montpellier

↪→ pas de cours ni TD/TP cette semaine-la

Retour sur le DMI de bonnes notes

I rarement un retour sur la partie CoqI but principal: faire le point, decanterI poids relatif dans la note finaleI mauvaise note: soutien conseille

I remarquesI on raisonne par induction sur la derivation de σ, c 7→ σ′, c ′

I par induction sur 7→: bon, okI par induction (tout court) NON

I σ, c ne se derive pas en σ′, c ′,mais on construit une derivation de σ, c −→ σ′, c ′

I une regle d’inference s’ecritBLA

BLI,

pas BLA⇒ BLI ou “si BLA, alors BLI ”

(c’est un “constructeur d’arbre”)

I “montrons que BLA implique BLI ” est ok,

pas “montronsBLA

BLI” de meme,

Hind

BLIest un peu glissant (des

fois, Hind donne une derivation de BLI )

Retour sur le DM, suiteI question 2.1

σ, I(Xi ) 7→ σ′, skip

σ′ = σ[(σ(X )+1)

/Xi ]σ, c 7→ σ

′, c′

σ, c ∨ c2 7→ σ′, c′

σ, c 7→ σ′, c′

σ, c1 ∨ c 7→ σ′, c′

σ, c 7→ σ′, c′

σ, c; c2 7→ σ′, c′; c2 σ, skip; c 7→ σ, c

σ, c 7→ σ′, c′

σ, c 7→+σ′, c′

σ, c 7→ σ′, c′ σ

′, c′ 7→+

σ′′, c′′

σ, c 7→+σ′′, c′′

I lemme 1∀σ, c , σ′, c ′, si σ, c 7→+ σ′, c ′, alors ∀c2, σ, c ; c2 7→+ σ′, c ′; c2

par induction sur la derivation de σ, c 7→+ σ′, c ′, 2 cas2e cas: utilisation de l’hypothese d’induction

I lemme 2∀σ, c , σ′, c ′, si σ, c 7→+ σ′, c ′, alors ∀c2, σ, c ∨ c2 7→+ σ′, c ′ ∨ c2

par induction sur la derivation de σ, c 7→+ σ′, c ′, 2 cas2e cas: l’hypothese d’induction n’est pas utileon pourrait proceder en raisonnant par cas sur la derivation deσ, c 7→+ σ′, c ′

I question 2.2 ∀σ, c, σ′, c ′, (σ, c 7→ σ′, c ′)⇒((σ 6= σ′)⇒ (σ, c −→ σ′, c ′)

)I partie 3.2 (coinduction)

Partie 2

Reecriture

Unification du premier ordre

1. {t, t} ] P, σ −→ P, σ

2. {X , t} ] P, σa) si t 6= X et X ∈ Vars(t), −→ ⊥b) si X /∈ Vars(t), −→ P[t/X ], [t/X ] ◦ σ

3. {f (t1, . . . , tk ), f (u1, . . . , uk )} ] P, σ−→ {t1, u1} ∪ · · · ∪ {tk , uk} ∪ P, σ

4. {f (t1, . . . , tk ), g(u1, . . . , un)} ] P, σ −→ ⊥ (avec f 6= g)

Theoreme:

I correction: si P, ∅ −→∗ ∅, σ, alors σ est un mgu de P;

I completude: si P, ∅ −→∗ ⊥, alors U(P) = ∅.Preuve: a venir

Reecriture — generique de fin

I terminaisonI principe d’induction bien fondeeI produit l’exicographique, extension multiensembleI ordre de reecriture

I confluenceI confluence, diamant, confluence localeI lemme de NewmanI paires critiques dans les SRM

I termesI substitutions, sous-termesI SRTI unification

I Systemes de Reecriture: SRA, SRM, SRT

Permutation la semaine prochaine

I mercredi 10 decembre, 10h15-12h15

TP, salles 125 et 171

mercredi ←[ jeudi

I jeudi

TP, salle 125 ou 171

jeudi ← [ vendredi

I vendredi 12 decembre, 8h-10h

cours, amphi B

vendredi ←[ mercredi

Partie 3

Logique de Floyd-Hoare

Un exemple

si l’etat initial verifie

K = nK = n ∧ K ≥ 0

alors en executant le programme

R := 1;

while (K>1) do

( R:= R*K; K := K-1 )

on aboutit a un etat qui verifie

R = n!

Un autre exemplesi l’etat initial verifie

X 1 ≥ 1 ∧ X 2 ≥ 1

alors en executant le programme

Y1 := X1;

Y2 := X2;

while (Y1 6= Y2) do

if Y1 > Y2 then Y1 := Y1 - Y2

else Y2 := Y2 - Y1on aboutit a un etat qui verifie

Y 1 = pgcd(X 1,X 2)

(Y 1 div X1) ∧ (Y 1 div X2) ∧(∀i . (i div X1) ∧ (i div X2)⇒ i ≤ Y 1

)

a div bdef= ∃j . (b = j × a) ∧ (j ≥ 1)

Triplets de Hoare

{A} c {A′}

I c : commande Imp

I A,A′ : assertionsA preconditionA′ postcondition

Logique de Hoare, validite, derivabilite

programmeurs X, Y, Z X := 3

logiciens i, j X = 3` {A} c {A′}

enonces, affirmations(en logique de Hoare)

|= {A} c {A′}ce qui “est vrai”(ce qui se passe)

I correction: ` ⇒ |= tout ce que je dis est vrai

I completude: |= ⇒ ` tout ce qui est vrai, je sais le dire

Logique de Hoare, completude: idees clef

I une assertion A denote un ensemble d’etats memoire

I plus faible preconditionetant donnes A′ et c , definir une formule W (A′, c) telle que

siσ |= W (A′, c)et σ, c ⇓ σ′, alors σ′ |= A′

decire les etats qui “tombent sur A′ apres c”

Proposition: on peut definir W (A′, c)

I completude: supposons |= {A} c {A′}, a-t-on ` {A} c {A′} ?

I Proposition: on peut deriver ` {W (A′, c)} c {A′}reste a montrer |= A⇒W (A′, c)

I Theoreme (completude relative):si |= {A} c{A′}, alors ` {A} c{A′}

modulo la decision effective de |= A

Logique de Hoare – remarques

I plus faible precondition: reponse theoriqueI en pratique: programmes annotes (cf. TP)I developpements recents:

logique de Hoare pour programmes avec pointeurs

I pas de “miracle”I bon nombre de theoremes d’arithmetique peuvent se formuler

comme des assertions A |= {true} skip {A} ?

peut-on alors etablir ces theoremes de maniere automatique?non Godel (1er thm. d’incompletude)

I il ne s’agit pas non plus d’avoir un algorithme qui repond aetant donnes c, A, A′, est-ce que |= {A} c {A′} ?

cf. |= {true} c {false}

Construire des raisonnements

des regles d’inference

I pour decrire l’execution des programmessemantique operationnelle de Imp

σ, b ⇓ true σ, c1 ⇓ σ′

σ, if b then c1 else c2 ⇓ σ′σ, b ⇓ true

σ, if b then c1 else c2 −→ σ, c1

I pour etablir des proprietes sur l’execution des programmessemantique axiomatique de Imp

` {A ∧ b} c1 {A′} ` {A ∧ ¬b} c2 {A′}` {A} if b then c1 else c2 {A′}

TP sur l’unification

a envoyer par mail a votre charge de TP

avant le 17 decembre a 23h59