From 94305a9e3165557301f39e8dcfc9760fc844d435 Mon Sep 17 00:00:00 2001 From: Florent Madelaine Date: Mon, 26 Sep 2022 10:56:47 +0200 Subject: [PATCH] cours 1 et 2 complets --- 1ComputationAndData.md | 18 ++ 2ComputationAndData.md | 362 ++++++++++++++++++++++++++++++++++ 3ComputationAndData.md | 127 ++++++++++++ 4ComputationAndData.md | 134 +++++++++++++ images/HelloWorldAutomate.jpg | Bin 0 -> 50169 bytes 5 files changed, 641 insertions(+) create mode 100644 1ComputationAndData.md create mode 100644 2ComputationAndData.md create mode 100644 3ComputationAndData.md create mode 100644 4ComputationAndData.md create mode 100644 images/HelloWorldAutomate.jpg diff --git a/1ComputationAndData.md b/1ComputationAndData.md new file mode 100644 index 0000000..9684e15 --- /dev/null +++ b/1ComputationAndData.md @@ -0,0 +1,18 @@ +Cours de Pierre. + +# Système de fichier, Codage et découverte du terminal. I/II + +## Terminal à la linux + +Installation Ubuntu sous windows (WSL, ubuntu via couche machine virtuelle hyperV). +https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux + +Autres étudiants avec Mac et un shell ("BSD"?) + +## Arborescence fichier +répertoire (noeuds internes) vs +Fichier (feuilles) + +## Codage +Codage, en particulier binaire et ASCII. +Exemple avec les salles de la fac de droit en binaire. diff --git a/2ComputationAndData.md b/2ComputationAndData.md new file mode 100644 index 0000000..8418ae6 --- /dev/null +++ b/2ComputationAndData.md @@ -0,0 +1,362 @@ +Cours de Florent. + +# Système de fichier, Codage et découverte du terminal II/II + +## Éditeur et fichier texte + +Qu'on programme ou qu'on prépare un mail, il faut éditer un fichier texte. +Ce texte va transiter sur le réseau ou être stocké dans un fichier selon un code bien choisi. + +Le code ASCII est inspiré de code pour le télégraphe, comme le code Baudot (1870) : c'est un standard américain initialement pour teleprinter (Bell lab 1961). Il comporte en plus des codes pour des caractères imprimables (chiffres, lettres minuscules et majuscules latines, etc) de nombreux codes pour des opérations spécifiques au mécanisme de communication d'un teleprinter maintenant obsolètes. + +[Code Baudot](https://en.wikipedia.org/wiki/Baudot_code) +[ASCII](https://en.wikipedia.org/wiki/ASCII) + +### digression +L'ordre des charactères induit par la valeur de leur code ASCII est utilisé pour trier du texte ASCII. +> ASCII-code order is also called ASCIIbetical order + +Trier, stocker, indexer et chercher de l'information sont des tâches essentielles qu'on automatise dès la fin du XIXe siècle. + +Pour automatiser le recensement américain (le census de 1880 a demandé 8 ans...), Herman Hollerith met au point une machine electro-mécanique manipulant des cartes perforées et flottant dans des bains de mercure. Son entreprise et 4 autres forment un conglomérat qui deviendra IBM en 1924. + +[Machines à tabuler](https://en.wikipedia.org/wiki/Tabulating_machine) + +### Et si notre alphabet est plus grand? +Pour tester un clavier, ou exhiber une fonte, on peut en anglais écrire. +> The quick brown fox jumps over the lazy dog + +En français, on pourra utiliser +> Dès Noël, où un zéphyr haï me vêt de glaçons würmiens, je dîne d’exquis rôtis de bœuf au kir, à l’aÿ d’âge mûr, &cætera. + +[tester un clavier](https://fr.wikipedia.org/wiki/The_quick_brown_fox_jumps_over_the_lazy_dog) + +De nombreux pays vont donc étendre/changer le code ASCII pour y introduire leurs symboles (par exemple les accents en français) avec un soucis d'internationalisation. +En effet, le code ascii ne peut pas facilement accommoder tous les alphabets même si on se restreint aux alphabets latins ou grecs car nous avons seulement 7 bits soit 2^7=128 codes. +On ajoute donc un bit de plus pour permettre d'échanger des données textuelles "internationales". + +[ISO/IEC 8859](https://en.wikipedia.org/wiki/ISO/IEC_8859) + +Il y a en fait 15 variantes selon les besoins de langues avec des besoins proches. +Un des plus connu, adapté pour le français, est la version 1 + +[latin-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1) + +Ces systèmes restent trop limités car ni vraiment adapté pour de la typographie, ni applicable pour tous les alphabets en usage. +Depuis 2008, le standard est l'UTF-8 (sur le web initialement). +C'est une abbréviation de + +> Unicode Transformation Format – 8-bit + +où Unicode signifie + +> Universal Coded Character Set + +Une idée intéressante de ce code est qu'on va utiliser un **nombre variable de bytes** (entre 1 et 4). +Typiquement ce qu'on codait en ASCII prendra 1 byte, toutes les langues couvertes par la norme ISO 8859 pourront coder leurs caractères avec au plus 2 bytes, les caractères fréquents de CJK avec 3 bytes et le reste avec 4 permet de coder des symboles moins fréquents (de math, des emoji etc). + +[UTF-8](https://en.wikipedia.org/wiki/UTF-8) + +## Discussion au tableau de UTF-8 +Calcul du nombre de symboles qu'on peut coder. +Perte de place pour les symboles codés par 1 bloc, 2 blocs, 3 blocs, 4 blocs. + +évocation du changement de pratique autres systèmes de codage vs UTF-8 (graphiques sur wikipedia). + +### Détails techniques de WSL + +Le système de fichier linux WSL est monté dans le système windows. +On peut a priori transférer des fichiers vers windows mais pas l'inverse. + +Linux ne permet a priori pas d'accéder au système de fichier windows. + +Attention. si vous réinstallez WSL vous allez écraser votre home et tout le travail fait sous linux. + +[Où est le home linux sous WSL](https://superuser.com/questions/1185033/what-is-the-home-directory-on-windows-subsystem-for-linux) + +Vous pouvez lancer dans l'explorateur de fichier windows le home linux en saisissant dans votre terminal linux la commande suivante. + +```bash +explorer.exe . +``` + +Si vous avez installé WSL sans créer de compte utilisateur, vous êtes l'administrateur système linux, connu sous le nom de root. L'invite du terminal indique un dièse \# + +Pas de danger vous ne pouvez rien casser dans le système windows. + +Par contre par défaut vous êtes dans ... system32 le répertoire système de windows. +Le système winos ne vous laisse pas écrire de fichier à cet endroit. +Il faut vous placer ailleur, par exemple en saisissant la commande suivante. + + +```bash +cd +``` + + +### explication au tableau de la navigation + + _ .. pour revenir en arrière + _ . pour là où on est + _ ~ pour votre home linux + _ / pour la racine du système de fichier linux. + +Question ontologique de l'oeuf ou la poule: qui est le .. de / ? + + + +### exercice + +1. Ouvrez un terminal. +1. Créer un répertoire folderA (commande mkdir). +1. Placez vous dans ce répertoire (commande cd, pour change directory). +1. Créer un fichier vide grapevine.txt (commande touch). +1. Ouvrez le avec un éditeur de texte (par exemple gedit ou emacs voir nano ou vim). +1. Copiez dans ce fichier un texte de votre choix avec de nombreux caractères qui ne sont pas codable en ascii. +1. Sauvez le. +1. Envoyez un mail avec en pièce jointe ce fichier à votre voisine ou voisin de table. +1. Ouvrez le fichier de votre voisin, sauvez le sous le nom grapevine2.txt et testez si vous pouvez lire le fichier correctement avec votre éditeur. + +Parfois votre éditeur ne détectera pas correctement et automatiquement le codage. +Vous pouvez dans certains cas forcer ce codage (e.g. dans emacs Options-Multilingual environment). + +### exercice +la commande suivante permet de revenir dans le répertoire parent. +```bash +cd .. +``` + +Complétez votre arborescence pour arriver à celle-ci. +``` +folderA + grapevine.txt + grapevine2.txt + folderAA + toto.txt + titi.txt +folderB + toto.txt +folderC + tata.txt +``` + +NB. vous pouvez le faire sans utiliser un éditeur ni un logiciel de naviguation de fichier graphique. Seulement en ligne de commande. + +La commande + +```bash +man +``` +permet d'avoir accès au manuel. + +testez par exemple + +```bash +man ls +``` +lisez cette documentation pour chercher l'option qui permet un affichage récursif. + + +**Correction Indicative** + +```bash +mkdir folderA +mkdir folderB +mkdir folderC +cd folderA/ +touch grapevine.txt +mkdir folderAA +cd folderAA/ +touch toto.txt +touch titi.txt +cd ../ +cd .. +cd folderB +touch toto.txt +cd .. +cd folderC/ +touch tata.txt +cd .. +ls -R +history | cut -c 8- +``` + +NB. la dernière commande permet d'enlever les numéros de l'historique. + Le | (on dit pipe) permet d'envoyer le résultat de history dans la commande cut. + La commande cut avec ces options permet d'enlever le numéro de l'historique. + C'est d'ailleurs avec cette commande que j'ai fabriqué la correction indicative ci-dessus. + +### exercice + +Dans un second temps vous pouvez créer un lien / ou créer un raccourci avec votre système de naviguation de fichier graphique (probablement nautilus sous ubuntu) de grapevine.txt dans le répertoire folderC. + +Vous pouvez aussi vous placer vous dans folderC et écrire en ligne de commande +```bash +ln -s ../folderA/grapevine.txt +``` + +Selon votre configuration en revenant en arrière et en faisant à nouveau un ls avec l'option permettant l'affichage récursif vous allez voir le nom du grapevin.txt sous une couleur différente de l'original. + +Nous allons d'abord chercher dans le manuel ce que fait l'option -l de ls +```bash +man ls +``` +puis nous allons tester sur notre lien en faisant +```bash +ls -l +``` + +Je n'ai pas traité en cours les parties ci-dessous. +Vous pouvez ouvrir chaque section en cliquant sur le triangle. + +
Zoom sur les briques élémentaires du système de fichier +

