-
Notifications
You must be signed in to change notification settings - Fork 35
/
04_modeles.tex
1406 lines (1188 loc) · 53.3 KB
/
04_modeles.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
% Modèles de calculabilité
% ========================
\chapter{Modèles de calculabilité}
\label{sec:mod_le_de_la_calculabilit_}
\section{Familles de modèles}
\label{sub:fammilles_de_mod_les}
Il y a deux grandes familles de modèles :
\begin{itemize}
\item Modèles de calcul (calcule une réponse)
\item Modèles de langages (décide l'appartenance à un ensemble)
\end{itemize}
\subsection{Modèles de calcul}
\label{ssub:mod_le_de_calcul}
L'objectif est de modéliser le concept de fonctions calculables, processus de
calcul, algorithme effectif.
On peut encore classer les modèles de calcul en 2 catégories, les
modèles déterministes et les modèles non déterministes.
\begin{mydef}[Modèles déterministes] une seule exécution possible
\end{mydef}
\begin{mydef}[Modèles non déterministes] il existe plusieurs exécutions
possibles
\end{mydef}
On va voir les modèles de calcul suivant :
\begin{itemize}
\item Automate fini
\item Automate à pile
\item Machine de Turing
\item Langages de programmation
\item Lambda calcul
\item Fonctions récursives
\end{itemize}
Mais il en existe beaucoup d'autres !
% subsubsection mod_le_de_calcul (end)
\subsection{Modèles de langage}
\label{ssub:mod_le_de_langage}
Pour rappel, un langage est un ensemble de mots constitués de symboles d'un alphabet donné.
Un langage est défini par une grammaire formelle. L'objectif est de modéliser
une classe de langages. Le langage est alors soit un ensemble récursif, soit un
ensemble récursivement énumérable.
% subsubsection mod_le_de_langage (end)
% subsection fammilles_de_mod_les (end)
\section{Langages de programmation}
\label{sub:langages_de_programmation}
C'est un modèle possible de la calculabilité. Pour définir un langage de
programmation comme modèle de calculabilité, il faut définir une :
\begin{itemize}
\item Syntaxe du langage
\item Sémantique du langage
\item Convention de représentation d'une fonction par un programme
\end{itemize}
On se pose la question de savoir s'il y a des langages plus puissants que
d'autres. On va montrer que tous les langages complets sont équivalents. (Et la
plupart des langages sont complets.)
\paragraph{} Mais, il existe aussi des langages qui ne sont pas complets comme le
langage BLOOP (Bounded Loop).
\begin{mydef}
BLOOP : Sous ensemble de Java qui ne calcule que des fonctions totales.
(pas de boucle while, boucle for mais sans modification du compteur
dans le for, pas de goto en arrière, pas de fonctions récursives)
\end{mydef}
BLOOP a donc toutes les propriétés qui découlent du chapitre précédent:
\begin{myprop}
Tous les programmes BLOOP se terminent :\\
$ \Rightarrow$ BLOOP ne calcule que des fonctions totales\\
$ \Rightarrow$ L'interpréteur de BLOOP est une fonction totale non calculable en
BLOOP (Hoare-Allison)\\
$ \Rightarrow$ BLOOP ne calcule pas toutes les fonctions totales\\
$ \Rightarrow$ BLOOP n'est pas un modèle complet de la calculabilité\\
Cependant il existe un compilateur des programmes BLOOP (Java).\\
\end{myprop}
% subsection langages_de_programmation (end)
\subsection{Langage de programmation non déterministe}
\label{ssub:langague_de_programmation_non_d_terministe}
\begin{myrem}
Il est difficile d'avoir de l'intuition sur cette partie. On peut
voir un programme ND (=non déterministe) comme un programme qui produit des résultats
différents d'une exécution à l'autre. On peut représenter toutes
les exécutions possibles du programme sous forme de branches d'un
arbre. Pour analyser la complexité, on ne
considère que la profondeur de l'arbre (longueur de la branche
la plus longue).
\end{myrem}
On va introduire un nouveau langage ND-Java qui est le langage Java
auquel on ajoute le non-déterminisme sous la forme d'une fonction
prédéfinie $choose(n)$. Celle-ci retourne un entier compris entre $0$ et $n$ et elle
est non déterministe.
On peut voir un programme ND de 2 manières différentes :
\begin{enumerate}
\item Il calcule une relation plutôt qu'une fonction
\item C'est un moyen de décider si un élément appartient à un
ensemble
\end{enumerate}
On considère l'approche 2 en calculabilité.
\begin{mydef}[ND-récursif] \label{def:ND-rec}
Un ensemble $A \subseteq \N$ est ND-récursif s’il existe un
ND-programme tel que lorsqu'il reçoit comme donnée n'importe quel nombre
naturel $x$, \\
\begin{tabular}{l}
si $x \in A$ alors il existe une exécution fournissant tôt ou tard
comme résultat 1 \\
si $x \notin A$ alors toutes les exécutions fournissent tôt ou tard
comme résultat 0 \\
\end{tabular}
\end{mydef}
\begin{mydef}[ND-récursivement énumérable] \label{def:ND-recenum}
Un ensemble $A \subseteq \N$ est ND-récursivement énumérable s’il existe un
ND-programme tel que lorsqu'il reçoit comme donnée n'importe quel nombre
naturel $x$, \\
\begin{tabular}{l}
si $x \in A$ alors il existe une exécution fournissant tôt ou tard
comme résultat 1 \\
si $x \notin A$ alors les exécutions possibles ne se terminent pas ou
retournent un résultat $\neq 1$ \\
\end{tabular}
\end{mydef}
\begin{myprop} \label{prop:ND-eq}
On peut simuler les exécutions d'un ND-programme à l'aide d'un programme
déterministe.
\begin{proof}
Soit un programme non-déterministe quelconque à N branches (N \textit{threads}).
Montrons qu'on peut construire un programme déterministe équivalent.
Il suffit de créer un programme qui exécute séquentiellement chacune des N branches de l'arbre.
Cependant les branches pouvant être infinies, il est nécessaire d'explorer ces branches de l'\ arbre d'exécution en largeur d'abord (\textit{Breadth First Search}). La complexité temporelle du programme ainsi construit devient exponentielle. En effet, un arbre de profondeur $k$ a un nombre exponentiel de noeuds.
\end{proof}
\end{myprop}
\paragraph{Exemple} : Le ND-programme à gauche (figure \ref{fig:ND_tree}) comporte 3 branches et a une hauteur de 3. Il est tranformé en un programme D, à droite (figure \ref{fig:D_tree}) qui a une longueur de 9. \\
\input{Images/ND_to_D_Exemple.tex}
\begin{myprop}
Un ensemble est ND-récursif ssi il est récursif
\begin{proof}
Si un ensemble A quelconque est ND-récursif, alors il est récursif.
En effet, s'il est ND-récursif, il existe un ND-programme qui permet de décider l'ensemble A (voir définition \ref{def:ND-rec}).
Par la propriété \ref{prop:ND-eq}, on sait qu'il existe alors un programme déterministe équivalent qui décide A. À ce programme correspond un algorithme.
Selon la définition \ref{def:recursif}, l'ensemble A est alors récursif.
Inversement, si un ensemble A quelconque est récursif, alors il est ND-récursif. En effet, par définition, il existe un programme D qui décide A.
Ce programme peut être vu comme un programme ND avec seulement une branche. A est donc également ND-récursif.
\end{proof}
\end{myprop}
\begin{myprop}
Un ensemble est ND-récursivement énumérable ssi il est récursivement énumérable
\begin{proof}
Si un ensemble A quelconque est ND-récursivement énumérable, alors il est récursivement
énumérable.
En effet, s'il est ND-récursivement énumérable, il existe un ND-programme dont le comportement est décrit à la définition \ref{def:ND-recenum}.
Par la propriété \ref{prop:ND-eq}, on sait qu'il existe alors un programme déterministe qui se comporte de manière équivalente. À ce programme correspond un algorithme.
Selon la définition \ref{def:recursivement enum}, l'ensemble A est alors récursivement énumérable.
Inversement, si un ensemble A quelconque est récursivement énumérable, alors il est ND-récursivement énumérable. En effet, par définition, il existe un programme D qui se comporte comme décrit dans la définition \ref{def:recursivement enum}.
Ce programme peut être vu comme un programme ND avec seulement une branche. A est donc également ND-récursivement énumérable.
\end{proof}
\end{myprop}
\begin{myrem}
Avec un programme non déterministe, on pourrait résoudre le problème du voyageur de commerce avec une compléxité linéaire. Malheureusement, les modèles ND ne sont pas réalisables en pratique. On ne peut que les simuler. Leur intêret est en réalité double :
\begin{itemize}
\item ils sont à la base de la NP-complétude ;
\item ils sont utilisés pour modéliser des problèmes difficiles.
\end{itemize}
\end{myrem}
\section{Automates finis FA}
\label{sub:automates_finis}
\paragraph{Objectif :} Décider si un mot donné appartient ou non à un langage.
\paragraph{Utilisation :} Utilisé dans les interfaces pour les humains (par
exemple, les distributeurs).\\
Un automate fini (FA) est une modélisation élémentaire du concept de calcul :
\begin{itemize}
\item nombre fini d'états ;
\item lecture d'une donnée : un mot (chaîne de caractères) ;
\item chaque symbole de la donnée est lu \texttt{une et une seule} fois ;
\item transitions entre états en fonction du symbole lu ;
\item état final = état après avoir lu tous les symboles de la donnée ;
\item pas de possibilité de mémorisation
\end{itemize}
Ce qui se passe à l'instant t ne dépend pas du passé. Les seuls éléments qui comptent sont :
\begin{itemize}
\item l'état courant ;
\item le symbole.
\end{itemize}
\subsection{Modèles des automates finis}
\label{ssub:mod_les_des_automates_finis}
Un automate fini est composé de :
\begin{itemize}
\item $\Sigma$ : ensemble fini de symboles
\item $S$ : ensemble fini d'états
\item $s_0 \in S$ : état initial
\item $A \subseteq S$ : ensemble des états acceptants
\item $\delta: S \times \Sigma \rightarrow S$ : fonction de transition
\end{itemize}
\paragraph{Fonctionnement}
\begin{itemize}
\item départ avec un état initial
\item parcours des symboles du mot d'entrée, un à un
\item à chaque symbole lu, l'état change (fonction de transition
$\delta$) en fonction de l'état courant et du symbole lu
\item l'état final est l'état après avoir parcouru tous les symboles en
entrée
\item l'état final peut-être acceptant ou non
\end{itemize}
\begin{myrem}
Il n'y a donc pas de mémoire. De plus, un automate fini peut-être simulé
par un programme Java.
\end{myrem}
\begin{myrem}
Un état acceptant est entouré deux fois sur un diagramme d'état.
\end{myrem}
\begin{myprop}
Un automate fini définit un ensemble récursif de mots $=\{m \ |\ m$ est
accepté par FA$\}$
\end{myprop}
\begin{myprop}
Certains ensembles récursifs ne peuvent pas être reconnus par un
automate fini. Par exemple $L = \{ a^n b^n \ | \ n\geq 0\}$ (parce qu'il nécessiterait un nombre infini d'états)
\end{myprop}
\begin{myprop}
L'interpréteur des automates finis est calculable, mais ne peut pas être
représenté par un automate fini, car ce n'est pas un \textbf{modèle
complet} de la calculabilité (Hoare-Allison)
\end{myprop}
=======
% Indiqué plus bas dans la synthèse => inutile !
%\begin{myprop}
% Un automate fini définit un ensemble récursif de mots $=\{m \ |\ m$ est
% accepté par FA$\}$
%\end{myprop}
%
%\begin{myprop}
% Certains ensembles récursifs ne peuvent pas être reconnus par un
% automate fini. Par exemple $L = \{ a^n b^n \ | \ n\geq 0\}$ (parce qu'il nécessiterait un nombre infini d'états)
%\end{myprop}
%
%\begin{myprop}
% L'interpréteur des automates finis est calculable, mais ne peut pas être
% représenté par un automate fini, car ce n'est pas un \textbf{modèle
% complet} de la calculabilité (Hoare-Allison)
%\end{myprop}
%
%\begin{mydef}[Langage régulier] Un langage régulier est un langage défini par une expression
% régulière.
%\end{mydef}
\paragraph{Exemple}
Un exemple simple de mécanisme qui peut être modélisé par un automate fini est le portillon d'accès. Dans le métro par exemple, lorsqu'un ticket est inséré, le portillon se déverrouille et le passage d'un usagé est autorisé, lorsque celui ci est passé, il se verrouille à nouveau. Le portillon peut être modélisé comme un automate fini comportant deux états: verrouillé et déverrouillé. L'état peut-être modifié par l'ajout d'un ticket/jeton (entrée: jeton). Soit lorsque l'utilisateur pousse les barres du portillon (entrée: pousser). La fonction de transition est représentée par la table \ref{FTPortillon}. La figure \ref{diagrammeetat} illustre le diagramme d'état de cet automate.
\begin{figure}[H]
\centering
\begin{tikzpicture}
\node[draw,minimum height=2cm,circle] (A) at (0,0) {verouillé};
\node[draw,minimum height=2cm,circle] (B) at (4,0) {déverouillé};
\draw (0,-1.75) node {$\bullet$};
\draw[->,>=stealth,thick] (0,-1.75) -- (0,-1);
\draw[->,>=latex] (A) to[out=45,in=135] (B);
\draw[->,>=latex] (B) to[out=-135,in=-45] (A);
\draw[->,>=latex] (-0.7071,0.7071) arc(45:315:1);
\draw[->,>=latex] (4.73,-0.7071) arc(-135:135:1);
\draw (-1.5,0.9) node[above] {pousser};
\draw (2,-1.25) node[below] {pousser};
\draw (2,1.25) node[above] {jeton};
\draw (5.5,-0.9) node[below] {jeton};
\end{tikzpicture}
\caption{Diagramme d'état du portillon \\{\footnotesize
Par ManiacParisien — Travail personnel, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=47664521}}
\label{diagrammeetat}
\end{figure}
\begin{table}[H]
\centering
\begin{tabular}{|l|l|l|}
\hline
& Pousser & Jeton \\ \hline
Verrouillé & Verrouillé & Déverrouillé \\ \hline
Déverrouillé & Verrouillé & Déverrouillé \\ \hline
\end{tabular}
\caption{Fonction de transition du portillon}
\label{FTPortillon}
\end{table}
Un exemple plus complexe est le célèbre problème du passeur. Celui ci doit traverser une rivière, avec un loup, une salade et une chèvre. Dans sa barque il ne peut prendre qu'un objet avec lui. La difficulté supplémentaire est que la chèvre et le loup ne peuvent pas rester ensemble et la chèvre ne peut pas rester seule avec la salade. Chaque état représente les objets se trouvant sur l'autre rive, P étant le passeur, C la chèvre, L le loup et S la salade. Sur les flèches, la lettre correspond à l'objet transporté avec lui lors de la traversée. Au début rien n'a été transporté, à la fin, les trois objets et le passeur se retrouvent sur l'autre rive.
La figure \ref{Salade} illustre le diagramme d'état de cette énigme.
\begin{figure}[h]
\centering
% Ne pas utiliser le fichier Images/567px-ChevreLoupSalade.jpg car travis n'arrive pas à builder avec cette version
\includegraphics[width=0.4\textwidth]{Images/ChevreLoupSalade.jpg}
\caption{Diagramme d'état du passeur \\{\footnotesize Par ManiacParisien — Travail personnel, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=47815891}}
\label{Salade}
\end{figure}
Un autre exemple d'automate fini est un distributeur de boissons qui reçoit une pièce d'argent et un choix de boisson puis sert la boisson choisie. Par exemple, nous pouvons considérer que la machine reçoit une pièce de 2 euros et a uniquement trois choix Fanta, Coca, Eau. Un tel système peut être modélisé par la figure \ref{distribfig}.
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\begin{tikzpicture}%[thick,scale=0.8, every node/.style={transform shape}]
\node[draw,minimum height=2cm,circle] (A) at (0,0) {Etat 1};
\node[draw,minimum height=2cm,circle] (B) at (10,0) {Etat 2};
\draw (0,1.75) node {$\bullet$};
\draw[->,>=stealth,thick] (0,1.75) -- (0,1);
\draw[->,>=latex] (A) to[out=45, in=135] (B);
\draw[->,>=latex] (B) to[out=-140, in=-40] (A);
\draw[->,>=latex] (B) to[out=-120, in=-65] (A);
\draw[->,>=latex] (B) to[out=-100, in=-85] (A);
\draw[->,>=latex] (-0.7071,0.7071) arc(45:315:1);
\draw[->,>=latex] (10.73,-0.7071) arc(-135:135:1);
\draw (5,-1.50) node[below] {Fanta choisir / servir fanta};
\draw (5,-2.55) node[below] {Coca choisir / servir coca};
\draw (5,-3.70) node[below] {Eau choisir / servir eau};
\draw (5,2.40) node[above] {jeton / crédit "jeton" euros};
\draw (11.8,-0.9) node[below] {jeton / le rendre};
\draw (-2.8,-0.9) node[below] {choix boisson / crédit nul};
\end{tikzpicture}
}
\caption{Diagramme d'état d'un distributeur de boisson simple \\{Inspirer du TD7 : Automates Par Stephane Devismes Université Grenoble Alpes}}
\label{distribfig}
\end{figure}
Les transitions avec les mêmes états de départs et d’arrivées et la même sortie ont une seule flèche étiquetée avec l’entrée / la sortie.
\paragraph{Propriétés}
\begin{myprop}
Un automate fini définit un ensemble récursif de mots $=\{m \ |\ m$ est
accepté par FA$\}$.
\end{myprop}
\begin{myprop}
Certains ensembles récursifs ne peuvent pas être reconnus par un
automate fini.
\begin{proof}
Par exemple $L = \{ a^n b^n \mid n\geq 0\}$ : l'automate doit compter le nombre de $a$ pour vérifier qu'il y a autant de $b$. Mais il n'a pas de mémoire, donc pas de moyen de retenir le nombre $n$.
Par contre, un automate fini pourrait reconnaître l'ensemble $L' = \{a^n b^m \mid n,m\geq 0\}$.
\end{proof}
\end{myprop}
\begin{myprop}
L'interpréteur des automates finis est calculable, mais ne peut pas être
représenté par un automate fini, car ce n'est pas un \textbf{modèle
complet} de la calculabilité (Hoare-Allison).
\end{myprop}
\begin{mydef}[Langage régulier] est un langage défini par une expression
régulière.
\end{mydef}
\begin{mydef}[Expression régulière]
Dans le cours, la syntaxe d'une expression régulière est la suivante :
\begin{description}
\item[+] ou
\item[.] concaténation
\item[*] fermeture de Kleene\footnote{définit un groupe qui existe zéro, une ou plusieurs fois}
\item[( )] répétition
\end{description}
\end{mydef}
% subsubsection mod_les_des_automates_finis (end)
\subsection{Extension des automates finis}
\label{ssub:automate_fini_nd}
\paragraph{NDFA} On étend le modèle en permettant d'avoir plusieurs transitions possibles pour
une paire <état,symbole>. Ce qui implique que plusieurs exécutions sont
possibles. On a donc plus une fonction de transition mais une relation de transition.
\paragraph{} De même, pour un ND programme, un mot est accepté par un NDFA
s'il existe au moins une exécution où l'état final est acceptant. Dans l'autre
sens, un mot n'est pas accepté si aucune exécution ne se termine avec l'état final
acceptant.
\begin{myprop}
Si un ensemble récursif est défini par un NDFA, alors cet ensemble est
défini par un FA.
\end{myprop}
\begin{myprop}
Un NDFA définit un ensemble récursif de mots.
\end{myprop}
\paragraph{Ajout de transitions vides $\epsilon$ : $\epsilon$-NDFA} On peut encore étendre le modèle NDFA en
rajoutant une possibilité de transition sans lire de symbole (transition
spontanée). Ça a la même puissance et les mêmes propriétés qu'un NDFA.
% subsubsection automate_fini_nd (end)
\section{Automate à pile PDA}
\label{sub:automate_pile}
C'est une extension du modèle des automates finis. On ajoute une mémoire avec
la pile de symboles.
Les différences principales sont :
\begin{itemize}
\item la transition entre états dépend du symbole lu et du symbole au
sommet de la pile
\item chaque transition peut enlever le sommet de la pile et empiler
de nouveaux éléments ou ne pas changer la pile.
\end{itemize}
\paragraph{Objectif :} Décider si le mot donné appartient ou non à un langage.
\paragraph{Utilisation :} Utilisé dans les compilateurs.
\paragraph{Composition :}
On rajoute $\Gamma$ et on change la fonction de transition en une nouvelle
relation de transition.
\begin{itemize}
\item $\Sigma$ : ensemble fini de symboles d'entrée
\item $\Gamma$ : ensemble fini de symboles de pile
\item $S$ : ensemble fini d'états
\item $s_0 \in S$ : état initial
\item $A \subseteq S$ : ensemble des états acceptants
\item $\Delta \subset S \times \Sigma \times \Gamma \rightarrow S \times
\Gamma^*$ : relation de transition (finie)
\end{itemize}
\begin{myprop}
Tout comme un NDFA, un PDA définit un ensemble récursif de mots (langage
récursif).
\end{myprop}
\paragraph{Convention :}
\begin{itemize}
\item Z est le symbole initial de la pile (pile vide)
\item $\epsilon$ signifie qu’aucun symbole ne doit être lu pour cette
transition (symbole ``vide'')
\item A, B / C : A est le symbole lu, B est le symbole au
sommet de la pile et C est ce qui va remplacer le
sommet de la pile (peut-être un xB pour
rajouter x sur la pile, $\epsilon$ pour retirer B du sommet de la pile,
ou juste B pour ne pas changer le sommet)
\end{itemize}
\begin{myprop}
Certains ensembles récursifs ne peuvent pas être reconnus par un automate
à pile.
\end{myprop}
\begin{proof}
Par exemple $\{a^n b^n a^n | n\geq 1\}$ : notre automate doit d'abord retenir le nombre $n$ dans la première série de $a$, puis vérifier qu'il y a bien $n$ occurrences de $b$ puis $n$ occurrences de $a$ dans la deuxième série. Le seul moyen de retenir $n$ est d'empiler un symbole dans la pile chaque fois qu'on lit un $a$, de sorte à avoir $n$ symboles empilés après la première série de $a$.
Ensuite, on enlève un symbole chaque fois qu'on lit un $b$, sachant qu'on doit arriver au bout de la série de $b$ en même temps qu'on arrive au fond de la pile. Mais impossible alors de savoir combien d'occurrences de $a$ il faut compter dans la deuxième série de $a$, on ne connaît plus le nombre $n$ !
\end{proof}
\begin{myprop}
Les automates à pile sont plus puissants que les automates finis (ils
peuvent reconnaitre plus d'ensembles)
\end{myprop}
\begin{myprop}
Ce n'est pas un modèle complet de la calculabilité donc par Hoare-
Allison, l'interpréteur n'est pas calculable dans le modèle.
% Lena : pas sûre du sens de l'implication
\end{myprop}
% subsection automate_pile (end)
\section{Grammaires et modèles de calcul}
\label{sub:grammaires_et_mod_les_de_calcul}
\paragraph{Objectif :}
Définition d'un langage (ensemble de mots) et à partir de la grammaire on peut
générer/dériver les mots du langage.
\paragraph{Utilisation :} Utilisé pour la définition de langages de
programmation, pour l'analyse du langage naturel...
\paragraph{Composition du modèle :}
\begin{itemize}
\item $\Sigma$ : alphabet
\item les éléments de $\Sigma$ sont des symboles terminaux
\item autres symboles utilisés durant la dérivation : symboles non
terminaux (A,B, ..., <dig>,..)
\item S : point de départ de la dérivation (symbole non terminal)
\end{itemize}
\begin{mydef}[Règle de production]
On appelle un ensemble de règles de dérivation des règles de production.
\end{mydef}
\begin{myexem}
\begin{itemize}
\item $\Sigma ={0,1,2}$
\item $S \rightarrow <Dig>$
\item $<Dig> \rightarrow D$
\item $D \rightarrow 0 | 1 |2 | \epsilon $ ($\epsilon$ signifie rien)
\end{itemize}
\end{myexem}
\begin{myexem}[Grammaire des réels dans Java]
$\Sigma =\{0,1,2,3,4,5,6,7,8,9,.,E\}$ avec les règles de production suivantes :
\begin{itemize}
\item $S\ \rightarrow\ <Real>$
\item $<Real>\ \rightarrow\ <Sig><Dig>.<Dig>$
\item $<Real>\ \rightarrow\ <Sig><Dig>.<Dig>E<Exp>$
\item $<Real>\ \rightarrow\ <Sig><Dig>E<Exp>$
\item $<Sig>\ \rightarrow\ \epsilon\mid +\mid -$
\item $<Dig>\ \rightarrow\ D$
\item $<Dig>\ \rightarrow\ D<Dig>$
\item $D\ \rightarrow\ 0\mid 1\mid 2\mid 3\mid 4\mid 5\mid 6\mid 7\mid 8\mid 9\mid$
\item $<Exp>\ \rightarrow\ <Dig>$
\end{itemize}
Par exemple, le réel $+3.14$ est dérivé comme suit (leftmost derivation) :
\begin{align*}
S\ &\rightarrow\ <Real>\\
&\rightarrow\ <Sig><Dig>.<Dig>\\
&\rightarrow\ +<Dig>.<Dig>\\
&\rightarrow\ +D.<Dig>\\
&\rightarrow\ +3.<Dig>\\
&\rightarrow\ +3.D<Dig>\\
&\rightarrow\ +3.1<Dig>\\
&\rightarrow\ +3.1D\\
&\rightarrow\ +3.14
\end{align*}
Ce même exemple peut être représenté par un arbre syntaxique :
\begin{center}
\begin{tikzpicture}[level distance=1.2cm,
level 1/.style={sibling distance=3cm},
level 2/.style={sibling distance=1.5cm}]
\node {S}
child {node {Real}
child {node {Sig}
child {node {+}}
}
child {node {Dig}
child {node {D}
child {node {3}}
}
}
child {node {.}}
child {node {Dig}
child {node {D}
child {node {1}}
}
child {node {Dig}
child {node {D}
child {node {4}}
}
}
}
};
\end{tikzpicture}
\end{center}
\end{myexem}
\begin{mydef}[Dériver] Appliquer des règles de la grammaire pour vérifier
si une chaîne de symboles appartient au langage (on part d'une chaîne de symboles
et on vérifie les règles sur celle-ci).
\end{mydef}
\begin{mydef}[Inférer] Dérivation dans ``le sens contraire'',
c'est-à-dire, on part des règles de grammaire et on génère une chaîne
de symboles.
\end{mydef}
\begin{mydef}[Arbre syntaxique]
Un arbre syntaxique permet de représenter la dérivation, chaque noeud
correspond à un symbole terminal ou non. Les arêtes correspondent à
l'application d'une règle. Il y a plusieurs nœuds enfants si la règle
``génère'' plusieurs symboles.
\end{mydef}
\begin{myprop}
On peut dériver de plusieurs façons équivalentes, leftmost (on dérive
toujours le plus à gauche d'abord), rightmost (contraire de leftmost)
ou aucun des deux.
\end{myprop}
\subsection{Hiérarchie de Chomsky}
\label{ssub:hi_rarchie_de_chomsky}
Chomsky a défini 4 types de grammaires formelles. On peut les classer selon
leur ``puissance''.
\begin{mydef}[Puissance d'une grammaire]
Une grammaire A est plus puissante qu'une grammaire B si on peut définir plus
de langages avec A qu'avec B.
\end{mydef}
On peut aussi faire correspondre chaque type de grammaire avec un type de
calcul permettant de reconnaitre un langage de cette grammaire.
\begin{tabular}{|c|c|c|}
\hline
Type & Type de grammaire & Modèle de calcul\\
\hline
3 & régulière & Automate fini \\
\hline
2 & hors contexte & Automate à pile \\
\hline
1 & sensible au contexte & Machine de Turing à ruban fini \\
\hline
0 & récursivement énumérable & Machine de Turing \\
\hline
\end{tabular}
Chaque type de grammaire est défini par une règle de production A $\rightarrow
$ B. Il y a des conditions différentes sur A et B selon le type de
grammaire.
% subsubsection hi_rarchie_de_chomsky (end)
\subsection{Grammaires régulières}
\paragraph{Règle de production :}
\begin{itemize}
\item $A \rightarrow \omega B$
\item $A \rightarrow \omega$
\end{itemize}
\paragraph{Conditions :}
\begin{itemize}
\item $\omega \in \Sigma^*$, c'est-à-dire $\omega$ est une chaîne de symboles
terminaux.
\item A et B sont des symboles non terminaux.
\end{itemize}
\begin{myexem} Règles de dérivation :
\begin{itemize}
\item $S \rightarrow abS$
\item $S \rightarrow \epsilon$
\end{itemize}
Cette grammaire définit le langage $L1 =
\{(ab)^n \ | \ n \geq 0\}$. Ce langage peut-être aussi défini par une expression
régulière : $L1 = (ab)^*$.
\end{myexem}
\subsection{Grammaires hors contexte}
Cette grammaire est importante, car il suffit de lui rajouter la portée des
variables pour définir la syntaxe d'un langage de programmation.
\paragraph{Règle de production :}
\begin{itemize}
\item $A \rightarrow \beta$
\end{itemize}
\paragraph{Conditions :}
\begin{itemize}
\item $\beta$ est une chaîne de symboles composée de symboles terminaux
ou non
\item A est un symbole non terminal
\end{itemize}
\begin{myexem} Règle de dérivation :
\begin{itemize}
\item $S \rightarrow aSb$
\item $S \rightarrow \epsilon$
\end{itemize}
Le langage défini par cette grammaire est $L1 = \{a^nb^n|n\geq 0\}$.
\end{myexem}
\subsection{Grammaires sensibles au contexte}
\paragraph{Règle de production :}
\begin{itemize}
\item $\alpha \rightarrow \beta$
\end{itemize}
\paragraph{Conditions :}
\begin{itemize}
\item $\alpha$ et $\beta$ sont des chaînes de symboles composées de
symboles terminaux ou non.
\item $\beta$ contient au moins
autant de symboles que $\alpha$.
\end{itemize}
\begin{myexem} Règles de dérivation :
\begin{itemize}
\item $S \rightarrow aSBA$
\item $S \rightarrow abA$
\item $AB \rightarrow BA$
\item $bB \rightarrow bb$
\item $bA \rightarrow ba$
\item $aA \rightarrow aa$
\end{itemize}
Le langage défini par cette grammaire est $L1 =
\{a^nb^na^n|n \geq 0\}$.
\end{myexem}
\subsection{Grammaires sans restriction}
\paragraph{Règle de production :}
\begin{itemize}
\item $\alpha \rightarrow \beta$
\end{itemize}
\paragraph{Conditions :}
\begin{itemize}
\item $\alpha$ et $\beta$ sont des chaînes de symboles composées de
symboles terminaux ou non.
\end{itemize}
\begin{myexem}
Il y a donc moyen de créer des règles qui bouclent : \\
$\alpha \rightarrow \beta$ \\
$\beta \rightarrow \alpha$\\
\end{myexem}
\section{Machines de Turing}
\paragraph{Intérêt :}Le modèle des machines de Turing est le modèle le plus
simple, le plus élémentaire et le plus puissant possible (c'est un modèle
complet de la calculabilité). Il permet une définition précise de procédures,
d'algorithmes ou encore de calculs.
\paragraph{Composition ``abstraite'' :}
\begin{description}
\item[Ruban] Suite de cases potentiellement infinie (des 2 côtés), mais à
chaque moment, le ruban nécessaire est fini. Celui-ci correspond à la mémoire de la MT.
\item[Tête] Une seule tête, sur une case qui peut écrire et lire la
case sur laquelle elle est
\item[Contrôle] Dirige les actions/opérations
\end{description}
\subsection{Contrôle}
\label{ssub:contr_le}
Le contrôleur est composé d'un nombre d'états fini dont un état initial et un
d'arrêt. Il contient un programme (des instructions) et un mécanisme capable d'exécuter celles-ci.
\begin{mydef}[Une instruction] Une instruction a la forme
$$<q,c> \quad \rightarrow \quad <new_q, Mouv, new_c>$$
\begin{itemize}
\item $q$ : état courant
\item $c$ : symbole sous la tête de lecture
\item $new_c$ : symbole à écrire sous la tête de lecture
\item $Mouv$ : gauche ou droite, mouvement que la tête de lecture doit faire
\item $new_q$ : le nouvel état après exécution de l'instruction en question
\end{itemize}
\end{mydef}
% subsubsection contr_le (end)
\subsection{Modélisation}
Pour définir une machine de Turing, il faut :
\begin{itemize}
\item $\Sigma$ : ensemble fini de symboles d'entrée
\item $\Gamma$ : ensemble fini de symboles du ruban
\item $S$ : ensemble fini d'états
\item $s_0 \in S$ : état initial
\item $stop \in S$ : état d'arrêt
\item $\delta : S \times \Gamma \rightarrow S \times \{G,D\}
\times \Gamma$ : fonction de transition (finie)
\end{itemize}
Il faut aussi que $\Sigma \subset \Gamma$ et que B $\in \Gamma$ mais que B
$\notin \Sigma$
\begin{mydef}
B correspond au symbole blanc. C'est un caractère pour les cases non utilisées. On empêche bien sur le caractère blanc comme input sinon on ne sait pas savoir si le programme a terminé ou pas.
\end{mydef}
\subsection{Exécution}
Au départ il y a juste les données d'entrée sur le ruban. Sur les autres cases, il y a
le symbole B. La tête de lecture se trouve sur la première case des données. Tant que
c'est possible, on applique des instructions. Il y a 2 cas possibles pour l'arrêt: soit
l'état devient stop, soit il n'y a plus d'instruction applicable.
Le résultat est le contenu du ruban à l'état stop. Si la machine
ne s'arrête pas sur l'état stop alors il n'y a pas de résultat.
\begin{myexem}
Étant donné qu'une machine de Turing peut calculer une fonction, il existe un nombre important de machines de Turing. Celles-ci peuvent avoir des fonctions allant du 'très simple' au 'très complexe'. Par exemple une machine de Turing peut déterminer si un nombre est pair ou impair (en regardant si le dernier bit est égal à zéro ou à un), vérifier si le nombre est un multiple de 42, multiplier un chiffre par deux (il suffit de positionner la tête de lecture à droite et d'ajouter un zéro) ou encore calculer la fonction \textit{f(x) = x + 1}. Et c'est cette dernière fonction qui va vous être exposée.\\
Pour cela, il faudra faire deux actions : positionner la tête de lecture à droite et ensuite effectuer l'addition via le report des bits à 1.
\vspace{4pt} \\
Positionner la tête de lecture : \\
\begin{tabular}{|c|c|c|c|c|}
\hline
état & symbole & état & mouvement & symbole \\\hline
début & 0 & début & D & 0 \\ \hline
début & 1 & début & D & 1 \\ \hline
début & B & report & G & B \\ \hline
\end{tabular}
\vspace{4pt}
\\
Addition (via le report des bits à 1) : \\
\begin{tabular}{|c|c|c|c|c|}
\hline
état & symbole & état & mouvement & symbole \\\hline
report & 0 & stop & G & 1 \\ \hline
report & 1 & report & G & 0 \\ \hline
report & B & stop & G & 1 \\ \hline
\end{tabular}
\vspace{4pt}
\\
Exécution : \\
\begin{tabular}{|c|r|c|l|}
\hline
état & gauche & tête & droite \\\hline
début & & 1 & 1011 \\ \hline
début & 1 & 1 & 011 \\ \hline
début & 11 & 0 & 11 \\ \hline
début & 110 & 1 & 1 \\ \hline
début & 1101 & 1 & \\ \hline
début & 11011 & & \\ \hline
report & 1101 & 1 & \\ \hline
report & 110 & 1 & 0 \\ \hline
report & 11 & 0 & 00 \\ \hline
stop & 1 & 1 & 100 \\ \hline
\end{tabular}
\end{myexem}
\begin{mydef}[T-calculable] Une fonction $f$ est T-calculable s’ il existe une machine
de Turing qui,
recevant comme donnée n'importe quel nombre naturel $x$ fourni tôt ou tard
comme résultat $f(x)$ si celui-ci existe.
\end{mydef}
\begin{mydef}[T-récursif] Soit $A\subseteq \N$, $A$ est T-récursif s’il existe
une machine de Turing qui, recevant comme donnée n'importe quel nombre
naturel $x$, fournit tôt ou tard comme résultat :
$ \left\{
\begin{array}{l l}
1 & \quad \text{si $x\in A$}\\
0 & \quad \text{si $x\notin A$}
\end{array} \right.$
\end{mydef}
\begin{mydef}[T-récursivement énumérable] Soit $A\subseteq \N$, A est
T-récursivement énumérable s’ il existe
une machine de Turing qui, recevant comme donnée n'importe quel nombre
naturel $x$, fourni tôt ou tard comme résultat : $ 1 \text{ si } x \in A$.\\
Si $x \notin A$, la machine renvoie un résultat $\neq 1$, s'arrête avec un
état $\neq stop$ ou boucle.
\end{mydef}
\subsection{Thèse de Church-Turing}
\begin{enumerate}
\item Toute fonction T-calculable est calculable
\item Toute fonction calculable est T-calculable
\item Tout ensemble T-récursif est récursif
\item Tout ensemble récursif est T-récursif
\item Tout ensemble T-récursivement énumérable est récursivement
énumérable
\item Tout ensemble récursivement énumérable est T-récursivement
énumérable
\end{enumerate}
Les points 1, 3 et 5 sont des théorèmes. Les autres sont des thèses.
\subsection{Extension du modèle}
On peut modifier le modèle de base pour changer sa puissance et son efficacité.
\begin{mydef}[Puissance d'une MT] La puissance d'une MT se mesure en
fonction du nombre de fonctions qu'elle peut calculer.
\end{mydef}
\begin{mydef}[Efficacité d'une MT] L'efficacité d'une MT se calcule en
fonction du nombre d'instructions à exécuter (on ne tient pas compte de
la taille d'un mot mémoire).
\end{mydef}
\paragraph{Changer les conventions}
On peut par exemple permettre de se déplacer de plusieurs cases à la fois ou
encore de permettre plusieurs états $stop$.
\paragraph{Influence :}
\begin{itemize}
\item Même puissance (se déplacer de $n$ cases revient à se déplacer $n$ fois d'une case, on peut donc le programmer avec une MT classique).
\item Speedup linéaire (pour aller 20 cases à gauche on doit plus
exécuter 20 instructions se déplacer à gauche).
\end{itemize}
\paragraph{Réduire les symboles} Par exemple, ne plus avoir que 0 et 1 comme
symboles dans $\Sigma$.
\paragraph{Influence :}
\begin{itemize}
\item Même puissance : chaque symbole dans $\Sigma$ peut être codé avec des $0$ et des $1$.
\item Même efficacité, car même s’ il y a un facteur logarithmique (s'il y a $n$ symboles dans la MT classique, le ruban devra être agrandi de $\log(n)$ pour cette MT modifiée), en calculabilité on le néglige.
\end{itemize}
\paragraph{Limiter le nombre d'états} Cela implique qu'il y a seulement un nombre fini de machines de Turing différentes.
\paragraph{Influence :}
\begin{itemize}
\item Moins puissant
\end{itemize}
\paragraph{Autres rubans}
Ruban unidirectionnel, c'est-à-dire limité d'un coté (à priori à gauche).
\paragraph{Influence :}
\begin{itemize}
\item Même puissance : on renumérote les cases (voir efficacité) et on ajoute un état de tel sorte que lorsque la tête revient au début, elle repart dans l'autre sens.
\item Slowdown linéaire : il faut faire plus de déplacement, en
effet, avant les cases étaient numérotés
$$-\infty,...,-2,-1,0,1,2,...,+\infty$$
alors que maintenant ce sera
$$0,-1,1,-2,2,...,-\infty,+\infty$$
\end{itemize}
\paragraph{Ruban multicases} La tête lit plusieurs cases en parallèle, ce qui
implique que la taille de l'alphabet augmente ($\Sigma \times \Sigma \times ...$).
\paragraph{Influence :}
\begin{itemize}
\item Même puissance : même idée que précédemment. Si on a une MT à $n$ rubans on peut la transformer en une MT à 1 ruban où la $i$-ième suite de $n$ cases est associée à la case $i$ dans la MT modifiée. Les états sont construits de telle sorte que la tête lit d'abord les $n$ cases de sorte à arriver à un état à la $n$-ième case où toutes les cases précédentes sont mémorisées. La MT peut alors suivre un état qui prend en compte les $n$ cases précédentes.
\item Même efficacité : prendre un alphabet plus grand et une case est équivalent à un plus petit alphabet avec plusieurs cases.
\end{itemize}
\paragraph{Plusieurs rubans} Chaque ruban a sa propre tête.
On doit changer la relation de transition, car un état est défini par les positions
de toutes les têtes. Le relation doit maintenant prendre l'état ($E$) et plusieurs
symboles ($s_1,...,s_n$) et retourner un état ($E'$), plusieurs symboles
($s_1',...,s_n'$) à écrire et plusieurs directions différentes, une pour chaque tête
($d_1,...,d_n$).
%$$<s_1,s_2,...s_n>, E \ \rightarrow \ E', M_1, M_2,..., M_n, D_1, D_2,..., D_n$$
$$ <s_1,...,s_n>, E \ \rightarrow \ E', <s_1',...,s_n'>, <d_1,...,d_n> $$
% autre proposition (alors il faut changer le texte!) :
% $$ \delta : S \times \Gamma^n \ \rightarrow \ S \times \Gamma^n \times \{G,D\}^n $$
\paragraph{Influence :}
\begin{itemize}
\item Même puissance : pareil qu'auparavant, sauf qu'il faut ajouter l'information de la position de chaque tête dans l'état. la tête ne doit plus lire une même suite de $n$ cases, mais aller chercher la case dans la bonne suite (exemple : si la tête 3 doit lire la case 5, la tête de la MT classique doit lire la 3e case de la 5e suite de $n$ cases).
\item Speedup quadratique
\end{itemize}
\subsection{Machine de Turing non déterministe NDT}
Tout comme pour les automates non déterministes, on permet plusieurs
transitions possibles pour une paire <état, symbole>. La fonction de transition
devient une relation de transition, ce qui implique qu'il y a plusieurs
exécutions possibles.
\begin{myrem}
On utilise les NDT uniquement pour décider un ensemble.
\end{myrem}
\begin{myrem}
Cette partie est importante pour la partie concernant la complexité.
\end{myrem}
\begin{mydef}[NDT-récursif] Soit $A\subseteq \N$, $A$ est NDT-récursif s'il
existe une ND-machine de Turing telle que lorsqu'elle reçoit comme
donnée n'importe quel nombre naturel $x$:\\
\begin{tabular}{l}
Si $x\in A$, alors il existe une exécution fournissant tôt ou
tard comme résultat 1.\\
Si $x\notin A$, alors toutes les exécutions fournissent tôt ou
tard comme résultat 0.\\
\end{tabular}
\end{mydef}
\begin{mydef}[NDT-récursivement énumérable] Soit $A\subseteq \N$, $A$ est
NDT-récursivement énumérable s'il
existe une ND-machine de Turing telle que lorsqu'elle reçoit comme
donnée n'importe quel nombre naturel $x$:\\