1 | 1 point | |||||
Comment écririez-vous une expression équivalente à l'expression ( dans un Scheme qui ne possèderait pas les formes spéciales et , mais seulement la forme ? On conservera bien entendu la même complexité.Solution : ( Notes : Cette solution est très générique, en ce sens qu'elle propose un motif que l'on pourrait répéter à volonté dans le cas d'une fonction n-aire. Elle tient notamment compte que n'est pas vraiment un prédicat : il ne rend pas exclusivement ou , mais la première expression ne s'évaluant pas à , ou s'il n'y en a aucune.Nous avons donc accepté les réponses similaires à la suivante (beaucoup plus simples dans le cas présent, il faut le reconnaître), vu que est réellement un prédicat renvoyant exclusivement ou : ( Profitons-en pour remarquer que, dans l'expression suivante, le second est vraiment inutile et lourd : ( En règle générale, soit de manière pratiquement indépendante du language, les expressions du style " " sont très proche de la fonction "identité", et sont donc inutiles et alourdissent les programmes. En Scheme, une expression de la forme ( ne sert qu'à projeter les valeurs différentes de vers , et vers ...Enfin, pour revenir à notre émulation de la forme spéciale , notez bien que l'idée suivante : ( bien que proche de la réelle sémantique de , évalue deux fois ( , ce qui modifie non seulement la complexité, mais pourrait aussi conduire à un comportement complètement différent si (ou d'ailleurs) effectuaient des effets de bord (affichages, modifications de variables, ...) ! | ||||||
2 | a | 0.5 point | ||||
Donnez le résultat de l'évaluation au toplevel de l'expression suivante : ( Solution : évalue les expressions des associations dans l'environnement englobant. Ce lie donc localement le symbole à la primitive , et le symbole à la primitive . Le résultat de l'évaluation est donc . | ||||||
b | 0.5 point | |||||
Quel serait le résultat en remplaçant par ?Solution : est du sucre syntaxique pour une cascade de réalisant chacun une seule association. Ce lie donc le symbole à la primitive , puis le symbole à cette même primitive (via la liaison locale de ). Le résultat de l'évaluation est donc . | ||||||
c | 0.5 point | |||||
Quel serait le résultat en remplaçant par ?Solution : évalue les expressions des associations dans l'environnement du corps, prenant donc en compte les liaisons qu'il effectue. Ce lie donc le symbole à la fonction locale, laquelle correspond à la fonction locale. L'appel d'une des fonctions (en l'occurence, ) est remplacé par un appel à l'autre, qui est à son tour remplacé par un appel à l'une, etc., sans consommation de pile (ces deux fonctions locales étant récursives terminales) ; ce processus de remplacement ne peut donc pas s'arrêter de lui-même : l'évaluation boucle. Notons que, si les fonctions n'avaient pas été récursives terminales, l'évaluation de ce aurait échoué tôt ou tard, par épuisement de la mémoire disponible. | ||||||
3 | On part de la fonction définie par ( . Par exemple ( . | |||||
a | 1 point | |||||
Comment modifieriez-vous sa définition pour que l'on puisse l'invoquer sous la forme (( ? Par exemple (( .Solution : ( | ||||||
b | 1 point | |||||
(( ? Par exemple (( .Solution : ( | ||||||
c | 2 points | |||||
Au choix sous l'une des deux formes (( ou ( ? Par exemple (( .Solution : ( | ||||||
4 | a | 0.5+0.5+0.5 points | ||||
Si l'on mesure le nombre d'appels à , quelle est la complexité de chacune des expressions suivantes, dans lesquelles , et sont trois listes ayant respectivements n1, n2, n3 éléments ? L'une d'elles est-elle plus efficace ? E == ( F == ( Solution : L'évaluation de E conduit à évaluer ( , qui a une complexité en O(n2) puis ( , qui a une complexité en O(n1) ; la complexité complète est donc de O(n1+n2). L'évaluation de F conduit à évaluer ( , qui a une complexité en O(n1) puis ( , qui a une complexité en O(n1+n2) ; la complexité complète est donc de O(2n1+n2). Le calcul le plus efficace est donc celui de E. | ||||||
b | 1+2 points | |||||
Dessiner le diagramme des doublets et pointeurs en mémoire pour les chaînages de doublets et après qu'ils aient été définis par : ( ( Solution : ![]() | ||||||
5 | On vous demander de programmer la fonction ( qui supprime toutes les occurences de l'élément x de la liste L. L'ordre des éléments non supprimés est conservé.Exemple : ( | |||||
a | 2 points | |||||
De manière récursive profonde : Solution : ( | ||||||
b | 2 points | |||||
De manière itérative classique [sans CPS] : Solution : ( | ||||||
c | 2 points | |||||
A l'ordre supérieur, en une ligne : Solution : ( | ||||||
d | 2 points | |||||
En style CPS : Solution : ( | ||||||
6 | On définit un type abstrait "couple d'entiers naturels" avec le constructeur suivant : ( On rappelle que ( retourne . | |||||
a | 2 points | |||||
Ecrire la fonction ( prenant un tel "couple" et retournant sa première composante : > ( Solution : ( | ||||||
b | 1 point | |||||
Si l'on conserve le , aurait-on pu opter pour autre chose que dans la définition de ?Solution : utilise la bijection1 entre l'espace des paires d'entiers naturels et l'espace des entiers naturels de la forme 2x.3y , basée sur le thérorème selon lequel tout entier naturel peut s'écrire de manière unique sous la forme d'un produit de facteurs premiers et, inversement, tout entier naturel peut se décomposer de manière unique en produit de facteurs premiers2. On peut donc remplacer par tout nombre premier différent de et , voire, dans le cas actuel, par tout entier premier avec . Il ne faut toutefois pas oublier que, si l'on peut considérer que le coût d'une division ou d'un modulo est constant lorsque l'on travaille sur des petits entiers (i.e. que le processeur sait traiter directement), cela n'est pas le cas pour les entiers longs, qui sont manipulés par la bibliothèque d'exécution de l'interprète/compilateur Scheme... | ||||||
1 Ce genre de bijection, ou, plus généralement, la représentation d'"objets" par des entiers s'apellant une Gödélisation. 2 La seconde opération étant énormément plus coûteuse que la première, ce qui constitue les fondements de la cryptographie à base de clefs publiques/privées... | ||||||
|