+ + + +### exercice + +L'arbre de notre système de fichier est fabriqué à partir de 2 éléments. + 1. une feuille de l'arbre = des données stockées à une certaine adresse dans la mémoire + 2. un noeud interne de l'arbre = des données stockées à une certaine adresse dans la mémoire qui associe un nom (de fichier ou de répertoire) à un élément de type 1. ou 2. identifiable par le système. En gros le fichier correspondant à un répertoire est une sorte de *livret de famille*. + +En pratique, le système utilise une structure de donnée particulière à la fois pour les fichiers et les répertoires (puisqu'il s'agit dans les deux cas de fichiers) qui s'appelle un [inode](https://en.wikipedia.org/wiki/Inode). + + +En pratique vous pouvez utiliser l'option suivante pour affichier les numéros des inode. +```bash +ls -i +``` + +### exercice pour aller encore plus loin +Nous avons évoqué les liens symboliques qui sont des raccourcis. +Littéralement c'est juste un fichier texte un peu spécial qui contient comme données la chaîne de caractère du fichier vers lequel on pointe. + +Donc quand on a fait ci-dessus. +```bash +ln -s ../folderA/grapevine.txt +``` +On a fabriqué un fichier raccourci spécial qui contient essentiellement l'information +```bash +../folderA/grapevine.txt +``` +Si vous utilisez la même commande mais en omettant l'option -s vous êtes en train de définir un nouveau nom pour l'inode du fichier grapevine.txt + +Donc la métaphore de l'arbre n'est pas tout à fait correcte puisque par plusieurs chemins dans les répertoires il est possible d'atteindre le même fichier. + +La commande de suppression de fichier rm (pour remove) ne supprime pas vraiment l'inode, elle va juste effacer le nom du fichier (et la référence vers l'inode associé à ce nom) dans le répertoire. + +[Détails sur stackoverflow](https://stackoverflow.com/questions/185899/what-is-the-difference-between-a-symbolic-link-and-a-hard-link) + +NB. Je n'ai pas testé sous WSL puisque je n'ai pas windows. Il serait amusant de regarder ce qui arrive aux fichiers linux avec plusieurs noms quand on les regarde en vue détaillée dans l'explorateur de fichier de windows. A priori NTFS a une notion compatible + +

