From 544823d7fd7c096649310b8ea65650dfcedbd4f2 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Sun, 15 Jan 2023 11:38:59 +0100 Subject: [PATCH 01/22] Updated link to drive --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f1031817..19c96292e 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ tout le contenu que vous soumettez pour inclusion dans ce dépot. Si cette license vous pose problème, venez en discuter en ouvrant une [issue](https://github.com/Gp2mv3/Syntheses/issues/new). -[pdf-url]: https://uclouvain-my.sharepoint.com/personal/miguel_delecourt_student_uclouvain_be/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fmiguel%5Fdelecourt%5Fstudent%5Fuclouvain%5Fbe%2FDocuments%2FEPL%2DDrive +[pdf-url]:https://uclouvain-my.sharepoint.com/:f:/g/personal/martin_brans_student_uclouvain_be/EgZKYEd1tThAlv8yvdVhTvkBUzjN2z-dN5jx4wE0a1e94g [doc-url]: https://drive.google.com/file/d/0B1axlYz3_XXKRzdGVWdGdUZ6UGs/view?usp=sharing&resourcekey=0-OJs4Mzz_eBpEbfdTmiUOgw [chat-url]: https://gitter.im/Gp2mv3/Syntheses?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge [forum-url]: http://forum-epl.be From 96f793ff4d72a99e1bbdf116fc1ce758018f7f4a Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Tue, 27 Jun 2023 18:57:10 +0000 Subject: [PATCH 02/22] LINFO1104 Exam Answer June 2020 --- src/config.yml | 1 + src/q4/info-LINFO1104/exam/2020/2020.mk | 2 + .../exam/2020/Juin/All/Makefile | 2 + .../All/info-LINFO1104-exam-2020-Juin-All.tex | 191 ++++++++++++++++++ src/q4/info-LINFO1104/exam/2020/Juin/Juin.mk | 2 + src/q4/info-LINFO1104/exam/exam.mk | 3 + src/q4/info-LINFO1104/info-LINFO1104.mk | 4 + 7 files changed, 205 insertions(+) create mode 100644 src/q4/info-LINFO1104/exam/2020/2020.mk create mode 100644 src/q4/info-LINFO1104/exam/2020/Juin/All/Makefile create mode 100644 src/q4/info-LINFO1104/exam/2020/Juin/All/info-LINFO1104-exam-2020-Juin-All.tex create mode 100644 src/q4/info-LINFO1104/exam/2020/Juin/Juin.mk create mode 100644 src/q4/info-LINFO1104/exam/exam.mk create mode 100644 src/q4/info-LINFO1104/info-LINFO1104.mk diff --git a/src/config.yml b/src/config.yml index 7b415a2e5..547213cd5 100644 --- a/src/config.yml +++ b/src/config.yml @@ -148,3 +148,4 @@ name: vehicle: Vehicle System Dynamics mads: Modelling and analysis of dynamical systems maths-discretes: Mathématiques discrètes et probabilité + info: Concepts des langages de programmation diff --git a/src/q4/info-LINFO1104/exam/2020/2020.mk b/src/q4/info-LINFO1104/exam/2020/2020.mk new file mode 100644 index 000000000..d209b81a7 --- /dev/null +++ b/src/q4/info-LINFO1104/exam/2020/2020.mk @@ -0,0 +1,2 @@ +YEAR=2020 +include ../../../exam.mk diff --git a/src/q4/info-LINFO1104/exam/2020/Juin/All/Makefile b/src/q4/info-LINFO1104/exam/2020/Juin/All/Makefile new file mode 100644 index 000000000..a519d4a83 --- /dev/null +++ b/src/q4/info-LINFO1104/exam/2020/Juin/All/Makefile @@ -0,0 +1,2 @@ +MINMAJ=All +include ../Juin.mk diff --git a/src/q4/info-LINFO1104/exam/2020/Juin/All/info-LINFO1104-exam-2020-Juin-All.tex b/src/q4/info-LINFO1104/exam/2020/Juin/All/info-LINFO1104-exam-2020-Juin-All.tex new file mode 100644 index 000000000..bd200f978 --- /dev/null +++ b/src/q4/info-LINFO1104/exam/2020/Juin/All/info-LINFO1104-exam-2020-Juin-All.tex @@ -0,0 +1,191 @@ +\documentclass[fr]{../../../../../../eplexam} + +\hypertitle{Concepts des langages de programmation}{4}{INFO}{1104}{2020}{Juin}{All} +{Norah \and Thomas Debelle} +{P. Van Roy} + +\section{Programming paradigms} +This question concerns the programming paradigms we have seen in the +course. Which of the following programming paradigms are deterministic (no observable +nondeterminism)? Select all that apply, multiple responses are possible +% Insérer ci-dessous la solution à la question + +\begin{solution} + \begin{itemize} + \item Functional programming: Oui car pas de concurrence. + \item Object-oriented programming: Non car permet un état mutable. + \item Functional dataflow: Oui car concurrent mais le résultat est toujours le même quelqu'en soit l'ordre d'exéctuion. + \item Actor dataflow: Non car ports. + \item active object: Non car ports. + \end{itemize} +\end{solution} + +\section{Free identifiers} +This question concerns free identifiers in a program. Given the following program fragment +What are the free identifiers in this fragment ? Select all that applyn multiple responses are possible. + + +\begin{solution} + Identificateur libre correspond à un élément déclaré en dehors d'une fonction/procédure mais utilisé dedans. Dans notre cas \textbf{X} et \textbf{Z}. +\end{solution} + +\section{List data structure} +This question concerns the list, a recursive data structure we have defined in the +course. Which of the following terms are lists? Select all that apply, multiple responses are possible. + +\begin{solution} + \begin{tabular}{c c} + nil & (a|nil)|b\\ + null & a|(nil|b)\\ + leaf & a|b\\ + (a|nil)|(b|nil) & nil|a|b\\ + a|(b|nil) & nil|nil + \end{tabular} +\end{solution} + +\section{Ordered binary trees} +This question concerns ordered binary trees. Given the three tree operations defined in the course +to operate on ordered binary trees, namely \{Lookup K T\}, \{Insert K V T\}, and \{Delete K T\}. Assume they are defined correctly +in the same way we defined them in the course, where the trees have the following syntactic definition: + ::= leaf | tree(key:V value:V ) +Execute the following code on paper (not on a computer): +A=\{Delete dog \{Insert mouse souris \{Insert cat chat \{Insert dog chien leaf\}\}\}\} + +\nosolution + +\section{Abstract machine semantics} +The following two questions concern the abstract machine semantics we have seen in the course. +We will investigate the following program's semantics. + +\begin{solution} + On met le corps de F en haute de la pile. Réponse E ou F. Ce n'est pas encore calculé à ce moment là. E2=\{X $\rightarrow$ b; R $\rightarrow$ c; G $\rightarrow$ g\} +\end{solution} + +\section{Lambda Calculus} +Reduce the expression FIRST (PAIR 1 NIL) to its final form. Show all reductions. Make sure to keep the +abbreviations for 1 and NIL during these reductions, since they will not be reduced. Please put one +reduction on each line of your answer (use a bullet list) + +\begin{solution} + $(FIRST (PAIR \wedge NIL)) \longrightarrow (\lambda p ( p TRUE)(PAIR \wedge NIL)) \longrightarrow ((PAIR \wedge NIL) TRUE) \longrightarrow ((\lambda x.\lambda y . \lambda f.(f x y) 1 NIL) TRUE) \longrightarrow (TRUE 1 NIL) \longrightarrow (\lambda x. \lambda y . x \wedge NIL) \longrightarrow 1$ +\end{solution} + +\section{Partial values} +This question is about using unbound variables when building data structures. Consider this program fragment + +\begin{solution} + true $\longrightarrow$ quand Oz rencontre une variable non liée, il met l'instruction en pause et continue jusqu'à ce que la variable soit liée. +\end{solution} + +\section{Data abstraction} +The following two questions are about a data abstraction that is defined as follows. +We define a counter with five operations: +\begin{enumerate} + \item Create a new counter instance with initial count equal to integer 0. + \item Increment the counter (value N becomes N+1) + \item Decrement the counter (value N becomes N-1) + \item Test if the counter is zero (return true if the value is zero and false if it is nonzero). + \item Get the counter's value (return the value N). +\end{enumerate} +We will implement this counter in two different ways.\\ +Give the implementation of the counter abstraction as an abstract data type (Oz code). You can assume +that any useful helper operation defined in the course exists. Try to make the code look nice (use a +numbered bullet list) + +\nosolution + +Give the implementation for the counter abstraction as an object (Oz code). You should group the object +operations in a record (do not use class syntax). Try to make the code look nice (use a numbered bullet +list). + +\nosolution + +\section{Limits of deterministic dataflow} +This question is about client/servers and the limits of deterministic dataflow. Given a +client/server application with two clients and one server. Each client puts its messages on a stream. The server reads both streams +and services both clients. Whenever a client sends a message to the server, the server must respond to the message and send a +reply back to the client in a reasonable time that depends only on the message travel time between client and server, and the +server's computation time. Assume the client/server is written in deterministic dataflow, and the server code is as follows. In this +code, S1 is a stream of requests from client 1 and S2 is a stream of requests from client 2.\\ + +Explain in detail why this server code does not satisfy the specification of the client/server, as it is given +above. Give a precise sequence of operations (client requests and server actions) to show what can go +wrong. + +\begin{solution} + Si un utilisateur envoie un message au serveur et pas l'autre, alors le case ne sera pas satsifait et le message ne sera pas traité tant que l'autre utilisateur n'envoie pas de message. + Dans ce cas, le temps de réponse ne dépend pas du temps de voyage et du temps de calcul, ce qui ne répond pas aux \textbf{spécifications}. +\end{solution} + +\section{Message protocols} +The following two questions are about message protocols. We will do an RMI with callback between a client +object and a server object. We will use the following implementation. You can assume that NewPortObject2 is defined in the same +way as in the course, namely to create port objects with no internal state.\\ + +Explain what an "RMI with callback" is supposed to do: what is the precise sequence of messages that +should be exchanged between the client and server. +\begin{solution} + Un RMI avec callback est un protocole de message dans lequel le client va demander au serveur de faire une action. Mais pour pouvoir compléter celle-ci, le serveur a besoin + d'une info de la part du client, donc il va envoyer un message au client en demandant cette info. Une fois que le client a répondu, le serveur peut terminer + ses calculs et renvoyer le résultat de l'action au client. Donc, ici, le client demande au serveur de lier $Y$ avec \{Send Server calc(10.0 Y Client)\} mais le serveur a besoin de $D$ pour calculer $Y$. + Le serveur envoie donc un message au client pour demander de lier $D$ avec \{Send Client delta($D$)\}. Le client va donc lier $D$ et le serveur pourra donc terminer son calcul et lier $Y$. +\end{solution} + +Explain why the code given above is incorrect. Give a precise execution scenario to show the problem. +Explain how to fix the problem (explain in words what is going on and how to correct it), and explain how +to fix the code (you can give a code fragment in your answer). + +\begin{solution} + La ligne $Z = Y + 10.0$ devrait être dans le thread. Quand cette ligne est exécutée, $Y$ n'est pas lié. Donc, le programme reste bloquée sur cette ligne. Mettre cette + instruction dans un thread permet au programe de continuer même si $Y$ n'est pas lié. +\end{solution} + +\section{Memory management} + +One of these programs has constant active memory size and the other has a memory leak where the active memory size grows +without bounds (which may crash the computer eventually if the process is not terminated)\\ + +For both programs, explain what happens to its active memory during its execution and why. Your +explanation must justify how the behavior is a consequence of the port semantics and of the difference +between the declare and local statements. + +\begin{solution} + C'est le programme 1 qui a une faute de mémoire. \\ + La sémantique des ports est la suivante: pour la création d'un port: P=\{NewPort S\} donne l'environnement \{P $\rightarrow$ p, S $\rightarrow$ s\} et dnas la mémoire + des ports, la paire $p:s$ est créée avec, $s$, une variable non liée. Quand on effectue l'opération \{Send P X\}, on crée + une nouvelle variable non liée $s'$, on lie $s$ à $x|s'$ et on met à jour la paire $p:s'$. \\ + + Quand le port est dans un \textit{declare}, la variable $s$ sera toujours atteignable et ne sera donc pas éliminé par le garbage + collector. Tandis que si le stream du port est dans un local, les variables $s$ de ce stream ne seront accessibles que depuis ce local. Donc une fois que le local est exécuté + , chaque fois qu'un message est envoyé au port, la variable $s$ du stream devient \textit{inatteignable}, et est donc éliminée, gardant ainsi la consommation + de mémoire active constante. +\end{solution} + +\section{Deterministic dataflow with ports} +This question is about concurrent programming with deterministic dataflow and ports. Given +the following program which does dynamic concurrent composition. It defines a thread creation abstraction in which threads can create threads recursively, and the top level call to NewThread terminates when all subthreads have terminated. +This program deliberately has a bug: the {Send Pt 1} call is done inside the new thread (to avoid a bug, it should be done before the +thread creation).\\ + +Explain this buggy behavior. You should give a precise scenario of multiple thread creations that shows +the buggy behavior, such that the NewThread call exits despite that there is still at least one active thread. +In your explanation, you should make explicit all the scheduler decisions that result in the buggy behavior. + +\begin{solution} + Le problème avec ce programme, c'est qu'il peut s'arrêter avant que tous les threads soient finis. En effet, le programme s'arrête quand le compteur de threads est égal à $0$. + À chaque fois qu'un thread se termine, sa dernière instruction est de décrémenter le compteur de thread. Quand on crée un thread il faut incrémenter le compteur. Le problème avec + le code proposé est le suivant: le scheduler décide quel thread s'exécute quand et pour combien de temps. En incrémentant le compteur de threads à l'intérieur d'un thread, + la situation suivante peut se produire.\\ + Imaginons le compteur est à 1 et le thread en cours d'exécution est presque terminé. Le scheduler commence un nouveau thread et crée donc une nouvelle stack avec son environnement, + mais n'exécute encore aucune instruction sur cette stack, il a juste démarré ce nouveau thread. Puis, le scheduler change de thread et termine l'exécution du thread qui se terminait. + Le compteur de threads passe donc à 0 avant que le nouveau thread n'ait eu l'occasion d'incrémenter ce compteur. Ce derneier étant à 0, l'exécution du programme se termine, malgré + le fait qu'il n'y ait toujours un thread en cours d'exécution.\\ + + En mettant l'incrémentation du compteur avant le thread éviterait ce problème. +\end{solution} + +% Ajouter \nosolution s'il n'y a pas de solution disponible pour cette question + +% \nosolution + +\end{document} diff --git a/src/q4/info-LINFO1104/exam/2020/Juin/Juin.mk b/src/q4/info-LINFO1104/exam/2020/Juin/Juin.mk new file mode 100644 index 000000000..6584a9746 --- /dev/null +++ b/src/q4/info-LINFO1104/exam/2020/Juin/Juin.mk @@ -0,0 +1,2 @@ +MONTH=Juin +include ../../2020.mk diff --git a/src/q4/info-LINFO1104/exam/exam.mk b/src/q4/info-LINFO1104/exam/exam.mk new file mode 100644 index 000000000..67792ba80 --- /dev/null +++ b/src/q4/info-LINFO1104/exam/exam.mk @@ -0,0 +1,3 @@ +TYPE=exam +BASE_DIR=../../../ +include $(BASE_DIR)../info-LINFO1104.mk diff --git a/src/q4/info-LINFO1104/info-LINFO1104.mk b/src/q4/info-LINFO1104/info-LINFO1104.mk new file mode 100644 index 000000000..a97cea0e7 --- /dev/null +++ b/src/q4/info-LINFO1104/info-LINFO1104.mk @@ -0,0 +1,4 @@ +NAME=info +OPTION=LINFO +CODE=1104 +include $(BASE_DIR)../../q4.mk From ea3b81282da568b3ccf57298415118dc64a23aeb Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Wed, 28 Jun 2023 12:41:03 +0200 Subject: [PATCH 03/22] LINFO1104 Exam Answer September 2020 --- .../exam/2020/2020.mk | 0 .../exam/2020/Juin/All/Makefile | 0 .../All/info-INFO1104-exam-2020-Juin-All.tex} | 181 ++++++++++- .../exam/2020/Juin/Juin.mk | 0 .../exam/2020/Septembre/All/Makefile | 2 + .../info-INFO1104-exam-2020-Septembre-All.tex | 305 ++++++++++++++++++ .../exam/2020/Septembre/Septembre.mk | 2 + src/q4/info-INFO1104/exam/2021/2021.mk | 2 + .../exam/2021/Septembre/All/Makefile | 2 + .../info-INFO1104-exam-2021-Septembre-All.tex | 21 ++ .../exam/2021/Septembre/Septembre.mk | 2 + src/q4/info-INFO1104/exam/exam.mk | 3 + .../info-INFO1104.mk} | 2 +- src/q4/info-LINFO1104/exam/exam.mk | 3 - 14 files changed, 517 insertions(+), 8 deletions(-) rename src/q4/{info-LINFO1104 => info-INFO1104}/exam/2020/2020.mk (100%) rename src/q4/{info-LINFO1104 => info-INFO1104}/exam/2020/Juin/All/Makefile (100%) rename src/q4/{info-LINFO1104/exam/2020/Juin/All/info-LINFO1104-exam-2020-Juin-All.tex => info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex} (70%) rename src/q4/{info-LINFO1104 => info-INFO1104}/exam/2020/Juin/Juin.mk (100%) create mode 100644 src/q4/info-INFO1104/exam/2020/Septembre/All/Makefile create mode 100644 src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex create mode 100644 src/q4/info-INFO1104/exam/2020/Septembre/Septembre.mk create mode 100644 src/q4/info-INFO1104/exam/2021/2021.mk create mode 100644 src/q4/info-INFO1104/exam/2021/Septembre/All/Makefile create mode 100644 src/q4/info-INFO1104/exam/2021/Septembre/All/info-INFO1104-exam-2021-Septembre-All.tex create mode 100644 src/q4/info-INFO1104/exam/2021/Septembre/Septembre.mk create mode 100644 src/q4/info-INFO1104/exam/exam.mk rename src/q4/{info-LINFO1104/info-LINFO1104.mk => info-INFO1104/info-INFO1104.mk} (79%) delete mode 100644 src/q4/info-LINFO1104/exam/exam.mk diff --git a/src/q4/info-LINFO1104/exam/2020/2020.mk b/src/q4/info-INFO1104/exam/2020/2020.mk similarity index 100% rename from src/q4/info-LINFO1104/exam/2020/2020.mk rename to src/q4/info-INFO1104/exam/2020/2020.mk diff --git a/src/q4/info-LINFO1104/exam/2020/Juin/All/Makefile b/src/q4/info-INFO1104/exam/2020/Juin/All/Makefile similarity index 100% rename from src/q4/info-LINFO1104/exam/2020/Juin/All/Makefile rename to src/q4/info-INFO1104/exam/2020/Juin/All/Makefile diff --git a/src/q4/info-LINFO1104/exam/2020/Juin/All/info-LINFO1104-exam-2020-Juin-All.tex b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex similarity index 70% rename from src/q4/info-LINFO1104/exam/2020/Juin/All/info-LINFO1104-exam-2020-Juin-All.tex rename to src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex index bd200f978..1e7d66ba7 100644 --- a/src/q4/info-LINFO1104/exam/2020/Juin/All/info-LINFO1104-exam-2020-Juin-All.tex +++ b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex @@ -1,6 +1,34 @@ \documentclass[fr]{../../../../../../eplexam} - -\hypertitle{Concepts des langages de programmation}{4}{INFO}{1104}{2020}{Juin}{All} +\usepackage{listings} +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{1.0,1.0,1.0} +\definecolor{codeblue}{rgb}{0,0,0.8} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegray}, + keywordstyle=\color{codeblue}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codeblue}, + basicstyle=\ttfamily\footnotesize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2, + frame=shadowbox +} +\lstset{style=mystyle} +\lstset{language=Oz} + +\hypertitle{Concepts des langages de programmation}{4}{LINFO}{1104}{2020}{Juin}{All} {Norah \and Thomas Debelle} {P. Van Roy} @@ -24,6 +52,13 @@ \section{Free identifiers} This question concerns free identifiers in a program. Given the following program fragment What are the free identifiers in this fragment ? Select all that applyn multiple responses are possible. +\begin{lstlisting} +local Z in + fun {F X} Z+X end + fun {G X} fun {$ Y} X+Y end end +end +\end{lstlisting} + \begin{solution} Identificateur libre correspond à un élément déclaré en dehors d'une fonction/procédure mais utilisé dedans. Dans notre cas \textbf{X} et \textbf{Z}. @@ -43,6 +78,10 @@ \section{List data structure} \end{tabular} \end{solution} +\begin{lstlisting} + abc +\end{lstlisting} + \section{Ordered binary trees} This question concerns ordered binary trees. Given the three tree operations defined in the course to operate on ordered binary trees, namely \{Lookup K T\}, \{Insert K V T\}, and \{Delete K T\}. Assume they are defined correctly @@ -57,6 +96,33 @@ \section{Abstract machine semantics} The following two questions concern the abstract machine semantics we have seen in the course. We will investigate the following program's semantics. +\begin{lstlisting} +local F G A B C in + A=5 + fun {G X} A*X end + fun {F X} + local A in + A={G X} + {G A} + end + end + B=10 + C={F B} + {Browse C} +end +\end{lstlisting} +Assume the program executes until just before the call C=\{F B\}. At this point, the execution state is the following: +\begin{lstlisting} +([(C={F B},E1), ({Browse C},E1)], + {f=(proc {$ X R} local A in A={G X} R={G A} end end,{G->g)), + g=(proc {$ X R} R=A*X end,{A->a}), a=5, b=10, c} +\end{lstlisting} +Here E1 has a particular value that we do not specify further, and variables f and g are bound to procedure values. Now do one +execution step according to the abstract machine semantics. This starts the execution of procedure F.\\ + +Which of the following choices best describes the execution state after this one step? Select only one +choice. + \begin{solution} On met le corps de F en haute de la pile. Réponse E ou F. Ce n'est pas encore calculé à ce moment là. E2=\{X $\rightarrow$ b; R $\rightarrow$ c; G $\rightarrow$ g\} \end{solution} @@ -106,7 +172,16 @@ \section{Limits of deterministic dataflow} and services both clients. Whenever a client sends a message to the server, the server must respond to the message and send a reply back to the client in a reasonable time that depends only on the message travel time between client and server, and the server's computation time. Assume the client/server is written in deterministic dataflow, and the server code is as follows. In this -code, S1 is a stream of requests from client 1 and S2 is a stream of requests from client 2.\\ +code, S1 is a stream of requests from client 1 and S2 is a stream of requests from client 2. +\begin{lstlisting} +proc {Server S1 S2} + case (S1|S2) of (M1|T1)|(M2|T2) then + ... (handle M1) + ... (handle M2) + {Server T1 T2} + end +end +\end{lstlisting} Explain in detail why this server code does not satisfy the specification of the client/server, as it is given above. Give a precise sequence of operations (client requests and server actions) to show what can go @@ -120,7 +195,39 @@ \section{Limits of deterministic dataflow} \section{Message protocols} The following two questions are about message protocols. We will do an RMI with callback between a client object and a server object. We will use the following implementation. You can assume that NewPortObject2 is defined in the same -way as in the course, namely to create port objects with no internal state.\\ +way as in the course, namely to create port objects with no internal state. + +\begin{center} +\begin{minipage}{0.45\linewidth} +\begin{lstlisting} +declare +proc {ServerProc Msg} + case Msg of calc(X Y Client) + then D in + {Send Client delta(D)} + Y=X*X+2.0*D*X+D*D+23.0 + end +end + +Server={NewPortObject2 ServerProc} +\end{lstlisting} +\end{minipage} +% +\begin{minipage}{0.45\linewidth} +\begin{lstlisting} +declare +proc {ClientProc Msg} + case Msg of work(Z) then Y in + {Send Server calc(10.0 Y Client)} + Z=Y+10.0 + [] delta(D) then + D=0.1 + end +end +Client={NewPortObject2 ClientProc} +\end{lstlisting} +\end{minipage} +\end{center} Explain what an "RMI with callback" is supposed to do: what is the precise sequence of messages that should be exchanged between the client and server. @@ -142,6 +249,32 @@ \section{Message protocols} \section{Memory management} +\begin{center} +\begin{minipage}{0.45\linewidth} +\begin{lstlisting} +%Program 1: +declare S P Loop in +P={NewPort S} +proc {Loop N} + {Send P N} {Loop N+1} +end +{Loop 1} +\end{lstlisting} +\end{minipage} +% +\begin{minipage}{0.45\linewidth} +\begin{lstlisting} +%Program 2: +declare P Loop in +local S in +P={NewPort S} +end +proc {Loop N} {Send P N} {Loop N+1} end +{Loop 1} +\end{lstlisting} +\end{minipage} +\end{center} + One of these programs has constant active memory size and the other has a memory leak where the active memory size grows without bounds (which may crash the computer eventually if the process is not terminated)\\ @@ -164,6 +297,30 @@ \section{Memory management} \section{Deterministic dataflow with ports} This question is about concurrent programming with deterministic dataflow and ports. Given the following program which does dynamic concurrent composition. It defines a thread creation abstraction in which threads can create threads recursively, and the top level call to NewThread terminates when all subthreads have terminated. + +\begin{lstlisting} +proc {NewThread P SubThread} + proc {ZeroExit N S} + case S of X|S2 then + if N+X\=0 then + {ZeroExit N+X S2} + end + end + end + S Pt={NewPort S} +in + proc {SubThread P} + thread + {Send Pt 1} % This should be done before the thread creation + {P} + {Send Pt ~1} + end + end + {SubThread P} + {ZeroExit 0 S} +end +\end{lstlisting} + This program deliberately has a bug: the {Send Pt 1} call is done inside the new thread (to avoid a bug, it should be done before the thread creation).\\ @@ -184,6 +341,22 @@ \section{Deterministic dataflow with ports} En mettant l'incrémentation du compteur avant le thread éviterait ce problème. \end{solution} +\section{Erlang/OTP} + This question is about building resilient distributed applications with Erlang/OTP. The +Erlang/OTP platform has many abstractions to construct resilient distributed applications. Assume you are +building a resilient distributed collaborative graphic editor, in which many users can work simultaneously +on the same document. This editor should always maintain a consistent document view for all users, it +should be completely robust against any kind of failure, and it should have high performance with low +perceived latency. Explain as best you can how you would structure this editor using the Erlang/OTP +abstractions we have seen in the course. Try to explain the role of as many Erlang/OTP abstractions as +possible in your answer. You will be graded on the completeness of your answer (mentioning as many as +possible the relevant Erlang abstractions among the ones we have seen in the course) and on the +coherence of your answer (how clearly you can explain the overall architecture of your editor, how all the +Erlang abstractions work together to achieve the overall goals, and what is the role of each abstraction in +achieving the overall goals). To achieve coherence, think about your answer before writing it down and +reread it before submitting the final version. +\nosolution + % Ajouter \nosolution s'il n'y a pas de solution disponible pour cette question % \nosolution diff --git a/src/q4/info-LINFO1104/exam/2020/Juin/Juin.mk b/src/q4/info-INFO1104/exam/2020/Juin/Juin.mk similarity index 100% rename from src/q4/info-LINFO1104/exam/2020/Juin/Juin.mk rename to src/q4/info-INFO1104/exam/2020/Juin/Juin.mk diff --git a/src/q4/info-INFO1104/exam/2020/Septembre/All/Makefile b/src/q4/info-INFO1104/exam/2020/Septembre/All/Makefile new file mode 100644 index 000000000..ca0c513cb --- /dev/null +++ b/src/q4/info-INFO1104/exam/2020/Septembre/All/Makefile @@ -0,0 +1,2 @@ +MINMAJ=All +include ../Septembre.mk diff --git a/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex b/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex new file mode 100644 index 000000000..522e59257 --- /dev/null +++ b/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex @@ -0,0 +1,305 @@ +\documentclass[fr]{../../../../../../eplexam} +\usepackage{listings} +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{1.0,1.0,1.0} +\definecolor{codeblue}{rgb}{0,0,0.8} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegray}, + keywordstyle=\color{codeblue}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codeblue}, + basicstyle=\ttfamily\footnotesize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2, + frame=shadowbox +} +\lstset{style=mystyle} +\lstset{language=Oz} + + + +\hypertitle{Concepts des langages de programmation}{4}{INFO}{1104}{2020}{Septembre}{All} +{Norah \and Thomas Debelle} +{P. Van Roy} + +\section{List data structure} +This question is about the list, an important recursive data structure that we have seen +in the course. Which of the following terms are lists? Select all that apply, multiple responses are possible. + +\begin{solution} +\begin{tabular}{c c} +nil|nil|nil & a|b|nil\\ +0|nil & a|b\\ +nil|b|a & (a|nil)|(b|nil)\\ +nil|nil & b|(a|nil)\\ +(a|nil)|b & 0 \\ + & nil|0 +\end{tabular} +\end{solution} + +\section{Functional programming} +Define the function \{SumOdd L A\} that calculates the sum of all elements of L +in odd positions starting from the first. If L=[a1 a2 ... am] then \{SumOdd L A\} returns A+a1+a3+... (up to +the end of L). Your definition must be declarative and tail-recursive and it must use pattern matching. You +will be judged on the precise correctness of your answer: any error (including syntax errors) will be penalized. +\begin{lstlisting} +declare +fun {SumOdd L A} + case L + of nil then A + [] H|nil then A+H + [] H|T then {SumOdd T.2 A+H} + end +end +\end{lstlisting} + +\section{Contextual environment} +\begin{lstlisting} +fun {F X} + fun {$ Y} + fun {$ Z} + X+Y+Z + end + end +end +\end{lstlisting} +What is the contextual environment of the outermost anonymous function in this definition, i.e., the function with header fun \{\$ Y\}? + +\begin{solution} + L'environnement contextuel d'une fonction (ou d'une procédure) contient tous les identificateurs qui sont utilisés à l'intérieur de la fonction mais déclarés en dehors + \begin{lstlisting}[escapechar=µ] + Ec = {X µ$\rightarrow$µ x} de {$ Y} + \end{lstlisting} +\end{solution} + +\section{Lambda calculus} +Here we use the capital letter L to represent the lambda symbol, and =DEF to represent a definition. For this question, +reduce the expression AND TRUE (NOT FALSE) to its final form. Show all intermediate reductions. For readability, keep the +abbreviations TRUE and FALSE in your reductions when they are not applied as functions (write them in full when they are +used as functions). Please put one reduction on each line of your answer. + +\begin{solution} + (AND TRUE (NOT FALSE)) $\longrightarrow$ ($\lambda p. \lambda q. p qp$ TRUE (NOT FALSE))$\longrightarrow$ (TRUE (NOT FALSE) TRUE) $\longrightarrow$ ($\lambda x.\lambda y.x$(NOT FALSE) TRUE) $\longrightarrow$ (NOT FALSE) $\longrightarrow$ ($\lambda p.p$ FALSE TRUE FALSE) $\longrightarrow$ (FALSE FALSE TRUE) $\longrightarrow$ ($\lambda x.\lambda y.y$ FALSE TRUE) $\longrightarrow$ TRUE +\end{solution} + +For this question, reduce the same expression as in the previous +question, but do the reduction in a different order. The result should be the same as before. This illustrates the Church-Rosser theorem? + +\begin{solution} + (AND TRUE (NOT FALSE)) $\longrightarrow$ (AND TRUE ($\lambda p.p$ FALSE TRUE FALSE)) $\longrightarrow$ (AND TRUE (FALSE FALSE TRUE)) $\longrightarrow$ (AND TRUE ($\lambda x. \lambda y.y$ FALSE TRUE)) $\longrightarrow$ (AND TRUE TRUE) $\longrightarrow$ ($\lambda p. \lambda q.pqp$ TRUE TRUE) $\longrightarrow$ (TRUE TRUE TRUE) $\longrightarrow$ ($\lambda x. \lambda y.x$ TRUE TRUE) $\longrightarrow$ TRUE +\end{solution} + + +\section{Abstract machine semantics} +\begin{lstlisting}[escapechar=µ] +([({P A B},{Pµ$\rightarrow$µp,Aµ$\rightarrow$µa,Bµ$\rightarrow$µb})], {a=5,n=10,b,p=(proc {$ X Y} Y=X+N end,{Nµ$\rightarrow$µn})} +\end{lstlisting} +Which of the following choices best describes the execution state after doing exactly one step in the abstract machine? +Select only one choice.\par + +In case the above answer was A or B, which of the following choices best describes the value of E1? +Select only one possibility. + +\begin{solution} + \begin{lstlisting}[escapechar=µ] + ([({P A B}, {P µ$\rightarrow$µ p, A µ$\rightarrow$µ a, B µ$\rightarrow$µ b})],{a=5,n=10,b,p=(proc {$ X Y} Y=X+N end, {N µ$\rightarrow$µ n})}) + µ$\longrightarrow$µ ([(Y=X+N, µ$E_1$µ)], {a=5, n=10, b, p=proc {$ X Y} Y=X+N end, {N µ$\rightarrow$µ n}}) + µ$\longrightarrow$µ µ$E_1$µ={X µ$\rightarrow$µ a, Y µ$\rightarrow$µ b, N µ$\rightarrow$µ n} + \end{lstlisting} +\end{solution} + +\section{List data structures} +Given the following instruction: + +\begin{lstlisting} +{Browse [nil]==nil|nil} +\end{lstlisting} +What does this display? + +\begin{solution} + \begin{lstlisting}[escapechar=µ] + {Browse [nil] == nil|nil} µ$\longrightarrow$µ true + \end{lstlisting} +\end{solution} + +\section{Limitation of deterministic dataflow} +The deterministic dataflow paradigm is very useful when writing concurrent programs +because it has no race conditions. However, it has a strong limitation which means that in some cases it cannot be used. Consider +a client/server application with two clients and one server. Each client puts its requests on a stream. The server reads both +streams and handles the requests. There is an important fairness requirement: whenever a client sends a message to the server, +the server must respond in a reasonable time that depends only on the message travel time between client and server, and its own +computations. There must be no other dependency. Assume the client/server is written in deterministic dataflow, and the server +code is as follows. In this code, S1 is a stream of requests from client 1 and S2 is a stream of requests from client 2. + +\begin{lstlisting} +proc {Server S1 S2} + case (S1|S2) of (M1|T1)|S2 then + ... (handle M1) + {Server T1 S2} + [] S1|(M2|T2) then + ... (handle M2) + {Server S1 T2} + end +end +\end{lstlisting} + +Explain precisely why the server code given above does not satisfy the fairness requirement. Give a +concrete scenario of client and server operations to show what can go wrong. + +\begin{solution} +Cela ne fonctionne pas si le client 2 envoie un message et que le client 1 n'envoie rien. C'est la sémantique du case qui fait que ça ne fonctionne pas. Le deuxième pattern est pris quand on ne peut pas faire réussir le premier. Cette procédure va donc toujours attendre le premier pattern (que le client 1 envoie un message) et ne va jamais passer au deuxième. Si on échangeait les patterns, ça sera l'inverse. De plus, le terme de "\textit{fairness}" est dit d'un scheduler, si chaque runnable thread sera exécuté dans un temps fini, ce qui n'est donc pas le cas ici. +\end{solution} + +One might think that writing the server in a different way (but still in deterministic dataflow) would solve the +problem. But this is not possible. For this question, give the general reason why it is not possible to +satisfy the fairness requirement in deterministic dataflow. + +\begin{solution} +En dataflow déterministe, on ne peut écrire que des programmes sans non déterminisme \textit{observable}. Or, dans le cas de l'application \textbf{serveur|client}, le non déterminisme est inséparable de l'application. En effet, il n'est pas possible de prévoir quand un client va appeler le serveur. Il faut donc être capable d'écrire un programme qui puisse attendre sur plusieurs pattern, ce qui n'est pas possible en dataflow déterministe. +\end{solution} + + +Explain how to write a client/server that does satisfy the fairness requirement. You first need to introduce +a new concept, since pure deterministic dataflow cannot solve the problem. Give a simple code +implementation of a server and a simple code implementation of a client. Your code can be extremely +simple, as long as it shows how to satisfy the fairness requirement. + +\begin{solution} +Pour pouvoir écrire une application du style client serveur, il faut introduire le concept de \textbf{port}, c'est à dire un stream \textit{nommé}. +\begin{lstlisting}[escapechar=µ] +P={NewPort S} +proc {Server S} + case S + of M|T then + (handle M) + {Server T} + end +end +\end{lstlisting} +On envoie un message au serveur via \{Send P M\} où M est le message et P notre port/stream nommé. +\end{solution} + +\section{Nondeterminism} +Is the following program nondeterministic ? +\begin{lstlisting} +declare X={NewCell 1} +thread X:=2 end +thread X:=2 end +\end{lstlisting} + +\begin{solution} +Oui et est donc dangereux. On ne sait pas quel X:=2 sera exécuté en premier et X:= n'est pas une opération \textbf{atomique} donc il est possible qu'un thread "sélectionné" X puis soit arrêté par le scheduler qui va donner du temps de calcul à l'autre thread. Donc cela va modifier X et le X "tenu" par le premier thread ne sera plus le bon. +\end{solution} + +\section{Port objects} +In the course we have seen stateful port objects. It is remarkable that they can be defined as follows with the +FoldL operation: + +\begin{lstlisting} +fun {NewPortObject Init F} +P Out in + thread S in + P={NewPort S} Out={FoldL S F Init} + end + P +end +\end{lstlisting} + +Instead of using a local function Loop to read the message stream and update the state, we use FoldL. For this question, +explain how this definition works. Your answer should start with a specification of the FoldL operation and show how this +specification can be used to do the work of the port object's state transition function. + +\begin{solution} +La fonction FoldL permet d'appliquer une fonction sur tous les éléments d'une liste. Ici, pour passer d'un état à un autre, il faut appliquer une fonction sur les éléments du stream de l'objet. Puisqu'un stream est une liste avec la dernière variable \textit{non liée}, la fonction FoldL est parfaite. +\end{solution} + +\section{Mutable state} +In the course, we introduced mutable state in the form of cells, which are a form of +variable that can be updated multiple times. This is no longer compatible with functional programming, +but it enables new abilities that are not possible in functional programming. For this question, give and +explain an example of a new ability that becomes available with mutable state that was not available +without mutable state. + +\begin{solution} +L'ajout de cellules est nécessaire pour ajouter de la modularité dans un programme c'est à dire changer des fonctions sans pour autant changer leur interface. Si, par exemple, on veut ajouter un compteur dans une fonction pour garder une trace de combien de fois elle est appelée lors de l'exécution d'un programme, en programmation fonctionnelle, il faudrait rajouter un argument à cette fonction et donc modifier le code partout où cette fonction est appelée. Avec les cellules ce n'est pas nécessaire. En programmation fonctionnelle, il n'y a pas d'état, le programme ne se souvient pas de ce qui s'est passé avant. Avec les cellules, il est possible de créer des programmes avec l'état, qui ont donc une mémoire interne. Un programme peut changer son comportement en fonction de ses états passés. +\end{solution} + +\section{Memory management} +This question is about memory management. You are given the following two programs. +\begin{center} +\begin{minipage}{0.45\linewidth} +\begin{lstlisting} +%Program 1: +declare S P Loop in +P={NewPort S} +proc {Loop N} + {Send P N} {Loop N+1} + end +{Loop 1} +\end{lstlisting} +\end{minipage} +% +\begin{minipage}{0.45\linewidth} +\begin{lstlisting} +%Program 2: +declare P Loop in +local S in + P={NewPort S} +end +proc [Loop N} {Send P N} {Loop N+1} end +{Loop 1 +\end{lstlisting} +\end{minipage} +\end{center} +One of these programs has constant active memory size and the other has a memory leak where the active memory size grows +without bounds (which may crash the computer eventually if the process is not terminated).\\ +To understand the behavior of these programs, it is essential to understand the port semantics. Given the +port semantics, explain for both program what happens to its active memory during its execution and +why. Your answer must show how the behavior is a consequence of port semantics and of the difference +between the declare and local statements. + +\begin{solution} + C'est le programme 1 qui a une faute de mémoire. \\ + La sémantique des ports est la suivante: pour la création d'un port: P=\{NewPort S\} donne l'environnement \{P $\rightarrow$ p, S $\rightarrow$ s\} et dnas la mémoire + des ports, la paire $p:s$ est créée avec, $s$, une variable non liée. Quand on effectue l'opération \{Send P X\}, on crée + une nouvelle variable non liée $s'$, on lie $s$ à $x|s'$ et on met à jour la paire $p:s'$. \\ + + Quand le port est dans un \textit{declare}, la variable $s$ sera toujours atteignable et ne sera donc pas éliminé par le garbage + collector. Tandis que si le stream du port est dans un local, les variables $s$ de ce stream ne seront accessibles que depuis ce local. Donc une fois que le local est exécuté + , chaque fois qu'un message est envoyé au port, la variable $s$ du stream devient \textit{inatteignable}, et est donc éliminée, gardant ainsi la consommation + de mémoire active constante. +\end{solution} + +\section{Erlang/OTP} +This question is about building robust distributed applications using the Erlang/OTP +platform. One of the key concepts in Erlang/OTP is the supervisor tree, where one process is able to +observe and manage a set of other processes\par + +Explain the one\_for\_one and one\_for\_all restart strategies, and give for each strategy a simple application +scenario where it would be useful. + +\begin{solution} +ces stratégies sont utilisées quand un superviseur supervise plusieurs processus: +\begin{itemize} +\item One\_for\_one: quand un des enfants crash, il est simplement redémarré par le superviseur sans que ça n'impacte les autres processus (\textit{ex}: client serveur: pour pas impacter les autres clients si il y a un crash) +\item One\_for\_all: si un des enfants crash, tous les processus liés par le même superviseur sont arrêtés et relancés, même s'ils n'ont aucun problème (\textit{ex}: processus synchronisé: nécessaire quand les processus sont dépendants, pour qu'ils restent synchronisés) +\end{itemize} +\end{solution} + +% Ajouter \nosolution s'il n'y a pas de solution disponible pour cette question + +% \nosolution + +\end{document} diff --git a/src/q4/info-INFO1104/exam/2020/Septembre/Septembre.mk b/src/q4/info-INFO1104/exam/2020/Septembre/Septembre.mk new file mode 100644 index 000000000..f670bdce6 --- /dev/null +++ b/src/q4/info-INFO1104/exam/2020/Septembre/Septembre.mk @@ -0,0 +1,2 @@ +MONTH=Septembre +include ../../2020.mk diff --git a/src/q4/info-INFO1104/exam/2021/2021.mk b/src/q4/info-INFO1104/exam/2021/2021.mk new file mode 100644 index 000000000..53bb573dd --- /dev/null +++ b/src/q4/info-INFO1104/exam/2021/2021.mk @@ -0,0 +1,2 @@ +YEAR=2021 +include ../../../exam.mk diff --git a/src/q4/info-INFO1104/exam/2021/Septembre/All/Makefile b/src/q4/info-INFO1104/exam/2021/Septembre/All/Makefile new file mode 100644 index 000000000..ca0c513cb --- /dev/null +++ b/src/q4/info-INFO1104/exam/2021/Septembre/All/Makefile @@ -0,0 +1,2 @@ +MINMAJ=All +include ../Septembre.mk diff --git a/src/q4/info-INFO1104/exam/2021/Septembre/All/info-INFO1104-exam-2021-Septembre-All.tex b/src/q4/info-INFO1104/exam/2021/Septembre/All/info-INFO1104-exam-2021-Septembre-All.tex new file mode 100644 index 000000000..41c9debba --- /dev/null +++ b/src/q4/info-INFO1104/exam/2021/Septembre/All/info-INFO1104-exam-2021-Septembre-All.tex @@ -0,0 +1,21 @@ +\documentclass[fr]{../../../../../../eplexam} + +\hypertitle{}{4}{INFO}{1104}{2021}{Septembre}{All} +{Author1\and Author2\and Author3} +{Professor} + +\section{What is the answer to life, the universe and everything?} + +% Insérer ci-dessous la solution à la question + +\begin{solution} + 42 +\end{solution} + +\section{Is P equal to NP?} + +% Ajouter \nosolution s'il n'y a pas de solution disponible pour cette question + +\nosolution + +\end{document} diff --git a/src/q4/info-INFO1104/exam/2021/Septembre/Septembre.mk b/src/q4/info-INFO1104/exam/2021/Septembre/Septembre.mk new file mode 100644 index 000000000..2cdf73d47 --- /dev/null +++ b/src/q4/info-INFO1104/exam/2021/Septembre/Septembre.mk @@ -0,0 +1,2 @@ +MONTH=Septembre +include ../../2021.mk diff --git a/src/q4/info-INFO1104/exam/exam.mk b/src/q4/info-INFO1104/exam/exam.mk new file mode 100644 index 000000000..b4ea52ded --- /dev/null +++ b/src/q4/info-INFO1104/exam/exam.mk @@ -0,0 +1,3 @@ +TYPE=exam +BASE_DIR=../../../ +include $(BASE_DIR)../info-INFO1104.mk diff --git a/src/q4/info-LINFO1104/info-LINFO1104.mk b/src/q4/info-INFO1104/info-INFO1104.mk similarity index 79% rename from src/q4/info-LINFO1104/info-LINFO1104.mk rename to src/q4/info-INFO1104/info-INFO1104.mk index a97cea0e7..8c9d08bfb 100644 --- a/src/q4/info-LINFO1104/info-LINFO1104.mk +++ b/src/q4/info-INFO1104/info-INFO1104.mk @@ -1,4 +1,4 @@ NAME=info -OPTION=LINFO +OPTION=INFO CODE=1104 include $(BASE_DIR)../../q4.mk diff --git a/src/q4/info-LINFO1104/exam/exam.mk b/src/q4/info-LINFO1104/exam/exam.mk deleted file mode 100644 index 67792ba80..000000000 --- a/src/q4/info-LINFO1104/exam/exam.mk +++ /dev/null @@ -1,3 +0,0 @@ -TYPE=exam -BASE_DIR=../../../ -include $(BASE_DIR)../info-LINFO1104.mk From 2dc561038ec7a8ceaf2591b8319e5d7b82c0a933 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Wed, 28 Jun 2023 17:29:14 +0200 Subject: [PATCH 04/22] LINFO1104 Exam Answer Juin 2021 + update author name --- .../All/info-INFO1104-exam-2020-Juin-All.tex | 2 +- .../info-INFO1104-exam-2020-Septembre-All.tex | 2 +- .../info-INFO1104/exam/2021/Juin/All/Makefile | 2 + .../All/info-INFO1104-exam-2021-Juin-All.tex | 234 ++++++++++++++++++ .../exam/2021/Juin/All/stackException.png | Bin 0 -> 39133 bytes src/q4/info-INFO1104/exam/2021/Juin/Juin.mk | 2 + src/q4/info-INFO1104/exam/2022/2022.mk | 2 + .../info-INFO1104/exam/2022/Juin/All/Makefile | 2 + .../All/info-INFO1104-exam-2022-Juin-All.tex | 21 ++ src/q4/info-INFO1104/exam/2022/Juin/Juin.mk | 2 + .../exam/2022/Septembre/All/Makefile | 2 + .../info-INFO1104-exam-2022-Septembre-All.tex | 21 ++ .../exam/2022/Septembre/Septembre.mk | 2 + 13 files changed, 292 insertions(+), 2 deletions(-) create mode 100644 src/q4/info-INFO1104/exam/2021/Juin/All/Makefile create mode 100644 src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex create mode 100644 src/q4/info-INFO1104/exam/2021/Juin/All/stackException.png create mode 100644 src/q4/info-INFO1104/exam/2021/Juin/Juin.mk create mode 100644 src/q4/info-INFO1104/exam/2022/2022.mk create mode 100644 src/q4/info-INFO1104/exam/2022/Juin/All/Makefile create mode 100644 src/q4/info-INFO1104/exam/2022/Juin/All/info-INFO1104-exam-2022-Juin-All.tex create mode 100644 src/q4/info-INFO1104/exam/2022/Juin/Juin.mk create mode 100644 src/q4/info-INFO1104/exam/2022/Septembre/All/Makefile create mode 100644 src/q4/info-INFO1104/exam/2022/Septembre/All/info-INFO1104-exam-2022-Septembre-All.tex create mode 100644 src/q4/info-INFO1104/exam/2022/Septembre/Septembre.mk diff --git a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex index 1e7d66ba7..1a6ad99c6 100644 --- a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex +++ b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex @@ -29,7 +29,7 @@ \lstset{language=Oz} \hypertitle{Concepts des langages de programmation}{4}{LINFO}{1104}{2020}{Juin}{All} -{Norah \and Thomas Debelle} +{Norah Habets \and Thomas Debelle} {P. Van Roy} \section{Programming paradigms} diff --git a/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex b/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex index 522e59257..03819478e 100644 --- a/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex +++ b/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex @@ -31,7 +31,7 @@ \hypertitle{Concepts des langages de programmation}{4}{INFO}{1104}{2020}{Septembre}{All} -{Norah \and Thomas Debelle} +{Norah Habets \and Thomas Debelle} {P. Van Roy} \section{List data structure} diff --git a/src/q4/info-INFO1104/exam/2021/Juin/All/Makefile b/src/q4/info-INFO1104/exam/2021/Juin/All/Makefile new file mode 100644 index 000000000..a519d4a83 --- /dev/null +++ b/src/q4/info-INFO1104/exam/2021/Juin/All/Makefile @@ -0,0 +1,2 @@ +MINMAJ=All +include ../Juin.mk diff --git a/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex b/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex new file mode 100644 index 000000000..5d5c2216d --- /dev/null +++ b/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex @@ -0,0 +1,234 @@ +\documentclass[fr]{../../../../../../eplexam} +\usepackage{listings} +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{1.0,1.0,1.0} +\definecolor{codeblue}{rgb}{0,0,0.8} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegray}, + keywordstyle=\color{codeblue}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codeblue}, + basicstyle=\ttfamily\footnotesize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2, + frame=shadowbox +} +\lstset{style=mystyle} +\lstset{language=Oz} + +\hypertitle{}{4}{INFO}{1104}{2021}{Juin}{All} +{Norah Habets \and Thomas Debelle} +{P. Van Roy} + +\section{Kernel language} +Translate the following program: +\begin{lstlisting}[escapechar=µ] +local F C in + C={NewCell 0) + fun {F A} + fun {$ B} + C:=@C+1 + A+B + end + end + {Browse {{F 1} 2}} +end +\end{lstlisting} +into kernel language. Be careful to do a complete translation that uses only kernel language instructions! + +\begin{solution} +\begin{lstlisting}[escapechar=µ] +local F C Zero One in + Zero=0 + One=1 + {NewCell Zero C} + F=proc{$ A ?R1} + R1=proc{$ B ?R2} + local C1 C2 C3 in + {Exchange C C1 Zero} + C2=C1+One + {Exchange C C3 C2} + R2=A+B + end + end + end + local F1 F2 Two in + Two=2 + {F One F1} + {F1 Two F2} + {Browse F2} + end +end +\end{lstlisting} +\end{solution} + +\section{Function composition} +Define a function {Compose F G) that takes two one-argument functions F and G and returns their function composition. Give the contextual environment of the function returned by Compose. + +\begin{solution} +\begin{lstlisting}[escapechar=µ] +declare +fun {Compose F G} + fun {$ X}{F {G X}} end +end +\end{lstlisting} +Où E = \{F $\rightarrow$ f, G $\rightarrow$ g\} +\end{solution} + +\section{Lambda calculus reduction} +Reduce the expression (SUCC (SUCC 0)) and show itis equivalent to 2. To make your answer easier to understand, only replace a function by its definition When you need it for a reduction step. + +\begin{solution} +(SUCC (SUCC 0)) $\longrightarrow$ (SUCC ($\lambda n. \lambda f. \lambda x.f((n f)x) \lambda f( \lambda x.x$)) $\longrightarrow$ (SUCC ($\lambda f. \lambda x.f ((\lambda f (\lambda x.x)f)x)$)) $\longrightarrow$ (SUCC ($\lambda f.(\lambda x.(f.x)$)) $\longrightarrow$ ($\lambda n . \lambda f. \lambda x.f ((n f)x) \lambda f(\lambda x (f x))$) $\longrightarrow$ ($\lambda f. \lambda x.f ((\lambda f (\lambda x(f x))f)x$) $\longrightarrow$ ($\lambda f. \lambda x.f(\lambda x(f x)x)$) $\longrightarrow$ ($\lambda f. \lambda x.f(f x)$) $\longrightarrow$ 2 +\end{solution} + +\section{Functional programming} +Define the declarative function {Prod F Xs Ys} that has three arguments, a tvvo-argument function F and two lists Xs=[$x_1$ $x_2$ ... $x_n$] and Ys=[$y_1$ $y_2$ ... $y_n$] and returns the list:\\ +$[f(x_1, y_1) f(x_1,y_2) ... f(x_1, y_m) f(x_2, y_1) f(x_2, y_2) ... f(x_2, y_m) ... f(x_n, y_1) f(x_n, y_2) ... f(x_n, y_m)]$\\ +The number of elements in the returned list is mxn. For example, if Xs=[1 2 3] and Ys=[10 100 1000] and F is multiplication, then the result is [10 100 1000 20 200 2000 30 300 3000). You can define auxiliary functions to simplify your answer. Each recursive function should implement one loop. All functions +should be declarative. Don't worty too much about efficiency, slight inefficiencies will not be penalized. + +\begin{solution} +\begin{lstlisting}[escapechar=µ] +declare +fun {Prod F Xs Ys} + fun {SubProd F X Ys} + case Ys + of Y|nil then {F X Y}|nil + [] Y|Yr then {F X Y}|{SubProd F X Yr} + end + end +in + case Xs + of X|nil then {SubProd F X Ys} + [] X|Xr then {Append {SubProd F X Ys} {Prod F Xr Ys}} + end +end +\end{lstlisting} +\end{solution} + +\section{Objects and abstract data types} +In the course we saw two fundamentally different forms of data abstraction, namely objects and abstract data types ADTs and give an example of each. +\begin{center} +\begin{minipage}{0.45\linewidth} +Objet: représente à la fois une valeur et un ensemble d'opérations (liés) +\begin{lstlisting} +fun {NewStack} + C={NewCell nil} + proc {Push X} C:=X|@C end + proc {Pop X} S=@C in C:=S.2 X=S.1 end + proc {IsEmtpy B} B=(@C==nil) end +in + proc {$ M} + case M of push(x) then {Push X} + [] pop(X) then {Pop X} + [] isEmpty(B) then {IsEmpty B} end + end +end +\end{lstlisting} +\end{minipage} +% +\begin{minipage}{0.45\linewidth} +Adt: représente un ensemble de valeurs et un ensemble d'opérations (séparés) +\begin{lstlisting} +local Wrap Unwrap in + {NewWrapper Wrap Unwrap} + fun {NewStack} + {Wrap nil} + end + fun {Push S X} + {Wrap X|{Unwrap S}} + end + fun {Pop W X} {Unwrap W} in X=S.1 {Wrap S.2} end + fun {IsEmpty S} {Unwrap S}==nil end +end +\end{lstlisting} +\end{minipage} +\end{center} + +\section{Exception} +To handle exceptional situations in a program. we add a new concept called exceptions. We introduce two new instructions for exceptions, namely try $_1$ catch $$ then $_2$ end and raise $$ end. For this question, give the semantics Of try and raise by showing their effects on the semantic stack. + +\begin{solution} +\includegraphics[scale=0.55]{stackException.png} +\end{solution} + +\section{The importance of nondeterminism} + + +\subsection{Definition of nondeterminism} +Define the of nondeterminism in a programming language. Give an example of a program that shows non determinism. + +\begin{solution} +Non-déterminisme correspond à la capacité d'un système à faire des décisions indépendamment du développeur. +\begin{lstlisting} +declare X1 X2 +X1=1 X2=2 +thread {Browse X1} end +thread {Browse X2} end +\end{lstlisting} +On ne sait pas si X1 va être affiché en premier ou non. +\end{solution} + +\subsection{Limitations of deterministic dataflow} +Deterministic dataflow has the strong property that ithas no observable nondeterminism, For this question. give a specification of a client/server application and use this specification to explain Whythe +client/server cannot be written as a deterministic dataflow program. Then define the concept of a port and show in a few lines Of code how to write a client/server by using a port. + +\begin{solution} +Sans non-déterminisme observable, le résultat est toujours le même et le choix est pas fait par le scheduler mais par le programmeur.\par +Or, dans une application client serveur, le résultat dépend de quand on reçoit le message. On reçoit un message, on compile, on répond. Il y a donc d'office du non déterminisme. Le résultat doit être choisi par le scheduler si 2 clients.\par +Un port est un stream nommé. +\begin{lstlisting} +proc {Server S1 S2} + case (S1|S2) of (M1|T1)|S2 then + ... (handle M1) + {Server T1 S2} + [] S1|(M2|T2) then + ... (handle M2) + {Server S1 T2} + end +end +\end{lstlisting} +\end{solution} + + +\section{Erlang support for fault tolerance} + +\subsection{Process linking} +An Erlang process is similarto a port Object An important primitive operation to support fault tolerance in Erlang is linking where processes are linked together. For this question. define linking and explain what it does. How does it work when there are more than two processes? + +\begin{solution} +Link crée un lien entre 2 processus qui est bidirectionnel dans les 2 sens. Lorsqu'un process s'arrête il envoie le signal "normal" à tous les processus auxquels il est lié, sinon il envoie la cause de son arrêt \textit{anormal}. Les processus qui reçoivent un message "anormal" crash aussi et renvoient le message causant le crash.\par +Un process peut être configuré pour piéger les signaux de sorte en appelant \textit{process\_flag}(trap\_exit, true)\par +Un superviseur peut recevoir dans sa mailbox le message sans s'arrêter et prendre des mesures pour restaurer le système. \par +Ainsi, tous les processus liés au crash en suivant la chaine jusqu'à arriver au superviseur. Si aucun process ne démarre, le programme s'arrête. On peut outrepasser un superviseur avec \textbf{exit(kill, Pid)}. +\end{solution} + +\subsection{Supervisor trees} +One of the key concepts in Erlang/OTP to support fault tolerance ts the supervisor tree. Explain what is a supervisor tree. As part of your answer, give two restart strategies and explain how they work. Justify each Strategy with a simple execution scenario. + +\begin{solution} +Un arbre de supervision peut redémarrer, modifier ou arrêter un processus qu'il observe (auquel il est lié). Un superviseur, est lui-même supervisé par un autre superviseur, au cas où il échoue. 2 stratégies: +\begin{enumerate} +\item One\_for\_one: quand un des enfants crash, il est simplement redémarré par le superviseur sans que ça n'impacte les autres processus (\textit{ex}: client serveur: pour pas impacter les autres clients si il y a un crash) +\item One\_for\_all: si un des enfants crash, tous les processus liés par le même superviseur sont arrêtés et relancés, même s'ils n'ont aucun problème (\textit{ex}: processus synchronisé: nécessaire quand les processus sont dépendants, pour qu'ils restent synchronisés) +\end{enumerate} +\end{solution} + +% Ajouter \nosolution s'il n'y a pas de solution disponible pour cette question + +% \nosolution + +\end{document} diff --git a/src/q4/info-INFO1104/exam/2021/Juin/All/stackException.png b/src/q4/info-INFO1104/exam/2021/Juin/All/stackException.png new file mode 100644 index 0000000000000000000000000000000000000000..0d30b6e0c014163599e9d13e79a8f9995edfaa9d GIT binary patch literal 39133 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 Date: Fri, 30 Jun 2023 11:46:13 +0200 Subject: [PATCH 05/22] LINFO1104 Exam Answer September 2021 --- .../All/info-INFO1104-exam-2021-Juin-All.tex | 3 + .../info-INFO1104-exam-2021-Septembre-All.tex | 224 +++++++++++++++++- .../2021/Septembre/All/stackException.png | Bin 0 -> 39133 bytes .../All/info-INFO1104-exam-2022-Juin-All.tex | 84 ++++++- .../exam/2022/Juin/All/stackException.png | Bin 0 -> 39133 bytes .../info-INFO1104-exam-2022-Septembre-All.tex | 88 ++++++- 6 files changed, 374 insertions(+), 25 deletions(-) create mode 100644 src/q4/info-INFO1104/exam/2021/Septembre/All/stackException.png create mode 100644 src/q4/info-INFO1104/exam/2022/Juin/All/stackException.png diff --git a/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex b/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex index 5d5c2216d..d7863cc33 100644 --- a/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex +++ b/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex @@ -121,6 +121,8 @@ \section{Functional programming} \section{Objects and abstract data types} In the course we saw two fundamentally different forms of data abstraction, namely objects and abstract data types ADTs and give an example of each. + +\begin{solution} \begin{center} \begin{minipage}{0.45\linewidth} Objet: représente à la fois une valeur et un ensemble d'opérations (liés) @@ -157,6 +159,7 @@ \section{Objects and abstract data types} \end{lstlisting} \end{minipage} \end{center} +\end{solution} \section{Exception} To handle exceptional situations in a program. we add a new concept called exceptions. We introduce two new instructions for exceptions, namely try $_1$ catch $$ then $_2$ end and raise $$ end. For this question, give the semantics Of try and raise by showing their effects on the semantic stack. diff --git a/src/q4/info-INFO1104/exam/2021/Septembre/All/info-INFO1104-exam-2021-Septembre-All.tex b/src/q4/info-INFO1104/exam/2021/Septembre/All/info-INFO1104-exam-2021-Septembre-All.tex index 41c9debba..615a7c126 100644 --- a/src/q4/info-INFO1104/exam/2021/Septembre/All/info-INFO1104-exam-2021-Septembre-All.tex +++ b/src/q4/info-INFO1104/exam/2021/Septembre/All/info-INFO1104-exam-2021-Septembre-All.tex @@ -1,21 +1,229 @@ \documentclass[fr]{../../../../../../eplexam} +\usepackage{listings} +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{1.0,1.0,1.0} +\definecolor{codeblue}{rgb}{0,0,0.8} +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegray}, + keywordstyle=\color{codeblue}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codeblue}, + basicstyle=\ttfamily\footnotesize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2, + frame=shadowbox +} +\lstset{style=mystyle} +\lstset{language=Oz} \hypertitle{}{4}{INFO}{1104}{2021}{Septembre}{All} -{Author1\and Author2\and Author3} -{Professor} +{Norah Habets \and Thomas Debelle} +{P. Van Roy} -\section{What is the answer to life, the universe and everything?} -% Insérer ci-dessous la solution à la question +\section{Scope} +Define the scope of an identifier occurrence. Give a code example where the same identifier occurs more than once and where these occurrences represent more than one variable. \begin{solution} - 42 +La portée d'un identificateur est la partie où l'occurrence se réfère à la même déclaration de variable +\begin{lstlisting}[escapechar=µ] +local + X +in + X=42 {Browse X} %Affiche 42 + local + X + in + X=11 {Browse X} %Affiche 11 + end + {Browse X} %Affiche 42 +end +\end{lstlisting} \end{solution} -\section{Is P equal to NP?} +\section{Ordered binary tree} +Define an ordered binarytree type. Give first the EBNF grammar definition Ofa binary tree and then define the condition of bein ordered. -% Ajouter \nosolution s'il n'y a pas de solution disponible pour cette question +\begin{solution} +EBNF = Extended Backus-Naur form +\begin{lstlisting}[escapechar=µ] + ::= leaf|t(T ... ) + ::= leaf|t(key:T value:T left: right: +\end{lstlisting} +\begin{itemize} +\item \underline{Binary:} chaque élément hormis les feuilles ont 2 sous-arbres +\item \underline{Ordered:} pour chaque arbre (inclus les sous-arbres) toutes les clés à gauche dans le sous-arbres sont inférieurs à la clé de la racine. Les clés à droite sont toutes supérieures à celles de la clé de la racine. +\end{itemize} +\end{solution} + +\section{Deleting a node from an ordered binary tree} +Given an ordered binary tree where each node has a key and a value. Define the function \{Delete K T\} that removes the node with key K from the tree (if the node exists) and returns a new ordered binary tree that contains all the nodes of T without the node with key K. To implementthe Delete function, you will need to define one auxiliary function, \{RemoveSmaIlest T\} which returns the smallest element of T and a new ordered tree without the smallest element. Both functions should be written in Oz in the declarative paradigm and using pattern matching to keep them simple. To make sure you define Delete and RemoveSmaIIest correctly, it can be a good idea to draw diagrams of what these functions do in different cases (such as when a tree is empty or when a tree has an empty subtree). + +\begin{solution} +\begin{center} +\begin{lstlisting} +fun {RemoveSmallest T} + case T + of leaf then none + [] tree(key:X value:V left:T1 right:T2) then + case {RemoveSmallest T1} + of none then triple(T2 X V) + [] triple(Tp Xp Vp) then + triple(tree(key:X value:V left:Tp right:T2) Xp Vp) + end + end +end +\end{lstlisting} +\begin{lstlisting} +fun {Delete K T} + case T + of leaf then leaf + [] tree(key:X value:V left:T1 right:T2) andthen K==X then + case {RemoveSmallest T2} + of none then T1 + [] triple(Tp Yp Vp) then + tree(key:Yp value:Vp left:T1 right:Tp) + end + [] tree(key:X value:V left:T1 right:T2) andthen KX then + tree(key:K value:V left:T1 right:{Delete K T2}) + end +end +\end{lstlisting} +\end{center} +\end{solution} + +\section{Lambda calculus} +Reduce the expression (SECOND (PAIR I (PAIR 2 NIL)))) to its simplest form. To make your answer easy to read, it is highly recommended to keep the abbreviations wheneveryou can! Only replace an abbreviation by its definition when you intend to applyit There Will be a penalty if your answer is overly complex. + +\begin{solution} +(SECOND (PAIR 1 (PAIR 2 NIL))) $\longrightarrow$ ($\lambda p.$(p FALSE)(PAIR 1 (PAIR 2 NIL))) $\longrightarrow$ (PAIR 1 (PAIR 2 NIL) FALSE) $\longrightarrow$ ($\lambda x. \lambda y. \lambda f$(f x y) 1 (PAIR 2 NIL) FALSE) $\longrightarrow$ (FALSE 1 (PAIR 2 NIL)) $\longrightarrow$ ($\lambda x. \lambda y.y$ 1 (PAIR 2 NIL)) $\longrightarrow$ (PAIR 2 NIL) $\longrightarrow$ ($\lambda x. \lambda y. \lambda f$(f x y) 2 NIL) $\longrightarrow$ ($\lambda f.$(f 2 NIL)) +\end{solution} + +\section{Data abstraction} +In the course we saw two fundamentally different forms of data abstraction, namely objects and abstract data types ADTs). For this question, define objects and ADTs and give an example of each (either a code example or an example from the real world). Explain Why your example is an Object or an ADT. + +\begin{solution} +\begin{center} +\begin{minipage}{0.45\linewidth} +Objet: représente à la fois une valeur et un ensemble d'opérations (liés) +\begin{lstlisting} +fun {NewStack} + C={NewCell nil} + proc {Push X} C:=X|@C end + proc {Pop X} S=@C in C:=S.2 X=S.1 end + proc {IsEmtpy B} B=(@C==nil) end +in + proc {$ M} + case M of push(x) then {Push X} + [] pop(X) then {Pop X} + [] isEmpty(B) then {IsEmpty B} end + end +end +\end{lstlisting} +\end{minipage} +% +\begin{minipage}{0.45\linewidth} +Adt: représente un ensemble de valeurs et un ensemble d'opérations (séparés) +\begin{lstlisting} +local Wrap Unwrap in + {NewWrapper Wrap Unwrap} + fun {NewStack} + {Wrap nil} + end + fun {Push S X} + {Wrap X|{Unwrap S}} + end + fun {Pop W X} {Unwrap W} in X=S.1 {Wrap S.2} end + fun {IsEmpty S} {Unwrap S}==nil end +end +\end{lstlisting} +\end{minipage} +\end{center} +\end{solution} + +\section{Functional object} +Give a code example of a functional Object. Calling a functional object returns another object with a new value inside. For example, Cl=\{NewCounter\} creates the counter Object CI with initial count 0. Then returns a new counter Object C2 with count l, and returns a new counter Object C3 with count 2. Hint: you need to define an auxiliary function \{CounterObject I\} that returns a counter object with count I. A counter Object is a record with an "inc" field that contains an increment function. + +\begin{solution} +\begin{lstlisting}[escapechar=µ] +declare +fun {NewCounter} + fun {CounterObject I} + fun {Inc} {CounterObject I+1} end + fun {Get} I end %Optionnel + in + counter(inc:Inc get:Get) + end +in + {CounterObject 0} +end +\end{lstlisting} +\end{solution} + +\section{Exceptions} +To handle exceptional situations in a program, we add a new concept called exceptions. We introducenew instructions for exceptions, namely try $_1$ catch $$ then $_2$ end and raise end. For this question, give the semantics of both try and raise by showing their effects on the semantic stack. Be careful to show exactly what is on the stack, including and and also the other instructions (such as the instructions below the try). Your answer should show the connection between and by giving the environments of the instructions. Your answer should also show what happens in the case that no exception is raised and also what happens in the case that a raise is executed. + +\begin{solution} +\includegraphics[scale=0.55]{stackException.png} +\end{solution} + +\section{The scheduler and its friends} +Define the concept of a scheduler in a concurrent system. Explain precisely what the scheduler does. As part of your explanation, define the six concepts of nondeterminism, time slice, runnable, suspended, fairness, and statvation. Be sure to give a clear definition for each of these six concepts! + +\begin{solution} +\begin{itemize} +\item \underline{Scheduler:} partie du système qui décide à tout moment quel thread exécuter (donc exemple non déterminisme) + \begin{lstlisting}[escapechar=µ] + declare + thread X=1 end + thread X=2 end + {Browse X} %On ne sait pas si 1 ou 2 sera affichµ\textcolor{gray}{é}µ + \end{lstlisting} +% oui on doit faire "µ\textcolor{gray}{é}µ" pour afficher un accent mdr +\item \underline{Non déterminisme:} Capacité du système à faire des décisions indépendantes du développeur. +\item \underline{Time slice:} courte période (souvent 10 ms) pendant laquelle s'exécute un thread. +\item \underline{Runnable:} dit d'un thread si l'instruction située au sommet de sa stack n'est pas en attente d'une variable dataflow. +\item \underline{Suspended:} dit d'un thread si il est bloqué sur une variable. +\item \underline{Fairness:} dit d'un scheduler, si chaque runnable thread sera exécuté dans un temps fini (les threads sont classés en fonction de leur priorité et des garanties supplémentes sont données sur le pourcentage du temps accordé aux threads de même priorité) +\item \underline{Starvation:} si le scheduler n'est pas \textit{fair}. Certains threads peuvent "\textit{starve}" donc recevoir 0\% du temps du processeur et ne s'exécutent donc jamais et le programme s'arrête. +\end{itemize} +\end{solution} + +\section{Erlang support for fault tolerance} + +\subsection{Process linking} +An Erlang process is similar to a port Object. An important primitive operation to support fault tolerance in Erlang is linking, where processes are linked together. For this question, define linking and explain what it does. How does it work when there are more than processes? + +\begin{solution} +Link crée un lien entre 2 processus qui est bidirectionnel dans les 2 sens. Lorsqu'un process s'arrête il envoie le signal "normal" à tous les processus auxquels il est lié, sinon il envoie la cause de son arrêt \textit{anormal}. Les processus qui reçoivent un message "anormal" crash aussi et renvoient le message causant le crash.\par +Un process peut être configuré pour piéger les signaux de sorte en appelant \textit{process\_flag}(trap\_exit, true)\par +Un superviseur peut recevoir dans sa mailbox le message sans s'arrêter et prendre des mesures pour restaurer le système. \par +Ainsi, tous les processus liés au crash en suivant la chaine jusqu'à arriver au superviseur. Si aucun process ne démarre, le programme s'arrête. On peut outrepasser un superviseur avec \textbf{exit(kill, Pid)}. +\end{solution} + +\subsection{Supervisor trees} +One of the key concepts in Erlang/OTP to support fault tolerance is the supervisor tree. Explain what is a supervisor tree. As part of your answer, give two restart strategies and explain how they work. Justify each strategy with a simple execution scenario. + +\begin{solution} +Un arbre de supervision peut redémarrer, modifier ou arrêter un processus qu'il observe (auquel il est lié). Un superviseur, est lui-même supervisé par un autre superviseur, au cas où il échoue. 2 stratégies: +\begin{enumerate} +\item One\_for\_one: quand un des enfants crash, il est simplement redémarré par le superviseur sans que ça n'impacte les autres processus (\textit{ex}: client serveur: pour pas impacter les autres clients si il y a un crash) +\item One\_for\_all: si un des enfants crash, tous les processus liés par le même superviseur sont arrêtés et relancés, même s'ils n'ont aucun problème (\textit{ex}: processus synchronisé: nécessaire quand les processus sont dépendants, pour qu'ils restent synchronisés) +\end{enumerate} +\end{solution} -\nosolution \end{document} diff --git a/src/q4/info-INFO1104/exam/2021/Septembre/All/stackException.png b/src/q4/info-INFO1104/exam/2021/Septembre/All/stackException.png new file mode 100644 index 0000000000000000000000000000000000000000..0d30b6e0c014163599e9d13e79a8f9995edfaa9d GIT binary patch literal 39133 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 end"} +Show the execution state before and after the execution of this instruction. Your answer can continue on the nextpage. + +\section{Lambda calculus reduction} +Reduce the expression (SUCC (SUCC I)) and show itis equivalent to 3. Show all reduction steps. To make your answer easier to understand, you must only replace a function by its definition when you need it for a reduction step. + +\section{Exceptions} +To handle exceptional situations in a program, we add a new concept called exceptions. We introducenew instructions for exceptions, namely try $_1$ catch $$ then $_2$ end and raise end. For this question, give the semantics of both try and raise by showing their effects on the semantic stack. Be careful to show exactly what is on the stack, including and and also the other instructions (such as the instructions below the try). Your answer should show the connection between and by giving the environments of the instructions. Your answer should also show what happens in the case that no exception is raised and also what happens in the case that a raise is executed. \begin{solution} - 42 +\includegraphics[scale=0.55]{stackException.png} \end{solution} -\section{Is P equal to NP?} +\section{Ports and port objects} +\subsection{Give the semantics of the port send operation} +For the operation \{Send P X\}, give the execution state before and after the operation's execution. You may assume that P is correctly bound to a port before the execution (the port is already created). + +\subsection{Stateful port objects} +Define a function that takes an initial state and a state transition function so that it creates a stateful port Object when it is called. + +\section{Erlang mechanisms for long-lived programs} -% Ajouter \nosolution s'il n'y a pas de solution disponible pour cette question +\subsection{Process linking} +An Erlang process is similar to a port Object. An important primitive operation to support fault tolerance in Erlang is linking, where processes are linked together. For this question, define linking and explain what it does. How does it work when there are more than processes? + +\begin{solution} +Link crée un lien entre 2 processus qui est bidirectionnel dans les 2 sens. Lorsqu'un process s'arrête il envoie le signal "normal" à tous les processus auxquels il est lié, sinon il envoie la cause de son arrêt \textit{anormal}. Les processus qui reçoivent un message "anormal" crash aussi et renvoient le message causant le crash.\par +Un process peut être configuré pour piéger les signaux de sorte en appelant \textit{process\_flag}(trap\_exit, true)\par +Un superviseur peut recevoir dans sa mailbox le message sans s'arrêter et prendre des mesures pour restaurer le système. \par +Ainsi, tous les processus liés au crash en suivant la chaine jusqu'à arriver au superviseur. Si aucun process ne démarre, le programme s'arrête. On peut outrepasser un superviseur avec \textbf{exit(kill, Pid)}. +\end{solution} -\nosolution +\subsection{Dynamic code change} +In Erlangitis possible to update the code without stopping the system. Erlang has two basic mechanisms to allow this. For this question, explain the two mechanisms and give small code fragments in Erlang to illustrate them (as we did in the course). Hint: one of the mechanisms needs to be supported by the implementation, whereas the other mechanism is a consequence of functional programming. \end{document} diff --git a/src/q4/info-INFO1104/exam/2022/Juin/All/stackException.png b/src/q4/info-INFO1104/exam/2022/Juin/All/stackException.png new file mode 100644 index 0000000000000000000000000000000000000000..0d30b6e0c014163599e9d13e79a8f9995edfaa9d GIT binary patch literal 39133 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 Date: Fri, 30 Jun 2023 12:39:45 +0200 Subject: [PATCH 06/22] LINFO1104 Exam Answer Juin 2022 --- .../exam/2022/Juin/All/Diagramme2.drawio | 103 ++++++++++++++++++ .../exam/2022/Juin/All/Diagramme2.png | Bin 0 -> 5753 bytes .../All/info-INFO1104-exam-2022-Juin-All.tex | 85 +++++++++++++++ .../exam/2022/Juin/All/semantiquePort.png | Bin 0 -> 25019 bytes .../info-INFO1104-exam-2022-Septembre-All.tex | 27 +++++ 5 files changed, 215 insertions(+) create mode 100644 src/q4/info-INFO1104/exam/2022/Juin/All/Diagramme2.drawio create mode 100644 src/q4/info-INFO1104/exam/2022/Juin/All/Diagramme2.png create mode 100644 src/q4/info-INFO1104/exam/2022/Juin/All/semantiquePort.png diff --git a/src/q4/info-INFO1104/exam/2022/Juin/All/Diagramme2.drawio b/src/q4/info-INFO1104/exam/2022/Juin/All/Diagramme2.drawio new file mode 100644 index 000000000..1c41fe3c0 --- /dev/null +++ b/src/q4/info-INFO1104/exam/2022/Juin/All/Diagramme2.drawio @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/q4/info-INFO1104/exam/2022/Juin/All/Diagramme2.png b/src/q4/info-INFO1104/exam/2022/Juin/All/Diagramme2.png new file mode 100644 index 0000000000000000000000000000000000000000..6667e6d91f48117d22f33c99cd057f67d02f6524 GIT binary patch literal 5753 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 YbiLu_-1Tw@aF end"} Show the execution state before and after the execution of this instruction. Your answer can continue on the nextpage. +\begin{solution} +\begin{center} +\includegraphics[scale=0.6]{Diagramme2.png} +\end{center} +Séquence d'états d'exécution: $(MST_1, \sigma_1) \rightarrow (MST_2, \sigma_2) \rightarrow ...$. MST = multiset of semantic stacks. Une étape par thread (choix du thread par le scheduler). On utilise l'interleaving semantics.\\ +On crée une nouvelle pile sémantique contenant et qui accède à la même mémoire que la pile sémantique de base. La mémoire est partagée. +\end{solution} + \section{Lambda calculus reduction} Reduce the expression (SUCC (SUCC I)) and show itis equivalent to 3. Show all reduction steps. To make your answer easier to understand, you must only replace a function by its definition when you need it for a reduction step. +\begin{solution} +(SUCC (SUCC 1)) $\longrightarrow$ (SUCC ($\lambda n. \lambda f. \lambda x.f$((n f) x) 1)) $\longrightarrow$ (SUCC ($\lambda f. \lambda x.f$((1 f) x))) $\longrightarrow$ (SUCC ($\lambda f. \lambda x.f$(($\lambda f. \lambda x.fxf$)x))) $\longrightarrow$ (SUCC ($\lambda f. \lambda x.f$ (($\lambda x.fx$)x))) $\longrightarrow$ (SUCC ($\lambda f. \lambda x.f$(f x))) $\longrightarrow$ (SUCC 2) $\longrightarrow$ ($\lambda f. \lambda x.f$((2 f) x)) $\longrightarrow$ ($\lambda f. \lambda x.f(f(f$ x))) $\longrightarrow$ $3$ +\end{solution} + \section{Exceptions} To handle exceptional situations in a program, we add a new concept called exceptions. We introducenew instructions for exceptions, namely try $_1$ catch $$ then $_2$ end and raise end. For this question, give the semantics of both try and raise by showing their effects on the semantic stack. Be careful to show exactly what is on the stack, including and and also the other instructions (such as the instructions below the try). Your answer should show the connection between and by giving the environments of the instructions. Your answer should also show what happens in the case that no exception is raised and also what happens in the case that a raise is executed. @@ -68,9 +96,38 @@ \section{Ports and port objects} \subsection{Give the semantics of the port send operation} For the operation \{Send P X\}, give the execution state before and after the operation's execution. You may assume that P is correctly bound to a port before the execution (the port is already created). +\begin{solution} +En supposant que le port a été créé par P=\{NewPort S\}: +\begin{lstlisting}[escapechar=µ] +([({Send P X}, {P µ$\rightarrow$µ p, X µ$\rightarrow$µ x, S µ$\rightarrow$µ s}), ...], µ$\sigma$µ={p=µ$\xi$µ,s,x}µ$\bigcup$µ{p:s}) +([(...)], µ$\sigma$µ={p=µ$\xi$µ,s=x|s',s',x}µ$\bigcup$µ{p:s'}) +\end{lstlisting} +\begin{center} +\includegraphics[scale=0.5]{semantiquePort.png} +\end{center} +\end{solution} + \subsection{Stateful port objects} Define a function that takes an initial state and a state transition function so that it creates a stateful port Object when it is called. +\begin{solution} +\begin{lstlisting}[escapechar=µ] +fun {NewPortObject Behaviour Init} + local S + thread P={NewPort S} Out={FoldL S Behaviour Init} end + in + proc {$ M} {Send P M} end + end +end +declare +fun {FoldL S F U} + case S of nil then U + [] H|T then {FoldL T F {F U H}} + end +end +\end{lstlisting} +\end{solution} + \section{Erlang mechanisms for long-lived programs} \subsection{Process linking} @@ -86,4 +143,32 @@ \subsection{Process linking} \subsection{Dynamic code change} In Erlangitis possible to update the code without stopping the system. Erlang has two basic mechanisms to allow this. For this question, explain the two mechanisms and give small code fragments in Erlang to illustrate them (as we did in the course). Hint: one of the mechanisms needs to be supported by the implementation, whereas the other mechanism is a consequence of functional programming. +\begin{solution} +\begin{minipage}[t]{0.45\linewidth} +\begin{lstlisting}[language=erlang, caption={use new version}] +-module(m). + +loop(Data, F) -> + receive + (From,Q} -> + {Reply,Data1}=F(Q,Data), + m:loop(Data1, F) +end. +\end{lstlisting} +\end{minipage} +% +\begin{minipage}[t]{0.45\linewidth} +\begin{lstlisting}[language=erlang, caption={use old version}] +-module(m). + +loop(Data, F) -> + receive + {From,Q} -> + {Reply,Data1}=F(Q,Data), + loop(Data1, F) +end. +\end{lstlisting} +\end{minipage} +\end{solution} + \end{document} diff --git a/src/q4/info-INFO1104/exam/2022/Juin/All/semantiquePort.png b/src/q4/info-INFO1104/exam/2022/Juin/All/semantiquePort.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3ae1dd82837df1a59607e11650d54791407b56 GIT binary patch literal 25019 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 literal 0 HcmV?d00001 diff --git a/src/q4/info-INFO1104/exam/2022/Septembre/All/info-INFO1104-exam-2022-Septembre-All.tex b/src/q4/info-INFO1104/exam/2022/Septembre/All/info-INFO1104-exam-2022-Septembre-All.tex index 68d4d92fd..0abca9b30 100644 --- a/src/q4/info-INFO1104/exam/2022/Septembre/All/info-INFO1104-exam-2022-Septembre-All.tex +++ b/src/q4/info-INFO1104/exam/2022/Septembre/All/info-INFO1104-exam-2022-Septembre-All.tex @@ -87,5 +87,32 @@ \subsection{Process linking} \subsection{Dynamic code change} In Erlangitis possible to update the code without stopping the system. Erlang has two basic mechanisms to allow this. For this question, explain the two mechanisms and give small code fragments in Erlang to illustrate them (as we did in the course). Hint: one of the mechanisms needs to be supported by the implementation, whereas the other mechanism is a consequence of functional programming. +\begin{solution} +\begin{minipage}[t]{0.45\linewidth} +\begin{lstlisting}[language=erlang, caption={use new version}] +-module(m). + +loop(Data, F) -> + receive + (From,Q} -> + {Reply,Data1}=F(Q,Data), + m:loop(Data1, F) +end. +\end{lstlisting} +\end{minipage} +% +\begin{minipage}[t]{0.45\linewidth} +\begin{lstlisting}[language=erlang, caption={use old version}] +-module(m). + +loop(Data, F) -> + receive + {From,Q} -> + {Reply,Data1}=F(Q,Data), + loop(Data1, F) +end. +\end{lstlisting} +\end{minipage} +\end{solution} \end{document} From 611f4f2defea341e30ad00067cacc6f022a2b523 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 13:22:01 +0200 Subject: [PATCH 07/22] LINFO1104 Exam Answer Septembre 2022 --- .../info-INFO1104-exam-2022-Septembre-All.tex | 91 ++++++++++++++++++- 1 file changed, 89 insertions(+), 2 deletions(-) diff --git a/src/q4/info-INFO1104/exam/2022/Septembre/All/info-INFO1104-exam-2022-Septembre-All.tex b/src/q4/info-INFO1104/exam/2022/Septembre/All/info-INFO1104-exam-2022-Septembre-All.tex index 0abca9b30..f88999cc3 100644 --- a/src/q4/info-INFO1104/exam/2022/Septembre/All/info-INFO1104-exam-2022-Septembre-All.tex +++ b/src/q4/info-INFO1104/exam/2022/Septembre/All/info-INFO1104-exam-2022-Septembre-All.tex @@ -50,28 +50,115 @@ \section{Kernel Language} \end{minipage} \end{center} +\begin{solution} +\begin{lstlisting}[escapechar=µ] +local F C One C1 in One=1 + {NewCell One C} + F=proc {$ A ?R1} + R1=@A + end + {F C ?R2} + C1=R2+One + C:=C1 +end +\end{lstlisting} +\end{solution} + \section{Basic concepts} \subsection{Scope} Define "scope" in a programming language. Give an example. -\subsection{Contextual environnment} -Define "contextual environnment" of a procedure. Give an example +\begin{solution} +La portée d'un identificateur est la partie où l'occurrence se réfère à la même déclaration de variable +\begin{lstlisting}[escapechar=µ] +local + X +in + X=42 {Browse X} %Affiche 42 + local + X + in + X=11 {Browse X} %Affiche 11 + end + {Browse X} %Affiche 42 +end +\end{lstlisting} +\end{solution} + +\subsection{Contextual environment} +Define "contextual environment" of a procedure. Give an example +\begin{solution} +L'environnement contextuel une fonction (ou procédure) contient tous les identificateurs qui sont utilisés dans la fonction mais déclarés en dehors. +\begin{lstlisting}[escapechar=µ] +declare +fun {Compose F G} + fun {$ X}{F {G X}} end +end +\end{lstlisting} +Où E = \{F $\rightarrow$ f, G $\rightarrow$ g\} +\end{solution} \section{Lambda calculus} Reduce the expression (PLUS 1 (IFTHENELSE (ISZERO 1) O I)) to its simplest form. Show all reduction steps. To make your answer easier to understand, you must only replace a function by its definition when you need it for a reduction step. If you do not do this, there wüll be a penalty. +\begin{solution} +\begin{itemize} +\item (ISZERO 1) $\longrightarrow$ ($\lambda n.(n(\lambda x.$FALSE) TRUE 1) $\longrightarrow$ (1 ($\lambda x.$FALSE) TRUE) $\longrightarrow$ ($\lambda f.(\lambda x$(f x))($\lambda x.$FALSE) TRUE) $\longrightarrow$ (($\lambda x.$ FALSE) TRUE) $\longrightarrow$ (($\lambda x. \lambda x. \lambda y.y$) TRUE) $\longrightarrow$ $\lambda x. \lambda y.y$ $\longrightarrow$ FALSE +\item (IFTHENELSE (ISZERO 1) 0 1) $\longrightarrow$ (IFTHENELSE FALSE 0 1) $\longrightarrow$ ($\lambda p. \lambda a. \lambda b.$(p a b) FALSE 0 1) $\longrightarrow$ (FALSE 0 1) $\longrightarrow$ ($\lambda x. \lambda y.y$ 0 1) $\longrightarrow$ 1 +\item (PLUS 1 (IFTHENELSE (ISZERO 1) 0 1)) $\longrightarrow$ (PLUS 1 1) $\longrightarrow$ ($\lambda m. \lambda n. \lambda f. \lambda x.$(m f)((n f) x) 1 1) $\longrightarrow$ ($\lambda f. \lambda x.$(1 f)((1 f) x)) $\longrightarrow$ ($\lambda f. \lambda x.$(f (f x))) $\longrightarrow$ 2 +\end{itemize} +\end{solution} + \section{Functional object} Give a code example of a functional Object. Calling a functional Object returns another Object with a new value inside. For example, creates the counter object Cl with initial count 0. Then returns a new counter Object C2 with count 1, and returns a new counter Object C3 with count 2. Hints: A functional Object is purely declarative; cells are not allowed. You need to define an auxiliary function \{CounterObject I\} that returns a counter Object with count I. A counter Object is a record with an 'inc' field that contains an increment function. +\begin{solution} +\begin{lstlisting}[escapechar=µ] +declare +fun {NewCounter} + fun {CounterObject I} + fun {Inc} {CounterObject I+1} end + fun {Get} I end %Optionnel + in + counter(inc:Inc get:Get) + end +in + {CounterObject 0} +end +\end{lstlisting} +\end{solution} + + \section{Nondeterminism} \subsection{Definition of nondeterminism} Define the concept of nondeterminism in a programming language. Be careful to give a precise definition! It is a bit subtle. Give an example of a program that shows nondeterminism. +\begin{solution} +Non-déterminisme correspond à la capacité d'un système à faire des décisions indépendamment du développeur. +\begin{lstlisting} +declare X1 X2 +X1=1 X2=2 +thread {Browse X1} end +thread {Browse X2} end +\end{lstlisting} +On ne sait pas si X1 va être affiché en premier ou non. +\end{solution} + \subsection{Overcoming the limitation of deterministic dataflow} Deterministic dataflow has the strong property that it has no observable nondeterminism. For this question, first give a specification of a client/server application, second use this specification to explain Why the client/server be written as a deterministic dataflow program. Third, briefly define the concept of a port and fourth show in a few lines of code how to write a client/server with a port. +\begin{solution} +Sans non-déterminisme observable, le résultat est toujours le même. Or, dans une application Client|Serveur, le résultat dépend de quand on reçoit le message. On reçoit un message, on compile et on répond. Il y a donc d'office du non-déterminisme. Le résultat est choisi par le scheduler et non par le développeur.\par +Un port est un stream: +\begin{lstlisting}[escapechar=µ] +P={NewPort S} %Crµ\textcolor{gray}{é}µe un port avec un stream +{Send P N} %Ajoute N au stream +\end{lstlisting} +Client Serveur avec un port. Les clients envoient et reçoivent des message. Les clients sont des agents concurrents. Le serveur reçoit un message, fait un calcul en local et envoie une réponse immédiate. +\end{solution} + \section{Erlang mechanisms for long-lived programs} \subsection{Process linking} From ddcb6ca6e17c4086432b21a4254e0cfd93de8622 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 13:35:02 +0200 Subject: [PATCH 08/22] LINFO1104 added solution for Juin 2020 exam --- .../All/info-INFO1104-exam-2020-Juin-All.tex | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex index 1a6ad99c6..236a74310 100644 --- a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex +++ b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex @@ -90,7 +90,12 @@ \section{Ordered binary trees} Execute the following code on paper (not on a computer): A=\{Delete dog \{Insert mouse souris \{Insert cat chat \{Insert dog chien leaf\}\}\}\} -\nosolution +\begin{solution} +\begin{lstlisting}[escapechar=µ] +A=tree(key:mouse value:souris tree(key:cat value:chat leaf leaf) leaf) +A=tree(key:cat value:chat leaf tree(key:mouse value:souris leaf leaf)) +\end{lstlisting} +\end{solution} \section{Abstract machine semantics} The following two questions concern the abstract machine semantics we have seen in the course. @@ -133,7 +138,7 @@ \section{Lambda Calculus} reduction on each line of your answer (use a bullet list) \begin{solution} - $(FIRST (PAIR \wedge NIL)) \longrightarrow (\lambda p ( p TRUE)(PAIR \wedge NIL)) \longrightarrow ((PAIR \wedge NIL) TRUE) \longrightarrow ((\lambda x.\lambda y . \lambda f.(f x y) 1 NIL) TRUE) \longrightarrow (TRUE 1 NIL) \longrightarrow (\lambda x. \lambda y . x \wedge NIL) \longrightarrow 1$ + $(FIRST (PAIR \wedge NIL)) \longrightarrow (\lambda p ( p TRUE)(PAIR \wedge NIL)) \longrightarrow ((PAIR \wedge NIL) TRUE) \longrightarrow ((\lambda x.\lambda y . \lambda f.$(f x y) 1 NIL) TRUE) $\longrightarrow (TRUE 1 NIL) \longrightarrow (\lambda x. \lambda y . x \wedge NIL) \longrightarrow 1$ \end{solution} \section{Partial values} @@ -158,13 +163,36 @@ \section{Data abstraction} that any useful helper operation defined in the course exists. Try to make the code look nice (use a numbered bullet list) -\nosolution +\begin{solution} +\begin{lstlisting}[escapechar=µ] +local Wrap Unwrap in + {NewWrapper Wrap Unwrap} + fun {Newcounter} {Wrap 0} end + fun {Inc C} {Wrap {Unwrap C}+1} end + fun {Dec C} {Wrap {Unwrap C}-1} end + fun {IsZero C} {Unwrap C}==0 end + fun {Get C} {Unwrap C} end +end +\end{lstlisting} +\end{solution} Give the implementation for the counter abstraction as an object (Oz code). You should group the object operations in a record (do not use class syntax). Try to make the code look nice (use a numbered bullet list). -\nosolution +\begin{solution} +\begin{lstlisting}[escapechar=µ] +fun {NewConter} + C={NewCell 0} + proc {Inc} C:=@C+1 end + proc {Dec} C:=@C-1 end + fun {IsZero} @C==0 end + fun {Get} @C end +in + counter(inc:Inc dec:Dec isZero:IsZero get:Get) +end +\end{lstlisting} +\end{solution} \section{Limits of deterministic dataflow} This question is about client/servers and the limits of deterministic dataflow. Given a From a7c770e9789ffc2c1e463045d63debd3229c0efd Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 12:54:02 +0000 Subject: [PATCH 09/22] Workflow added --- .github/workflows/main.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..75ac31936 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,32 @@ +name: Compiling & Checking +run-name: Compiling all files +on: + push: + branches: + name: + - master + - master_clean +jobs: + compiling: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Setting Up +# Install textlive + run: | + sudo apt-get install texlive-latex-base + sudo apt-get install texlive-fonts-recommended + sudo apt-get install texlive-fonts-extra + sudo apt-get install texlive-latex-extra + sudo apt install texlive-lang-french + - name: Compiling + run: | + ls + make -f Makefile + - name: Storing + uses: actions/upload-artifact@v3 + with: + name: Archive + path: src/ \ No newline at end of file From fb205c9ab4ed3d94d243d03bc1bc8fb5236024a3 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 12:57:16 +0000 Subject: [PATCH 10/22] Syntax fix --- .github/workflows/main.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 75ac31936..e87a8d214 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,9 +3,8 @@ run-name: Compiling all files on: push: branches: - name: - - master - - master_clean + - master + - master_clean jobs: compiling: runs-on: ubuntu-latest From 689cd22560f9d5ca70e8f4fd8178819ea6adab3b Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 12:58:22 +0000 Subject: [PATCH 11/22] indent --- .github/workflows/main.yml | 42 +++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e87a8d214..994cdc32d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,25 +7,25 @@ on: - master_clean jobs: compiling: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v1 - - name: Setting Up + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Setting Up # Install textlive - run: | - sudo apt-get install texlive-latex-base - sudo apt-get install texlive-fonts-recommended - sudo apt-get install texlive-fonts-extra - sudo apt-get install texlive-latex-extra - sudo apt install texlive-lang-french - - name: Compiling - run: | - ls - make -f Makefile - - name: Storing - uses: actions/upload-artifact@v3 - with: - name: Archive - path: src/ \ No newline at end of file + run: | + sudo apt-get install texlive-latex-base + sudo apt-get install texlive-fonts-recommended + sudo apt-get install texlive-fonts-extra + sudo apt-get install texlive-latex-extra + sudo apt install texlive-lang-french + - name: Compiling + run: | + ls + make -f Makefile + - name: Storing + uses: actions/upload-artifact@v3 + with: + name: Archive + path: src/ \ No newline at end of file From 12bd864e88d9854f3ed9b35141f2ce596c35a75d Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 13:24:02 +0000 Subject: [PATCH 12/22] Workflow --- .github/workflows/gpt.sh | 16 ++++++++++++++++ .github/workflows/main.yml | 26 ++++++++++++++++++-------- .github/workflows/test.sh | 15 +++++++++++++++ 3 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/gpt.sh create mode 100644 .github/workflows/test.sh diff --git a/.github/workflows/gpt.sh b/.github/workflows/gpt.sh new file mode 100644 index 000000000..92ed8bf60 --- /dev/null +++ b/.github/workflows/gpt.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# List of arguments +arguments="doc1.pdf doc2.tex doc3.png" + +# Pattern to match +pattern=".tex" + +# Loop through each argument +for arg in $arguments; do + # Use grep to check if the argument matches the pattern + if echo "$arg" | grep -q "$pattern"; then + # Print the matched argument + echo "$arg" + fi +done diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 994cdc32d..ddfe0ef81 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,15 +15,25 @@ jobs: - name: Setting Up # Install textlive run: | - sudo apt-get install texlive-latex-base - sudo apt-get install texlive-fonts-recommended - sudo apt-get install texlive-fonts-extra - sudo apt-get install texlive-latex-extra + sudo apt-get install texlive-full sudo apt install texlive-lang-french - - name: Compiling - run: | - ls - make -f Makefile + - name: File Diff Check + shell: bash + id: check_file_changed + run: | + Diff=$(git diff --name-only HEAD^ HEAD) + Pattern=".tex" + # We can change the pattern easily + + echo $Diff + + for arg in "$Diff"; do + echo $arg + if echo "$arg" | grep -q "$Pattern"; then + echo "$arg" + pdflatex $arg + fi + done - name: Storing uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/test.sh b/.github/workflows/test.sh new file mode 100644 index 000000000..960bad06f --- /dev/null +++ b/.github/workflows/test.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +Diff=$(git diff --name-only HEAD^ HEAD) +Pattern=".tex" +# We can change the pattern easily + +echo $Diff + +for arg in "$Diff"; do + echo $arg + if echo "$arg" | grep -q "$Pattern"; then + echo "$arg" + pdflatex $arg + fi +done \ No newline at end of file From b6650c75ce3e14c6732f0587526cf6e3cff220e8 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 13:33:17 +0000 Subject: [PATCH 13/22] change test --- .github/workflows/main.yml | 12 +++++------- .../Juin/All/info-INFO1104-exam-2020-Juin-All.tex | 1 + 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ddfe0ef81..a30ae7e40 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,7 +15,10 @@ jobs: - name: Setting Up # Install textlive run: | - sudo apt-get install texlive-full + sudo apt-get install texlive-latex-base + sudo apt-get install texlive-fonts-recommended + sudo apt-get install texlive-fonts-extra + sudo apt-get install texlive-latex-extra sudo apt install texlive-lang-french - name: File Diff Check shell: bash @@ -33,9 +36,4 @@ jobs: echo "$arg" pdflatex $arg fi - done - - name: Storing - uses: actions/upload-artifact@v3 - with: - name: Archive - path: src/ \ No newline at end of file + done \ No newline at end of file diff --git a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex index 236a74310..f2532026b 100644 --- a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex +++ b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex @@ -28,6 +28,7 @@ \lstset{style=mystyle} \lstset{language=Oz} + \hypertitle{Concepts des langages de programmation}{4}{LINFO}{1104}{2020}{Juin}{All} {Norah Habets \and Thomas Debelle} {P. Van Roy} From c19009004855204550272bad79fa841edcd1d0d1 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 13:46:56 +0000 Subject: [PATCH 14/22] now changing dir --- .github/workflows/main.yml | 17 +++++++++++++++-- .github/workflows/test.sh | 34 ++++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a30ae7e40..adb132e0f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,7 +33,20 @@ jobs: for arg in "$Diff"; do echo $arg if echo "$arg" | grep -q "$Pattern"; then - echo "$arg" - pdflatex $arg + echo "___START COMPILE___" + + IFS="/" + read -ra parts <<< "$arg" + IFS=" " + + for part in "${parts[@]}"; do + if echo "$part" | grep -q "$pattern"; then + # Print the matched argument + pdflatex "$part" + fi + cd "$part" + done + + echo "___FINISH COMPILE___" fi done \ No newline at end of file diff --git a/.github/workflows/test.sh b/.github/workflows/test.sh index 960bad06f..7c6667ee9 100644 --- a/.github/workflows/test.sh +++ b/.github/workflows/test.sh @@ -1,15 +1,25 @@ #!/bin/bash -Diff=$(git diff --name-only HEAD^ HEAD) -Pattern=".tex" -# We can change the pattern easily - -echo $Diff - -for arg in "$Diff"; do - echo $arg - if echo "$arg" | grep -q "$Pattern"; then - echo "$arg" - pdflatex $arg - fi + +# Input string +input="path/to/location/file.tex" +pattern=".tex" + +# Set the IFS to "/" +IFS="/" + +# Read the input string into an array +read -ra parts <<< "$input" + +# Restore the default IFS +IFS=" " + +# Print the array elements +for part in "${parts[@]}"; do + if echo "$part" | grep -q "$pattern"; then + # Print the matched argument + pdflatex "$part" + fi + cd "$part" + ls done \ No newline at end of file From 706901380f1ad90af112d8d595e3b742433c4deb Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 14:40:34 +0000 Subject: [PATCH 15/22] Fix pipeline + test --- .github/workflows/main.yml | 14 ++++++++------ .../Juin/All/info-INFO1104-exam-2020-Juin-All.tex | 1 + 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index adb132e0f..bfb92aba7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,7 +30,7 @@ jobs: echo $Diff - for arg in "$Diff"; do + for arg in $Diff; do echo $arg if echo "$arg" | grep -q "$Pattern"; then echo "___START COMPILE___" @@ -40,11 +40,13 @@ jobs: IFS=" " for part in "${parts[@]}"; do - if echo "$part" | grep -q "$pattern"; then - # Print the matched argument - pdflatex "$part" - fi - cd "$part" + echo $part + if echo "$part" | grep -q "$Pattern"; then + # Print the matched argument + ls + pdflatex "$part" + fi + cd "$part" done echo "___FINISH COMPILE___" diff --git a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex index f2532026b..40bd5cbea 100644 --- a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex +++ b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex @@ -29,6 +29,7 @@ \lstset{language=Oz} + \hypertitle{Concepts des langages de programmation}{4}{LINFO}{1104}{2020}{Juin}{All} {Norah Habets \and Thomas Debelle} {P. Van Roy} From 76c35a530671529f6746c2f15cdf9d64643ee857 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 14:53:26 +0000 Subject: [PATCH 16/22] Fix bash script in yaml --- .github/workflows/main.yml | 21 ++++++++++++------- .github/workflows/test.sh | 19 ++++++++++++----- .../All/info-INFO1104-exam-2021-Juin-All.tex | 1 + 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bfb92aba7..7cf556e83 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,6 +32,7 @@ jobs: for arg in $Diff; do echo $arg + # If the file is a .tex if echo "$arg" | grep -q "$Pattern"; then echo "___START COMPILE___" @@ -39,14 +40,20 @@ jobs: read -ra parts <<< "$arg" IFS=" " + # Going to the right directory + Done=false + for part in "${parts[@]}"; do - echo $part - if echo "$part" | grep -q "$Pattern"; then - # Print the matched argument - ls - pdflatex "$part" - fi - cd "$part" + echo $part + if echo "$part" | grep -q "$Pattern"; then + # Compile the document + ls + pdflatex "$part" + Done=true + fi + if !(Done); then + cd "$part" + fi done echo "___FINISH COMPILE___" diff --git a/.github/workflows/test.sh b/.github/workflows/test.sh index 7c6667ee9..fd489be71 100644 --- a/.github/workflows/test.sh +++ b/.github/workflows/test.sh @@ -16,10 +16,19 @@ IFS=" " # Print the array elements for part in "${parts[@]}"; do - if echo "$part" | grep -q "$pattern"; then - # Print the matched argument - pdflatex "$part" - fi - cd "$part" ls +done + +test="1 2 3 4" +Done=false + +for arg in $test; do + echo $arg + if [ $arg == 3 ]; then + echo "Three" + Done=true + fi + if $Done; then + echo "Already found my three" + fi done \ No newline at end of file diff --git a/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex b/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex index d7863cc33..fb8fe06da 100644 --- a/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex +++ b/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex @@ -6,6 +6,7 @@ \definecolor{backcolour}{rgb}{1.0,1.0,1.0} \definecolor{codeblue}{rgb}{0,0,0.8} + \lstdefinestyle{mystyle}{ backgroundcolor=\color{backcolour}, commentstyle=\color{codegray}, From 06bf06ebe7cd5d7b5a9ea5afa1349c86fb150063 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 14:59:25 +0000 Subject: [PATCH 17/22] forgot a dollar sign --- .github/workflows/main.yml | 3 ++- .../exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7cf556e83..b6eca3755 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -51,7 +51,8 @@ jobs: pdflatex "$part" Done=true fi - if !(Done); then + + if !($Done); then cd "$part" fi done diff --git a/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex b/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex index fb8fe06da..9dd1bff8b 100644 --- a/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex +++ b/src/q4/info-INFO1104/exam/2021/Juin/All/info-INFO1104-exam-2021-Juin-All.tex @@ -7,6 +7,7 @@ \definecolor{codeblue}{rgb}{0,0,0.8} + \lstdefinestyle{mystyle}{ backgroundcolor=\color{backcolour}, commentstyle=\color{codegray}, From cea24092b854442368fb5e9685318caf977db3e8 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 15:14:34 +0000 Subject: [PATCH 18/22] clean console message --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b6eca3755..4b7ccdb8d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -34,7 +34,7 @@ jobs: echo $arg # If the file is a .tex if echo "$arg" | grep -q "$Pattern"; then - echo "___START COMPILE___" + echo -e "\e[32m___START COMPILE___\e[0m" IFS="/" read -ra parts <<< "$arg" @@ -57,6 +57,6 @@ jobs: fi done - echo "___FINISH COMPILE___" + echo -e "\e[32m___FINISH COMPILE___\e[0m" fi done \ No newline at end of file From 19bfa19fee7c57944b20a83fb04e1ad60b518017 Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:51:54 +0000 Subject: [PATCH 19/22] readme change --- README.md | 13 +++++++------ logo_ucl.pdf | Bin 72813 -> 17522 bytes .../info-INFO1104-exam-2022-Septembre-All.tex | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 19c96292e..79da3860a 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ # Synthèses de l'EPL -| **Documentation** | **PDF** | **Chat** | **Forum** | **Git** | -|:------------------:|:-------:|:--------:|:---------:|:-------:| -| [][doc-url] | [][pdf-url] | [![Join the chat at https://gitter.im/Gp2mv3/Syntheses](https://badges.gitter.im/Gp2mv3/Syntheses.svg)][chat-url] | [][forum-url] | [][git-url] +| **Documentation** | **PDF** | **Chat** |**Git** | **Build** | +|:------------------:|:-------:|:--------:|:-------:|:---------:| +| [][doc-url] | [][pdf-url] | [![Join the chat at https://gitter.im/Gp2mv3/Syntheses](https://badges.gitter.im/Gp2mv3/Syntheses.svg)][chat-url] | [][git-url] | [][build-url] | Les documents présents sur ce repository sont des documents mis à disposition pour les étudiants de l'EPL. -| | Current maintainers | -|:-------:|:------------------- | -| :star: | Pour le moment :bangbang: **aucun** :bangbang:, voir [Historique](#historique). | +| | Current maintainers | +| :-----: | :------------------------------------------------------------------------------------- | +| :star: | Pour le moment :bangbang: **aucun** :bangbang:, voir [Historique](#historique). | | :beers: | Ne manquez pas de remercier gracieusement ces étudiants qui tiennent ce projet à flot! | ## Visualisation des synthèses et correctifs @@ -86,3 +86,4 @@ Si cette license vous pose problème, venez en discuter en ouvrant une [issue](h [chat-url]: https://gitter.im/Gp2mv3/Syntheses?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge [forum-url]: http://forum-epl.be [git-url]: https://try.github.io +[build-url]: https://github.com/Tfloow/Syntheses/actions diff --git a/logo_ucl.pdf b/logo_ucl.pdf index f40fc3143282413875f064724054cd31dedeae39..d5d39544ba9ac906eb3cddd20b175cfdfa224325 100644 GIT binary patch literal 17522 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%0Aiz2kx^CbWh~wu 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 Date: Fri, 30 Jun 2023 20:44:06 +0200 Subject: [PATCH 20/22] added exam Juin 2023 LEPL1503 --- src/config.yml | 1 + src/q4/projet-EPL1503/exam/2023/2023.mk | 2 + .../exam/2023/Juin/All/Makefile | 2 + .../All/projet-EPL1503-exam-2023-Juin-All.tex | 412 ++++++++++++++++++ src/q4/projet-EPL1503/exam/2023/Juin/Juin.mk | 2 + src/q4/projet-EPL1503/exam/exam.mk | 3 + src/q4/projet-EPL1503/projet-EPL1503.mk | 4 + 7 files changed, 426 insertions(+) create mode 100644 src/q4/projet-EPL1503/exam/2023/2023.mk create mode 100644 src/q4/projet-EPL1503/exam/2023/Juin/All/Makefile create mode 100644 src/q4/projet-EPL1503/exam/2023/Juin/All/projet-EPL1503-exam-2023-Juin-All.tex create mode 100644 src/q4/projet-EPL1503/exam/2023/Juin/Juin.mk create mode 100644 src/q4/projet-EPL1503/exam/exam.mk create mode 100644 src/q4/projet-EPL1503/projet-EPL1503.mk diff --git a/src/config.yml b/src/config.yml index 547213cd5..b4925b25d 100644 --- a/src/config.yml +++ b/src/config.yml @@ -149,3 +149,4 @@ name: mads: Modelling and analysis of dynamical systems maths-discretes: Mathématiques discrètes et probabilité info: Concepts des langages de programmation + projet: Projet P3 diff --git a/src/q4/projet-EPL1503/exam/2023/2023.mk b/src/q4/projet-EPL1503/exam/2023/2023.mk new file mode 100644 index 000000000..3be9f03b6 --- /dev/null +++ b/src/q4/projet-EPL1503/exam/2023/2023.mk @@ -0,0 +1,2 @@ +YEAR=2023 +include ../../../exam.mk diff --git a/src/q4/projet-EPL1503/exam/2023/Juin/All/Makefile b/src/q4/projet-EPL1503/exam/2023/Juin/All/Makefile new file mode 100644 index 000000000..a519d4a83 --- /dev/null +++ b/src/q4/projet-EPL1503/exam/2023/Juin/All/Makefile @@ -0,0 +1,2 @@ +MINMAJ=All +include ../Juin.mk diff --git a/src/q4/projet-EPL1503/exam/2023/Juin/All/projet-EPL1503-exam-2023-Juin-All.tex b/src/q4/projet-EPL1503/exam/2023/Juin/All/projet-EPL1503-exam-2023-Juin-All.tex new file mode 100644 index 000000000..c264e0cb4 --- /dev/null +++ b/src/q4/projet-EPL1503/exam/2023/Juin/All/projet-EPL1503-exam-2023-Juin-All.tex @@ -0,0 +1,412 @@ +\documentclass[fr]{../../../../../../eplexam} +\usepackage{listings} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\footnotesize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} +\lstset{style=mystyle} +\lstset{language=C} + +\hypertitle{Projet P3}{4}{EPL}{1503}{2023}{Juin}{All} +{Thomas Debelle} +{Olivier Bonaventure \& Axel Legay} + +\section{Étudiants en échec} +L'EPL a développé un petit logiciel en C qui stocke les points de tous les étudiants dans un tableau contenant des structures record définies comme suit : +\begin{lstlisting}[escapechar=µ] +struct record { char *student; // nom de l'µ\textcolor{gray}{é}µtudiant (toujours diffµ\textcolor{gray}{é}µrent de NULL) + int n; // nombre de cours suivis (strictement positif) + int *points; // points obtenus pour chaque cours (les points sont toujours en 0 et 20) +}; +\end{lstlisting} +% µ\textcolor{gray}{é}µ + +Ecrivez le corps de la fonction \textbf{echecs} dont la spécification est la suivante : + +\begin{lstlisting}[escapechar=µ] +/* +* @pre n>0 correspond au nombre d'µ\textcolor{gray}{é}µtudiants dans la classe, *classe!=NULL +* @post retourne le nombre de cours en µ\textcolor{gray}{é}µchecs pour l'ensemble des µ\textcolor{gray}{é}µtudiants de la classe +*/ +int echecs(int n, struct record *classe) { +\end{lstlisting} +A titre d'exemple, considérons la classe contenant trois étudiants : - Marie qui a suivi 3 cours et obtenu 18, 10 et 11 - Jean qui a suivi 5 cours et obtenu 9, 7, 13, 20 et 10 - Luc qui a suivi 4 cours et obtenu 10, 11, 6 et 0\\ + +Lorsque l'on applique la fonction échecs à un tableau contenant les 3 records de ces étudiants, elle retourne la valeur 4. + +\begin{solution} +\begin{lstlisting}[escapechar=µ] +if(classe == NULL){ + return 0; +} + +int count = 0; +for(int i = 0; i < n; i++){ + for(int j = 0; j < classe[i].n; j++){ + if(classe[i].points[j] < 10){ + count++; + } + } +} + +return count; +\end{lstlisting} +\end{solution} + +\section{Nombre de caractères différents} +Un chaîne de caractères contient différents caractères. Vous devez écrire le corps de la fonction ndiff qui retourne le nombre de caractères différents dans la chaîne passée en argument.\\ + +Complétez le corps de la fonction ndiff sur base de la spécification ci-dessous: + +\begin{lstlisting}[escapechar=µ] +#include +#include +#include + +/* + * @pre - + * @post retourne le nombre de caractµ\textcolor{gray}{è}µres diffµ\textcolor{gray}{é}µrents dans la chaµ\textcolor{gray}{î}µne pointµ\textcolor{gray}{é}µe par str + * Exemples: + * - ndiff("ABA") retourne 2 + * - ndiff("") retourne 0 + * - ndiff(NULL) retourne 0 + * - ndiff("AabBAb") retourne 4 + */ +int ndiff(char *str) { +\end{lstlisting} + +\begin{solution} +\begin{lstlisting}[escapechar=µ] +if(str == NULL){ + return 0; +} +if(strlen(str) == 0){ + return 0; +} + +char* found = (char*) malloc(sizeof(char)*(strlen(str) + 1)); // create a string with all the different character of str +int size = 0; int flag = 0; // the size of the found array and a flag to check if we found something + +for(int i = 0; i < strlen(str); i++){ + if(size == 0){ + found[size] = str[i]; + size++; + }else{ + flag = 1; + for(int j = 0; j < size; j++){ + if(found[j] == str[i]){ + flag = 0; + break; + } + } + if(flag){ + found[size] = str[i]; + size++; + } + } +} + +return size; +\end{lstlisting} +\end{solution} + +\section{Liste doublement chaînée} + +Une liste doublement chaînée est implémentée comme suit. Cette structure de données permet d'enregistrer un ensemble d'éléments, en liant pour chacun une clé à une valeur. On va faire l'hypothèse dans cette question qu'il n'y a qu'un seul exemplaire de chaque clé dans la liste. + +\begin{lstlisting}[escapechar=µ] +typedef struct node { + int key; + double value; + struct node* next; + struct node* prev; +} node_t; + +typedef struct list { + node_t* head; + node_t* tail; +} list_t; + +list_t* create_list() { + list_t* list = (list_t*) malloc(sizeof(list_t)); + if (list == NULL) { + return NULL; + } + + list->head = NULL; + list->tail = NULL + + return list; +} + +int insert(list_t* list, int key, double value) { + node_t* node = (node_t*) malloc(sizeof(node_t)); + if (node == NULL) { + return -1; + } + + node->key = key; + node->value = value; + node->next = NULL; + + if (list->tail == NULL) { + list->head = node; + node->prev = NULL; + } else { + list->tail->next = node; + node->prev = list->tail; + } + + list->tail = node + return 0; +} + +void free_list(list_t* list) { + node_t* current = list->tail; + + if (current == NULL) { + free(list); + return; + } + + while (current->prev != NULL) { + current = current->prev; + free(current->next); + } + + free(current); + free(list); +} +\end{lstlisting} +Vous devez implémenter la fonction delete dont les spécifications vous sont fournies.\\ +Insérez ici le corps de la fonction delete dont les spécifications vous sont données ci-dessous : + +\begin{solution} +\begin{lstlisting}[escapechar=µ] +if(list == NULL){ + return 0; +} + +if(list->tail == NULL && list->head == NULL){ + return 0; +} + +node_t* current = list->head; node_t* prev = current; + +// Check if the list is made of 1 element +if(current->next == NULL){ + if(current->key == key){ + free_list(list); // Free the whole list + return key; + }else{ + return 0; + } +} + +while(current != NULL){ + if(current->key == key){ + if(current->prev == NULL){ // If we remove the head of the list + printf("We are removing a head\n"); + list->head = current->next; + current->next->prev = NULL; + free(current); // Because we used malloc to create a node + return key; + } + if(current->next == NULL){ // If we remove the tail of the list + list->tail = current->prev; + current->prev->next = NULL; + free(current); + return key; + } + + prev->next = current->next; + current->next->prev = prev; + + free(current); + + return key; + } + + prev = current; + current = current->next; +} + +return 0; +\end{lstlisting} +\end{solution} + +\section{Copie de fichier} +Ecrivez une fonction permettant de copier un fichier quelconque. Votre fonction ne peut bien entendu pas modifier le fichier source.\\ + +Vous pouvez uniquement utiliser les fonctions open(2), mmap(2), munmap(2), msync(2), ftruncate(3), fstat(2), memcpy(3) and close(2). Vous ne pouvez appeler memcpy(3) qu'une seule fois.\\ + +Astuce : msync(2) est une fonction qui vous permet de garantir que les modifications faites en mémoire (notamment celles à une adresse pointée par mmap) seront aussi sauvées sur disque. Lisez la documentation pour voir comment l'utiliser correctement.\\ + +Astuce : La fonction ftruncate(3) est une fonction que l'on utilise assez rarement, mais elle est nécessaire pour cette question. + +\begin{lstlisting}[escapechar=µ] +/* + * @pre file_name != NULL, nom du fichier source + * new_file_name != NULL, nom du fichier destination (la copie) + * + * @post copie le contenu de {file_name} vers {new_file_name}. + * return 0 si la fonction se termine avec succµ\textcolor{gray}{è}µs, -1 en cas d'erreur. + */ +int copy(char *file_name, char *new_file_name) { +\end{lstlisting} + +\begin{solution} +J'ai eu 90.91\% mais une version un peu différente existe dans le syllabus de théorie à la partie gestion des utilisateurs et des systèmes de fichiers. Mon erreur serait une erreur avec les fichiers vide. +\begin{lstlisting}[escapechar=µ] +if(file_name == NULL || new_file_name == NULL){ + return -1; +} + +int fdOld = open(file_name, O_RDONLY); +if(fdOld == -1){ + return -1; +} + +struct stat* buffStatOld = (struct stat*) malloc(sizeof(struct stat)); +if(buffStatOld == NULL){ + close(fdOld); + return -1; +} + +if(fstat(fdOld, buffStatOld)){ + free(buffStatOld); close(fdOld); + return -1; +} + +if(buffStatOld->st_size == 0){ // If the file is empty + return 0; +} + +int fdNew = open(new_file_name, buffStatOld->st_mode | O_CREAT | O_RDWR); +// we have all the permission from the other files + we can create a new file if needed and we can write +if(fdNew == -1){ + free(buffStatOld); close(fdOld); + return -1; +} + +void* oldMap = mmap(NULL, buffStatOld->st_size, PROT_READ, MAP_SHARED, fdOld, 0); +if(oldMap == MAP_FAILED){ + free(buffStatOld); close(fdOld); close(fdNew); + return -1; +} + +if(ftruncate(fdNew, buffStatOld->st_size)){ + free(buffStatOld); close(fdOld); close(fdNew); + return -1; +} + +void* newMap = mmap(NULL, buffStatOld->st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fdNew, 0); +if(newMap == MAP_FAILED){ + free(buffStatOld); close(fdOld); close(fdNew); + munmap(oldMap, buffStatOld->st_size); + return -1; +} + +// The actual interesting code +if(memcpy(newMap, oldMap, buffStatOld->st_size) == NULL){ // We copy the file in memory from the old to the new and check if it fails + free(buffStatOld); close(fdOld); close(fdNew); + munmap(oldMap, buffStatOld->st_size); munmap(newMap, buffStatOld->st_size); + return -1; +} + +if(msync(newMap, buffStatOld->st_size, MS_SYNC)){ // MS_SYNC can slow down the program but it's a small trade off and we check if the syncing fails + free(buffStatOld); close(fdOld); close(fdNew); + munmap(oldMap, buffStatOld->st_size); munmap(newMap, buffStatOld->st_size); + return -1; +} +// The end of it TT + +if(munmap(oldMap, buffStatOld->st_size)){ + free(buffStatOld); close(fdOld); close(fdNew); + munmap(newMap, buffStatOld->st_size); + return -1; +} + + +if(munmap(newMap, buffStatOld->st_size)){ + free(buffStatOld); close(fdOld); close(fdNew); + return -1; +} + +if(close(fdNew)){ + free(buffStatOld); close(fdOld); + return -1; +} + +if(close(fdOld)){ + free(buffStatOld); + return -1; +} + +free(buffStatOld); +return 0; +\end{lstlisting} +\end{solution} + +\section{Comparaison de fonctions} +Parfois il est intéressant de comparer le résultat de fonctions sans nécessairement savoir quel est le code de ces fonctions. Dans cet exercice, vous devez écrire une fonction compare qui reçoit comme arguments un intervalle fermé et deux pointeurs vers des fonctions qui retournent chacune un entier.\\ + +Pour illustrer cette fonction compare, considérons les fonctions identite et abs: + +\begin{lstlisting}[escapechar=µ] +int identite(int x) { return x; } +int abs(int x) { + if (x>=0) + return x; + else + return -x; +} +\end{lstlisting} + +Dans l'intervalle $[0,2]$ $(min=0, max=2)$, compare retourne la valeur 3 lorsque elle est appliquée aux fonctions identité et abs. Dans l'intervalle $[-1,1]$ $(min=-1, max=1)$, elle retourne $2$ lorsqu'elle est appliquée aux mêmes fonctions.\\ + +Proposez le corps de la fonction compare dont la spécification est reprise ci-dessous: +\begin{lstlisting}[escapechar=µ] +/* + * @pre min Date: Sat, 1 Jul 2023 11:00:47 +0200 Subject: [PATCH 21/22] Fix of the workflow and removed useless files --- .github/workflows/gpt.sh | 16 --------- .github/workflows/main.yml | 5 ++- .github/workflows/test.sh | 34 ------------------- .../All/info-INFO1104-exam-2020-Juin-All.tex | 2 -- .../info-INFO1104-exam-2020-Septembre-All.tex | 2 -- 5 files changed, 4 insertions(+), 55 deletions(-) delete mode 100644 .github/workflows/gpt.sh delete mode 100644 .github/workflows/test.sh diff --git a/.github/workflows/gpt.sh b/.github/workflows/gpt.sh deleted file mode 100644 index 92ed8bf60..000000000 --- a/.github/workflows/gpt.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# List of arguments -arguments="doc1.pdf doc2.tex doc3.png" - -# Pattern to match -pattern=".tex" - -# Loop through each argument -for arg in $arguments; do - # Use grep to check if the argument matches the pattern - if echo "$arg" | grep -q "$pattern"; then - # Print the matched argument - echo "$arg" - fi -done diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4b7ccdb8d..4f9fc8f58 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -43,8 +43,8 @@ jobs: # Going to the right directory Done=false + Back="" for part in "${parts[@]}"; do - echo $part if echo "$part" | grep -q "$Pattern"; then # Compile the document ls @@ -53,10 +53,13 @@ jobs: fi if !($Done); then + ls cd "$part" + Back=$Back"../" fi done + cd $Back echo -e "\e[32m___FINISH COMPILE___\e[0m" fi done \ No newline at end of file diff --git a/.github/workflows/test.sh b/.github/workflows/test.sh deleted file mode 100644 index fd489be71..000000000 --- a/.github/workflows/test.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - - -# Input string -input="path/to/location/file.tex" -pattern=".tex" - -# Set the IFS to "/" -IFS="/" - -# Read the input string into an array -read -ra parts <<< "$input" - -# Restore the default IFS -IFS=" " - -# Print the array elements -for part in "${parts[@]}"; do - ls -done - -test="1 2 3 4" -Done=false - -for arg in $test; do - echo $arg - if [ $arg == 3 ]; then - echo "Three" - Done=true - fi - if $Done; then - echo "Already found my three" - fi -done \ No newline at end of file diff --git a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex index 40bd5cbea..236a74310 100644 --- a/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex +++ b/src/q4/info-INFO1104/exam/2020/Juin/All/info-INFO1104-exam-2020-Juin-All.tex @@ -28,8 +28,6 @@ \lstset{style=mystyle} \lstset{language=Oz} - - \hypertitle{Concepts des langages de programmation}{4}{LINFO}{1104}{2020}{Juin}{All} {Norah Habets \and Thomas Debelle} {P. Van Roy} diff --git a/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex b/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex index 03819478e..4b047a8d3 100644 --- a/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex +++ b/src/q4/info-INFO1104/exam/2020/Septembre/All/info-INFO1104-exam-2020-Septembre-All.tex @@ -28,8 +28,6 @@ \lstset{style=mystyle} \lstset{language=Oz} - - \hypertitle{Concepts des langages de programmation}{4}{INFO}{1104}{2020}{Septembre}{All} {Norah Habets \and Thomas Debelle} {P. Van Roy} From 9a624ff935d49d395fee6b656842280213149e2f Mon Sep 17 00:00:00 2001 From: Tfloow <88899420+Tfloow@users.noreply.github.com> Date: Sat, 1 Jul 2023 11:11:57 +0200 Subject: [PATCH 22/22] added discord link in readme --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 79da3860a..2afa40b61 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Synthèses de l'EPL -| **Documentation** | **PDF** | **Chat** |**Git** | **Build** | -|:------------------:|:-------:|:--------:|:-------:|:---------:| -| [][doc-url] | [][pdf-url] | [![Join the chat at https://gitter.im/Gp2mv3/Syntheses](https://badges.gitter.im/Gp2mv3/Syntheses.svg)][chat-url] | [][git-url] | [][build-url] | +| **Documentation** | **PDF** | **Chat** |**Git** | **Build** | **Discord**| +|:------------------:|:-------:|:--------:|:------:|:---------:|:----------:| +| [][doc-url] | [][pdf-url] | [![Join the chat at https://gitter.im/Gp2mv3/Syntheses](https://badges.gitter.im/Gp2mv3/Syntheses.svg)][chat-url] | [][git-url] | [][build-url] | [][discord-url] Les documents présents sur ce repository sont des documents mis à disposition pour les étudiants de l'EPL. @@ -87,3 +87,4 @@ Si cette license vous pose problème, venez en discuter en ouvrant une [issue](h [forum-url]: http://forum-epl.be [git-url]: https://try.github.io [build-url]: https://github.com/Tfloow/Syntheses/actions +[discord-url]: https://discord.gg/WUuu38vtET