+
+ + +### Commandes utilisées jusqu'à présent +```bash +mkdir +cd +touch +ls +ln +``` + +
Manipuler du texte avec la commande tr +

+ +## Manipulation de fichier + +Pour simplifier un texte, par exemple pour l'indexer ou pour normaliser un nom dans une base de données il est fréquent qu'on bascule un mot en majuscule. +Nous allons travailler avec la commande tr qui permet de faire de tel changement caractère par caractère. +Par exemple ceci permet de transformer les minuscules en majuscule. + +```bash +tr '[a-z]' '[A-Z]' +``` +La commande tr attend un flux textuel en entrée et transmet un flux textuel en sortie. +On parle de filtre pour ce genre de commande. +On ne peut pas a priori lui passer de fichier en paramètre. +Il faut *rediriger* le contenu du fichier vers la commande. + +```bash +tr '[a-z]' '[A-Z]' < grapevine.txt +``` +Par défaut le résultat apparaît à l'écran. + +On peut rediriger ce résultat dans un fichier en utilisant > + +```bash +tr '[a-z]' '[A-Z]' < grapevine.txt > grapevineUp.txt +``` +Vous pouvez consulter le contenu d'un fichier directement en utilisant la commande more +```bash +more grapevineUp.txt +``` +Attention toutefois avec > car le contenu du fichier si il existe est écrasé. + +Il existe une variante utile >> qui écrit à la fin du fichier. +C'est utilisé par exemple pour créer des fichiers de log. + +### exercice + +Redirigez le résultat de la commande history dans un fichier de sauveguarde myFirstDayWithTheCommandLine.txt. + + +```bash +history > myFirstDayWithTheCommandLine.txt +``` +Vous pouvez consulter ce fichier en utilisant more. + +Vous pouvez voir le haut du fichier en faisant head, la fin du fichier en faisant tail. + +## Code de césar + +Cherchez à appliquer le code de césar (rot13) à un fichier contenant du texte non accentué (i.e. ascii historique). + +Envoyez le par mail à votre voisin. + +Ce dernier doit le décoder. + +```bash +tr '[A-Z]' '[N-ZA-M]' +``` +

+
+ + +## droit d'accès + +chmod + +Il s'agit de la commande permettant de changer les droits pour un fichier. + + +## Bonus : jouons avec le pipe + +1. installer fortune +1. installer cowsay + +```bash +echo moooooo | cowsay +``` + + +```bash +fortune +``` + + +```bash +fortune | cowsay +``` + +## Bonus : sl + +1. installer sl (dans le terminal de votre collègue quand il va boire un café) +1. demandez lui de vous montrer comment ls fonctionne très rapidement (il va probalement écrire sl au lieu de ls à un moment) + + + + diff --git a/3ComputationAndData.md b/3ComputationAndData.md new file mode 100644 index 0000000..e221989 --- /dev/null +++ b/3ComputationAndData.md @@ -0,0 +1,127 @@ +Cours de Florent. + +# Calculer en théorie et en pratique I/III + +Dans la prochaine séquence de cours, nous allons tenter de répondre à la question suivante. + +C'est quoi un ordinateur? + +Cette question s'apparente à celle que ce sont posés philosophes et mathématiciens de Leibnitz à Turing en passant par Hilbert. + +Qu'est-ce qu'une question à laquelle on peut répondre de manière mécanique par un calcul? + +Nous allons explorer rapidement ce sujet en évoquant à la fois des modèles théoriques et des explication sur l'architecture matérielle et le fonctionnement d'ordinateurs modernes. + +## Calcul Matériel. + +Initialement, les "computer" sont des humains, qui s'aident de divers mécanisme pour faire des calculs rapidement en essayant de faire le moins d'erreurs possibles, par exemple avec un boulier ou des cordes nouées. + +Les premières machines à calculer sont mécaniques et peuvent être discrètes (nombre fini de position avec par exemple des roues crantées) ou continues (position continue sur un astrolabe ou une table à tracer pour calculer des intégrales). + +Les machines modernes possèdent différents composants electroniques et ce sont les transistors qui permettent de passer d'une information analogique/continue + +> quelle est la puissance du courant? + +à une information discrète, oui ou non, qu'on peut interpréter comme 0 ou 1. + +> est-ce-que le courant dépasse un certain seuil? + +On peut à l'aide de quelques composants de base faire des calculs sur ces valeurs 0 ou 1. On parle alors de calcul Booléen (du nom du logicien Boole). + +### circuit booléen +consiste en +1. des entrées contenant des valeurs booléennes. +1. des portes logiques permettant de calculer + * le ET binaire (&) + * le OU binaire (v) + * la négation NON unaire (-) +1. des "cables" pour relier ces portes +1. des sorties correspondant à la sortie du calcul. + +Au tableau +* table du ET +* table du OU +* table du NON + +### exercices + +1. Écrire la table de Non de x ou y. +1. Décrire un circuit permettant de tester si deux entrée x et y sont égales. +Le circuit doit renvoyer 1 si c'est le cas et 0 sinon. +NB. on peut noter cette opération <-> ou +2. Même question pour le circuit qui permet de calculer le XOR (Ou eXclusif). +3. Même question pour le circuit permettant de calculer la majorité de trois arguments + +### Digression : le schéma de chiffrement de Vernam +Il s'agit d'un schéma très simple et incassable à moins de connaître la clé secrète. +L'inconvénient est qu'il faut fabriquer et partager avec son destinataire une clé secrète aussi longue que le message. On parle aussi de "one time pad" en anglais. + +Pendant la seconde guerre mondiale, à Bletchley Park, des opératrices fabriquaient de telles clés mais en quantité trop réduite. Une tentative de mécanisation pour pallier à ce soucis a permis de générer des clés rapidement mais qui avaient une différence avec les véritables clés. + + +> + + "Enoch, why are you . . . here?" + + "Oh. I am here, in a larger sense, because Mrs. Tenney, the vicar’s wife, has become sloppy, and forgotten to close her eyes when she takes the balls out of the bingo machine." + +Neal Stephenson. Cryptonomicon. + +[Discussion sur stackexchange](https://crypto.stackexchange.com/questions/25214/has-human-generated-entropy-ever-been-a-real-problem) + + +Nous allons mettre en oeuvre ce chiffrement. +1. Tout d'abord le message à chiffrer M, qu'on suppose encodable en ASCII est transformé en un séquence de 0 et de 1 qu'on note B. +1. La clé secrète S est une série de 0 et de 1 de même longueur. +1. On additionne "modulo 2" B à S pour obtenir le message chiffré C (c'est le XOR de tout à l'heure). +1. On transmet le message chiffré C au destinataire. +1. La destinataire reçoit C. +1. Pour décoder, elle procède de même mais à l'envers. + * ajout de S à C + * découpage en bloc de 7 bits + * décodage ASCII + +[page du code ASCII](https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange) + +NB. pour faire plus proche de la réalité, on préfixe le code ASCII d'un 0 pour obtenir un octet. + +### exercice +Nous allons mettre en oeuvre ce chiffrement pour le mot BINGO. +Fabriquez au préalable une clé de la taille adapté +(vous pouvez par exemple tirer à pile ou face successivement). + +Pour simplifier, vous pouvez le faire avec OK. + +Réfléchissez à une mise en oeuvre pratique sur papier. + +## Retour à nos circuits. + +Nous allons maintenant mettre en oeuvre des circuits pour faire des opérations arithmétiques. + + +1. Même question pour un circuit qui réalise une somme "modulo 2" + NB. c'est le chiffrement de Vernam. +1. Même question pour un circuit qui réalise une somme en binaire. + Pour ce second circuit on s'autorise une porte de duplication notée D qui prend en entrée x et a deux sorties valant toutes deux x. + +### Indication. +Pour rappel en binaire 1+1 vaut 10; 1+0 comme 0+1 valent 1; et, 0+0 vaut 0. + +**Exemple** +``` +0110 +0111 +==== +...1 +..01 retenue 1 +.101 retenue 1 +1101 Fin +``` +### Indication 2 +2 questions rhétoriques : + + * Comment faire la retenue? + * Comment calcule la somme dans la même colonne? + + + diff --git a/4ComputationAndData.md b/4ComputationAndData.md new file mode 100644 index 0000000..77f00b1 --- /dev/null +++ b/4ComputationAndData.md @@ -0,0 +1,134 @@ +Cours de Florent. + +# Calculer en théorie et en pratique II/III + +Dans cette séquence de cours, nous tentons de répondre à la question suivante. + +C'est quoi un ordinateur? + +Cette question s'apparente à celle que ce sont posés philosophes et mathématiciens de Leibnitz à Turing en passant par Hilbert. + +Qu'est-ce qu'une question à laquelle on peut répondre de manière mécanique par un calcul? + +Nous avons vu une approximation de calcul théorique basé sur le calcul booléen et des portes logiques qui sont implémentable avec des composants electroniques, permettant de réaliser divers opérations comme l'addition bit à bit (schéma de Vernam en cryptographie), la majorité ou encore l'addition avec retenue. + +Aujourd'hui nous poursuivons avec un modèle théorique, qui est celui de l'**automate fini**, un modèle assez restreint de machine. L'adjectif fini s'applique à la mémoire de la machine qui est finie. + +Nous verrons plus tard un modèle plus général avec une mémoire arbitrairement grande : la machine deTuring. + +## Le modèle d'automate fini. + +* La machine va lire en entrée un mot sur un alphabet A de taille finie (on peut par exemple imaginer qu'il s'agit d'un mot en binaire et l'alphabet A serait par exemple composé des symboles 0 et 1). +* La machine possède plusieurs états. Intuitivement, chaque état code pour ce qu'on stocke dans la mémoire finie de la machine. +* Certains états sont dit **acceptant**. +* Un état spécial est celui dans lequel la machine débute son calcul. C'est l'**état initial**. +* La machine va "manger" le mot d'entrée lettre par lettre et passe d'un état à l'autre selon ce que son **programme** lui dicte. +* Quand toutes les lettres sont lues, si l'état dans lequel la machine se trouve est acceptant, la machine répond OUI (elle **accepte** le mot) sinon elle répond NON (elle **rejette** le mot). +* L'ensemble des mots sur l'alphabet A qui sont acceptés par la machine forme le *langage reconnu par l'automate*. + +### Le programme de l'automate. +On peut l'écrire dans un tableur, sous forme d'une succession fini de lignes avec trois colonnes. +La première colonne est l'état actuel, la seconde colonne est la lettre lue, la troisième colonne est le nouvel état. + +Pour un état donné q et une lettre lue x, l'automate va se placer dans un état donné q' (il est possible que q et q' soit le même état). + +Si le programme est incomplet et que le tableur n'explique pas comment faire, on arrête le calcul et on rejette le mot. + +Si le tableur n'est pas ambigu et que on n'a jamais deux lignes indiquant pour la même paire de lettre lue et d'état un nouvel état différent, on dit que l'automate est **déterministe**. + +Sinon l'automate n'est pas déterministe -- on dit aussi **non-déterministe** -- et on considère que la machine peut choisir une action du tableur parmi celles qui sont listées. + +Pour un automate non déterministe, on considère qu'un mot est accepté si il existe un calcul qui accepte. + +Analogie : vous cherchez à sortir d'un labyrinthe, il y a de nombreux chemins possibles. Si il en existe un vers la sortie alors vous pouvez gagner au jeu du labyrinthe. + +## Exemples avec JFLAP. + +JFLAP est un logiciel de simulation de machines théoriques qui permet de définir, manipuler, exécuter et transformer des machines. En pratique c'est une archive jar. + +Une archive jar est un programme codé dans le langage java que vous pouvez exécuter. +L'archive se compose de divers fichiers, dont un fichier principal, des librairies etc. + +Pour utiliser le logiciel, vous devez commencer par installer java. +Suivez les recommandations de votre système d'exploitation. + +Ensuite, il vous suffit souvent de double-cliquer sur l'archive jar. + +Vous pouvez aussi en ligne de commande sous linux écrire. + +```bash +java -jar +``` +Sur les machines virtuelles, + +### Prise en main de JFlap. + +1. Lancez JFLAP et ouvrez [l'automate sauvegardé ici](https://www.lacl.fr/fmadelaine/Download/M1Droit/Automates/TP2NDA.jff) +2. Allez dans le menu *Input* et choisissez *Step by State*. Entrez le mot **babb** et observez la simulation des exécutions parallèles étape par étape en appuyant sur *step*. +3. Testez ensuite avec le mot **baaa**. +4. Relancez les tests ci-dessus. Cette fois essayez les autres + options. + * *Reset* permet de revenir au début du calcul + * *Trace* après sélection en bas d'une exécution permet + de montrer cette exécution depuis le début. + * *Remove* élimine l'exécution sélectionnée + * *Freeze*/*Thaw* permet de mettre en pause ou de + reprendre une exécution (on perd la synchronisation) +5. Vous pouvez aussi tester sans les étapes avec *Fast Run* + voir plusieurs entrées en même temps avec + *Multiple Run* (tous les deux dans le menu *Input*). + Faites le par exemple pour les deux mots précédents. +6. Pour information, *Step with closure* fait la même chose + que *step by State* sauf pour les automates ayant des + transitions avec le mot-vide (mais on ne les considère pas dans + ce cours). + +### Hello World +Votre but est de créer l'automate dessiné ci-dessous. + + ![images/HelloWorldAutomate.jpg] + +1. Cliquez sur *File* puis *New*. +2. JFLAP permet de gérer différents modèles de calcul. Nous allons + nous en tenir aux automates finis. Cliquez sur *Finite Automaton*. + Vous avez accès à une nouvelle fenêtre en mode éditeur. + * Cliquez sur le petit cercle avec un q à l'intérieur, puis sur + le canevas pour ajouter des états. + * Les deux derniers boutons permettent de faire du undo/redo. + * La flèche fine permet d'ajouter une transition entre 1 ou 2 + états (ne pas oublier de mettre une lettre). + * La flèche plus épaisse à gauche permet de sélectionner, + déplacer, éditer les propriétés des différents éléments (par + exemple de faire un état initial). + * La tête de mort permet de détruire des états ou des transitions. + +### Exercices +Dessinez les automates qui reconnaissent : + +(pour l'alphabet $\{a,b\}$) + +1. les mots de 2 lettres; +2. les mots contenant exactement 2 a; +3. les mots contenant 2 a consécutifs; +4. les mots commençant par b; +5. les mots se terminant par bab; +6. le langage réduit au mot vide; + +(pour l'alphabet $\{a,b,c\}$) + +7. les mots qui contiennent $aabcc$; +8. les mots de taille multiple de 3; +9. les mots de la forme abcabcabc... (une ou plusieurs successions des 3 lettres abc); +10. les mots dont la première lettre est égale à la dernière. + +
Calcul modulaire en base 2 +

+ +### Compter avec les automates +On ne le verra pas dans ce cours, mais il est possible d'établir que le modèle des automates ne permet pas de compter. Par exemple, on ne peut pas lire une expression avec des parenthèses et vérifier qu'il y a autant de parenthèses ouvrantes que de parenthèses fermantes. On ne peut pas non plus vérifier que les parenthèses correspondent bien. Ainsi ce modèle n'est pas suffisant pour vérifier par exemple qu'une chaîne de caractères est un programme suivant un syntaxe fixée du C. + +Par contre, on peut compter facilement modulo N, puisque celà revient à se souvenir + + +

+
diff --git a/images/HelloWorldAutomate.jpg b/images/HelloWorldAutomate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e654f49d28242c05403bd162dfc983925f9edae1 GIT binary patch literal 50169 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
DOuPoVB6JVVIA<8?tnia=>c(B<@Okj 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