Hoofdstuk 4 Talen en Automaten - Liacs
Hoofdstuk 4 Talen en Automaten - Liacs
Hoofdstuk 4 Talen en Automaten - Liacs
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Hoofdstuk</strong> 4<br />
<strong>Tal<strong>en</strong></strong> <strong>en</strong> Automat<strong>en</strong><br />
4.1 Formele <strong>Tal<strong>en</strong></strong><br />
Dit hoofdstuk is gebaseerd op e<strong>en</strong> hoofdstuk uit het dictaat Formele <strong>Tal<strong>en</strong></strong> <strong>en</strong> Automat<strong>en</strong> 1,<br />
G. Roz<strong>en</strong>berg, H.J. Hoogeboom, <strong>en</strong> J. Engelfriet (voorjaar 2000)<br />
4.1.1 Woord<strong>en</strong><br />
⊲ SCHAUM §12.2: Alphabet, Words, Free Semigroup<br />
E<strong>en</strong> alfabet Σ is e<strong>en</strong> eindige, niet-lege, verzameling. Elem<strong>en</strong>t<strong>en</strong> van Σ word<strong>en</strong><br />
wel letters of symbol<strong>en</strong> g<strong>en</strong>oemd. E<strong>en</strong> eindig (geord<strong>en</strong>d) rijtje van letters uit Σ<br />
heet e<strong>en</strong> woord of string over Σ. Als x = (a1,a2,...,an), met n ≥ 0 <strong>en</strong> ai ∈ Σ<br />
voor 1 ≤ i ≤ n, e<strong>en</strong> woord is, dan is n de l<strong>en</strong>gte van x, we noter<strong>en</strong> |x|. Het woord<br />
van l<strong>en</strong>gte 0, dus het rijtje (), heet het lege woord. We zull<strong>en</strong> voortaan woord<strong>en</strong><br />
noter<strong>en</strong> zonder haakjes <strong>en</strong> komma’s, dus x = a1a2 ···an. Het lege woord wordt nu<br />
g<strong>en</strong>oteerd als λ.<br />
Σ ∗ geeft de verzameling woord<strong>en</strong> over Σ aan, Σ + is de verzameling niet-lege woord<strong>en</strong>;<br />
Σ ∗ = Σ + ∪ {λ}.<br />
We definiër<strong>en</strong> e<strong>en</strong> binaire bewerking · op woord<strong>en</strong>, concat<strong>en</strong>atie gehet<strong>en</strong>. Deze<br />
bewerking voegt aan elk tweetal woord<strong>en</strong> het woord toe dat ontstaat door de twee<br />
achter elkaar te schrijv<strong>en</strong>. Dus als x = a1a2 ···an <strong>en</strong> y = b1b2 ···bm (met ai ∈ Σ,<br />
<strong>en</strong> b j ∈ Σ) dan x · y = a1a2 ···anb1b2 ···bm, dit is e<strong>en</strong> woord van l<strong>en</strong>gte n + m.<br />
Concat<strong>en</strong>atie is associatief, dwz. x · (y · z) = (x · y) · z, <strong>en</strong> het lege woord is het<br />
e<strong>en</strong>heids elem<strong>en</strong>t voor deze bewerking, dwz. x·λ = λ ·x = x. Concat<strong>en</strong>atie is niet<br />
commutatief, dwz. x · y is niet altijd gelijk aan y · x.<br />
We lat<strong>en</strong> vaak de notatie · weg, <strong>en</strong> schrijv<strong>en</strong> dan xy ipv. x ·y. Verder gebruik<strong>en</strong> we<br />
de notatie x n = x · ... · x (n maal). Het is nu logisch om x 0 = λ te definiër<strong>en</strong>. We<br />
hebb<strong>en</strong> dan x m+n = x m · x n voor alle n,m ∈ N.<br />
29
30 HOOFDSTUK 4. TALEN EN AUTOMATEN<br />
4.1 Voorbeeld. Voor Σ = {a,b,c}, zijn x = abbcab <strong>en</strong> y = cbbc woord<strong>en</strong> over Σ.<br />
y is bov<strong>en</strong>di<strong>en</strong> e<strong>en</strong> woord over {b,c}. Voor de l<strong>en</strong>gtes geldt |x| = 6, |y| = 4. De<br />
concat<strong>en</strong>atie x · y = abbcab · cbbc = abbcabcbbc. x 2 = abbcababbcab, x 1 = x.<br />
4.2 Opmerking. De gegev<strong>en</strong> definitie van de macht x n is nogal informeel. We<br />
kunn<strong>en</strong> ook e<strong>en</strong> nette inductieve definitie gev<strong>en</strong>, <strong>en</strong> de gegev<strong>en</strong> eig<strong>en</strong>schap formeel<br />
(met inductie) bewijz<strong>en</strong>.<br />
Voor e<strong>en</strong> woord x definiër<strong>en</strong> we x 0 = λ, <strong>en</strong> voor n ≥ 0, x n+1 = x n ·x. Volg<strong>en</strong>s deze<br />
formulering is bijvoorbeeld (ab) 1 = λ · ab = ab, <strong>en</strong> is (ab) 5 gelijk aan (((((ab) ·<br />
ab) · ab) · ab) · ab). Kijk<strong>en</strong> we nu naar (ab) 2 · (ab) 3 , dit is ((ab) · ab) · (((ab) · ab) ·<br />
ab), dan staan de haakjes anders; maar de uitkomst is natuurlijk hetzelfde. Dit<br />
volgt, formeel, uit Lemma 2.8. <br />
x is e<strong>en</strong> deelwoord van y als y = vxw voor zekere woord<strong>en</strong> v <strong>en</strong> w. Als bov<strong>en</strong>di<strong>en</strong><br />
v = λ of w = λ, dan heet x e<strong>en</strong> echt deelwoord van y. We onderscheid<strong>en</strong> ook<br />
deelwoord<strong>en</strong> op speciale plaats<strong>en</strong>. x is e<strong>en</strong> prefix van y als y = xw voor e<strong>en</strong> woord<br />
w, <strong>en</strong> x is e<strong>en</strong> suffix van y als y = vx voor e<strong>en</strong> woord v. E<strong>en</strong> prefix of suffix heet<br />
echt als het niet aan het hele woord gelijk is.<br />
4.3 Voorbeeld. y = aaabaab heeft x = aa als (echt) deelwoord. We zegg<strong>en</strong> dat<br />
x verschill<strong>en</strong>de voorkom<strong>en</strong>s heeft in y (in dit geval 3). Deze voorkom<strong>en</strong>s kunn<strong>en</strong><br />
elkaar overlapp<strong>en</strong>. aaba is e<strong>en</strong> prefix van z = aababaab. aab <strong>en</strong> λ (!) zijn zowel<br />
prefix als suffix van z. Natuurlijk is elk prefix <strong>en</strong> suffix ook e<strong>en</strong> deelwoord.<br />
4.4 Opmerking. De prefix-relatie op Σ ∗ heeft e<strong>en</strong> aantal bijzondere eig<strong>en</strong>schapp<strong>en</strong>.<br />
Lat<strong>en</strong> we schrijv<strong>en</strong> x y als x e<strong>en</strong> prefix van y is. Voor alle woord<strong>en</strong> x, y <strong>en</strong><br />
z geldt:<br />
reflexief: x x.<br />
anti-symmetrisch: als x y <strong>en</strong> y x, dan x = y.<br />
transitief: als x y <strong>en</strong> y z, dan is x z.<br />
E<strong>en</strong> relatie met deze eig<strong>en</strong>schapp<strong>en</strong> heet e<strong>en</strong> partiële ord<strong>en</strong>ing, ⊲ SCHAUM Ch. 14:<br />
Ordered Sets and Lattices. <br />
Voor e<strong>en</strong> woord x = a1a2 ···an heet het woord an ···a2a1 het spiegelbeeld van<br />
x <strong>en</strong> wordt g<strong>en</strong>oteerd als mir(x). De afbeelding mir kan inductief als volgt beschrev<strong>en</strong><br />
word<strong>en</strong>: mir(λ) = λ <strong>en</strong>, voor x ∈ Σ ∗ <strong>en</strong> a ∈ Σ, mir(xa) = a · mir(x). In<br />
het algeme<strong>en</strong> geldt dan dat mir(x · y) = mir(y) · mir(x) voor x,y ∈ Σ ∗ . Hoewel de<br />
eig<strong>en</strong>schap voor iedere<strong>en</strong> intuitief duidelijk is zull<strong>en</strong> we als opgave e<strong>en</strong> formeel<br />
inductief bewijs vrag<strong>en</strong>. Als alternatief wordt de notatie x R voor mir(x) ook nog<br />
al e<strong>en</strong>s gebruikt.
4.1. FORMELE TALEN 31<br />
4.1.2 <strong>Tal<strong>en</strong></strong> <strong>en</strong> hun bewerking<strong>en</strong><br />
⊲ SCHAUM §12.3: Languages<br />
⊲ SCHAUM §12.4: Regular Expressions, Regular Languages<br />
We gaan nog steeds uit van e<strong>en</strong> alfabet Σ. E<strong>en</strong> deelverzameling K van Σ ∗ heet e<strong>en</strong><br />
taal (over Σ); dus is P(Σ ∗ ) de verzameling van tal<strong>en</strong> over Σ. E<strong>en</strong> verzameling<br />
van tal<strong>en</strong> wordt meestal e<strong>en</strong> familie of klasse g<strong>en</strong>oemd. D<strong>en</strong>k er aan dat Σ ∗ e<strong>en</strong><br />
aftelbare verzameling is, terwijl P(Σ ∗ ) dat niet is, zie Opgave ??.<br />
We besprek<strong>en</strong> e<strong>en</strong> aantal bewerking<strong>en</strong> op tal<strong>en</strong>.<br />
Verzamelings operaties. Elke taal is e<strong>en</strong> verzameling, we kunn<strong>en</strong> dus sprek<strong>en</strong><br />
van de ver<strong>en</strong>iging K ∪ L, de doorsnede K ∩ L <strong>en</strong> het verschil K − L van twee tal<strong>en</strong><br />
K <strong>en</strong> L. E<strong>en</strong> bijzonder geval van verschil is natuurlijk het complem<strong>en</strong>t (tov. het<br />
alfabet Σ) Σ ∗ − K van de taal K ⊆ Σ ∗ .<br />
Wanneer we t<strong>en</strong> opzichte van e<strong>en</strong> vast alfabet werk<strong>en</strong>, geld<strong>en</strong> de regels van de<br />
Morgan: Σ ∗ − (K ∪ L) = (Σ ∗ − K) ∩ (Σ ∗ − L) <strong>en</strong> Σ ∗ − (K ∩ L) = (Σ ∗ − K) ∪ (Σ ∗ −<br />
L), voor K,L ⊆ Σ ∗ . Ook geldt Σ ∗ − (Σ ∗ − K) = K, ev<strong>en</strong>als de overige bek<strong>en</strong>de<br />
rek<strong>en</strong>regels voor verzameling<strong>en</strong>.<br />
Concat<strong>en</strong>atie. Wanneer we van twee gegev<strong>en</strong> tal<strong>en</strong> K <strong>en</strong> L op alle mogelijke<br />
manier<strong>en</strong> woord<strong>en</strong> van L achter woord<strong>en</strong> van K concat<strong>en</strong>er<strong>en</strong> krijg<strong>en</strong> we e<strong>en</strong> taal,<br />
de concat<strong>en</strong>atie K · L van K <strong>en</strong> L; formeel K · L = {x · y | x ∈ K,y ∈ L}. Net<br />
als bij concat<strong>en</strong>atie van woord<strong>en</strong> lat<strong>en</strong> we de · vaak weg (niet als dit t<strong>en</strong> koste<br />
van de duidelijkheid gaat). Ook hier is deze bewerking associatief, maar niet<br />
commutatief.<br />
Let op: K ∪ /0 = K, <strong>en</strong> K · /0 = /0 · K = /0, terwijl K ∪ {λ} = K desdals λ ∈ K, <strong>en</strong><br />
K · {λ} = {λ} · K = K. Dus {λ} is de e<strong>en</strong>heid bij concat<strong>en</strong>atie van tal<strong>en</strong>.<br />
Concat<strong>en</strong>atie distribueert over ver<strong>en</strong>iging (maar niet over doorsnede!) Sam<strong>en</strong>gevat:<br />
4.5 Lemma. Laat K,L,M tal<strong>en</strong> zijn over e<strong>en</strong> alfabet Σ. Dan<br />
(i) K · /0 = /0 · K = /0<br />
(ii) K · {λ} = {λ} · K = K<br />
(iii) (K · L) · M = K · (L · M)<br />
(iv) K · (L ∪ M) = K · L ∪ K · M,<br />
(v) (K ∪ L) · M = K · M ∪ L · M.<br />
Bewijs. In bewijz<strong>en</strong> over relaties tuss<strong>en</strong> tal<strong>en</strong> wordt gebruik gemaakt van<br />
het feit dat sommige bewerking<strong>en</strong> ‘monotoon’ zijn: als je er meer instopt,<br />
komt er meer uit. Bijvoorbeeld K ⊆ L impliceert M ∪ K ⊆ M ∪ L, <strong>en</strong> impliceert<br />
KM ⊆ LM <strong>en</strong> MK ⊆ ML. Dit volgt rechtstreeks uit de definities.
32 HOOFDSTUK 4. TALEN EN AUTOMATEN<br />
(iii) Dit volgt tamelijk direct uit de associativiteit van concat<strong>en</strong>atie van<br />
strings. Voor willekeurige z ∈ Σ ∗ geldt: z ∈ (K · L) · M ⇐⇒ z = xw met<br />
x ∈ K · L <strong>en</strong> w ∈ M ⇐⇒ z = xw met x = uv, met u ∈ K <strong>en</strong> v ∈ L, <strong>en</strong> w ∈ M<br />
⇐⇒ z = (uv)w = u(vw) met u ∈ K <strong>en</strong> v ∈ L <strong>en</strong> w ∈ M ⇐⇒ z = uy met<br />
u ∈ K <strong>en</strong> y = vw, met v ∈ L, <strong>en</strong> w ∈ M ⇐⇒ z = uy met u ∈ K <strong>en</strong> y ∈ L · M<br />
⇐⇒ z ∈ K · (L · M).<br />
(iv) Eerst K · (L ∪ M) ⊆ K · L ∪ K · M:<br />
Neem z ∈ K · (L ∪ M), dan z = xy met x ∈ K <strong>en</strong> y ∈ L ∪ M. Als y ∈ L, dan<br />
z = xy ∈ K ·L, anders z = xy ∈ K ·M. Dus in beide gevall<strong>en</strong> z ∈ K ·L∪K ·M.<br />
Nu K · (L ∪ M) ⊇ K · L ∪ K · M:<br />
Omdat L ⊆ L ∪ M, geldt K · L ⊆ K · (L ∪ M), ev<strong>en</strong>zo K · M ⊆ K · (L ∪ M)<br />
waaruit het gevraagde volgt.<br />
(v) Geheel symmetrisch aan het vorige geval. <br />
Macht<strong>en</strong>, ster. Net als woord<strong>en</strong> kunn<strong>en</strong> ook tal<strong>en</strong> met zichzelf (ev<strong>en</strong>tueel herhaald)<br />
geconcat<strong>en</strong>eerd word<strong>en</strong>. K n = {x1 · ... · xn | x1,...,xn ∈ K} heet de n-de<br />
macht van K. We kunn<strong>en</strong> dit ook inductief definiër<strong>en</strong>:<br />
K 0 = {λ}, K n+1 = K n · K voor n ∈ N. De eig<strong>en</strong>schap K m+n = K m · K n wordt<br />
daaruit met inductie verkreg<strong>en</strong>, als in Lemma 2.8. Uit de (iteratieve) definitie<br />
volgt dat de eerste macht van e<strong>en</strong> taal gelijk is aan de taal zelf, zoals we ook<br />
verwacht<strong>en</strong>: K 1 = K 0 · K = {λ} · K = K.<br />
Wanneer we ver<strong>en</strong>ig<strong>en</strong> over alle macht<strong>en</strong> krijg<strong>en</strong> we de (Kle<strong>en</strong>e) ster K ∗ van de<br />
taal K; dit is de taal die bestaat uit alle woord<strong>en</strong> ontstaan door nul, één, of meerdere<br />
woord<strong>en</strong> van K achter elkaar te zett<strong>en</strong>: K ∗ = <br />
n∈N Kn .<br />
We gebruik<strong>en</strong> ook wel K + = <br />
n∈N + K n , de (Kle<strong>en</strong>e) plus van K.<br />
Dus K ∗ = {x1 ·...·xn | n ≥ 0,x1,...,xn ∈ K}, <strong>en</strong> K + = {x1 ·...·xn | n ≥ 1,x1,...,xn ∈<br />
K}. Hier neemt binn<strong>en</strong> de definitie n alle waard<strong>en</strong> aan, terwijl in de definitie van<br />
K n hierbov<strong>en</strong> één vaste waarde geldt. Merk op dat K ∗ = K + ∪ {λ}; voor K = /0<br />
geldt dat /0 + = /0 <strong>en</strong> /0 ∗ = {λ}. Dat laatste is misschi<strong>en</strong> e<strong>en</strong> beetje vreemd.<br />
4.6 Voorbeeld. {a} ∗ is de verzameling van alle woord<strong>en</strong> bestaande uit alle<strong>en</strong> a’s.<br />
We schrijv<strong>en</strong> kortweg a ∗ . Voor tal<strong>en</strong> die bestaan uit één één-letter woord lat<strong>en</strong> we<br />
vaker de accolade’s weg. Bijvoorbeeld:<br />
a ∗ b = {a} ∗ · {b} = {λ,a,aa,aaa,...} · {b} = {b,ab,aab,aaab,...}, <strong>en</strong><br />
(a ∗ b) ∗ = ({a} ∗ ·{b}) ∗ = {b,ab,aab,aaab,...} ∗ = {λ,b,ab,bb,aab,abb,bab,bbb,...}.<br />
{a,b} ∗ b is de verzameling van alle woord<strong>en</strong> over {a,b} die eindig<strong>en</strong> op e<strong>en</strong> b.<br />
Met e<strong>en</strong> scherpe blik valt in te zi<strong>en</strong> dat (a ∗ b) ∗ = {a,b} ∗ b ∪ {λ}.<br />
Zij K = a ∗ b{a,b} ∗ . Deze taal bestaat uit alle woord<strong>en</strong> over {a,b} die minst<strong>en</strong>s<br />
één symbool b bevatt<strong>en</strong>. Voor het complem<strong>en</strong>t van K (tov. {a,b}) geldt L =
4.1. FORMELE TALEN 33<br />
{a,b} ∗ − K = {x ∈ {a,b} ∗ | x bevat ge<strong>en</strong> b} = a ∗ . Hoewel in deze taal alle<strong>en</strong><br />
letters a voorkom<strong>en</strong>, moet<strong>en</strong> we de taal tov. het alfabet {a,b} beschouw<strong>en</strong> bij het<br />
nem<strong>en</strong> van complem<strong>en</strong>t om de oorspronkelijke taal weer terug te vind<strong>en</strong>.<br />
K = {a,b} · {a,b,0,1} ∗ is de taal van alle Pascal id<strong>en</strong>tifiers (waarbij we ons voor<br />
de e<strong>en</strong>voud tot {a,b,0,1} beperkt hebb<strong>en</strong>).<br />
4.7 Lemma. Laat K,L tal<strong>en</strong> zijn over e<strong>en</strong> alfabet Σ. Dan<br />
(i) K ∗ K = KK ∗ = K + .<br />
(ii) (K ∗ ) n = K ∗ , voor n ≥ 1.<br />
(iii) (K ∗ ) ∗ = K ∗ .<br />
(iv) (K ∗ L ∗ ) ∗ = (K ∪ L) ∗ = (K ∗ ∪ L ∗ ) ∗ .<br />
Bewijs. Ook hier geld<strong>en</strong> algem<strong>en</strong>e eig<strong>en</strong>schapp<strong>en</strong> van monotoniciteit: K ⊆<br />
L impliceert Kn ⊆ Ln <strong>en</strong> K∗ ⊆ L∗ .<br />
(i) Omdat K∗ = <br />
n≥0 Kn , geldt K∗K = <br />
n≥0 KnK = <br />
n≥0(KnK) =<br />
<br />
n≥0(Kn+1 ) = <br />
n≥1(Kn ) = K + .<br />
Hoewel geheel correct, gev<strong>en</strong> we hier liever e<strong>en</strong> ander bewijs. Bov<strong>en</strong>staande<br />
red<strong>en</strong>ering gebruikt dat concat<strong>en</strong>atie distributief is over oneindige ver<strong>en</strong>iging,<br />
iets wat vrijwel gelijk bewez<strong>en</strong> wordt als het geval met ver<strong>en</strong>iging<br />
van twee verzameling<strong>en</strong>, Lemma 4.5.<br />
(ii) Voor n = 1 staat er gelijkheid omdat de eerste macht van e<strong>en</strong> taal gelijk<br />
is aan de taal zelf.<br />
Het geval n = 2 behandel<strong>en</strong> we eerst apart. Neem e<strong>en</strong> willekeurige x ∈ Σ ∗ .<br />
Er geldt: x ∈ K ∗ K ∗ ⇐⇒ x = yz voor zekere x ∈ K ∗ <strong>en</strong> y ∈ K ∗ ⇐⇒ x = yz<br />
voor zekere x ∈ K i <strong>en</strong> y ∈ K j <strong>en</strong> i, j ∈ N ⇐⇒ x ∈ K i ·K j voor zekere i, j ∈ N<br />
⇐⇒ x ∈ K i+ j voor zekere i, j ∈ N ⇐⇒ x ∈ K m voor zekere m ∈ N ⇐⇒<br />
x ∈ K ∗ .<br />
Nu bewijz<strong>en</strong> we de bewering met inductie naar n. De basis hebb<strong>en</strong> we al<br />
gehad.<br />
Voor n ≥ 1 geldt (K ∗ ) n+1 = (K ∗ ) n · K ∗ = K ∗ · K ∗ = K ∗ . Omdat we hier<br />
de gelijkheid K ∗ · K ∗ = K ∗ , dwz. de bewering voor n = 2 steeds expliciet<br />
gebruik<strong>en</strong> is deze apart bewez<strong>en</strong>.<br />
(iii) Uit (ii) hierbov<strong>en</strong>. <br />
In het voorbeeld hierbov<strong>en</strong> staat dat ‘met e<strong>en</strong> scherpe blik valt in te zi<strong>en</strong>’. De<br />
gelijkheid blijkt e<strong>en</strong> gevolg van e<strong>en</strong> algem<strong>en</strong>e regel: (K ∗ L) ∗ = (K ∪ L) ∗ L ∩ {λ}.<br />
E<strong>en</strong> familie van tal<strong>en</strong> F heet geslot<strong>en</strong> onder e<strong>en</strong> bewerking op tal<strong>en</strong>, als die bewerking<br />
toegepast op tal<strong>en</strong> uit de familie F weer altijd e<strong>en</strong> taal uit F oplevert.<br />
De tal<strong>en</strong> die gemaakt kunn<strong>en</strong> word<strong>en</strong> met de bewerking<strong>en</strong> ver<strong>en</strong>iging, concat<strong>en</strong>atie<br />
<strong>en</strong> ster, het<strong>en</strong> de reguliere tal<strong>en</strong>. Formeel is het de kleinste familie van tal<strong>en</strong>
34 HOOFDSTUK 4. TALEN EN AUTOMATEN<br />
die de eindige tal<strong>en</strong> bevat, <strong>en</strong> geslot<strong>en</strong> is onder deze bewerking<strong>en</strong>. Anders gezegd,<br />
met e<strong>en</strong> inductieve definitie:<br />
4.8 Definitie. De familie van reguliere tal<strong>en</strong> REG over e<strong>en</strong> alfabet Σ is gedefinieerd<br />
door<br />
basis. K ∈ REG voor elke eindige taal K over Σ.<br />
inductie. Als K <strong>en</strong> L tal<strong>en</strong> in REG zijn, dan ook K ∪ L, K · L <strong>en</strong> K ∗ in REG. <br />
E<strong>en</strong> reguliere expressie is e<strong>en</strong> string met e<strong>en</strong> speciale syntax <strong>en</strong> e<strong>en</strong> bijbehor<strong>en</strong>de<br />
semantiek. De string bevat symbol<strong>en</strong> die de reuliere operaties voorstell<strong>en</strong>. De<br />
semantiek van e<strong>en</strong> expressie is de bijbehor<strong>en</strong>de reguliere taal. Zie SCHAUM.<br />
Spiegelbeeld. Voor e<strong>en</strong> taal L definiër<strong>en</strong> we het spiegelbeeld van L door mir(L) =<br />
{ mir(x) | x ∈ L }. Merk op dat mir(K · L) = mir(L) · mir(K), analoog aan de gelijkheid<br />
mir(x · y) = mir(y) · mir(x) voor woord<strong>en</strong> x <strong>en</strong> y.<br />
4.9 Stelling.<br />
(i) mir(K ∪ L) = mir(K) ∪ mir(L),<br />
(ii) mir(K · L) = mir(L) · mir(K),<br />
(iii) mir(K ∗ ) = (mir(K)) ∗ . <br />
De reguliere tal<strong>en</strong> (zie Definitie 4.8) zijn per definitie geslot<strong>en</strong> onder ver<strong>en</strong>iging,<br />
concat<strong>en</strong>atie <strong>en</strong> ster. Ze zijn ook geslot<strong>en</strong> onder mir.<br />
4.10 Stelling. De reguliere tal<strong>en</strong> zijn geslot<strong>en</strong> onder de bewerking mir.<br />
Bewijs. Inductie naar de definitie van de reguliere tal<strong>en</strong>.<br />
basis. De bewerking toegepast op e<strong>en</strong> eindige taal levert weer e<strong>en</strong> eindige<br />
taal; die is regulier per definitie.<br />
inductie. Neem aan dat voor de reguliere tal<strong>en</strong> K <strong>en</strong> L de spiegelbeeld<strong>en</strong><br />
mir(K) <strong>en</strong> mir(L) ook regulier zijn (inductie-aanname). Te bewijz<strong>en</strong> is<br />
dat ook mir(K ∪ L), mir(K · L) <strong>en</strong> mir(K ∗ ) regulier zijn. Dat volgt uit de<br />
inductie-aanname <strong>en</strong> de voorgaande stelling. Immers, als mir(K) <strong>en</strong> mir(L)<br />
regulier zijn, dan zijn ook mir(K ∪ L) = mir(K) ∪ mir(L), mir(K · L) =<br />
mir(L) · mir(K), <strong>en</strong> mir(K ∗ ) = (mir(K)) ∗ regulier, omdat zij met toegestane<br />
bewerking<strong>en</strong> uit reguliere tal<strong>en</strong> geconstrueerd zijn. <br />
Het vervolg hieronder, over (inverse) homomorfism<strong>en</strong>, valt buit<strong>en</strong> de t<strong>en</strong>tam<strong>en</strong>stof.
4.1. FORMELE TALEN 35<br />
Homomorfism<strong>en</strong>. Laat Σ <strong>en</strong> Δ twee alfabett<strong>en</strong> zijn. E<strong>en</strong> homomorfisme is e<strong>en</strong><br />
afbeelding h : Σ → Δ ∗ die in woord<strong>en</strong> over Σ elke letter op gelijke wijze vervangt<br />
door e<strong>en</strong> woord uit Δ ∗ . We zull<strong>en</strong> dit stapsgewijs definiër<strong>en</strong>.<br />
h : Σ → Δ ∗ wordt uitgebreid tot woord<strong>en</strong> (h : Σ ∗ → Δ ∗ ) volg<strong>en</strong>s<br />
h(λ) = λ, h(xa) = h(x) · h(a) voor x ∈ Σ ∗ , a ∈ Σ.<br />
Dit betek<strong>en</strong>t dat h(a1 ···an) = h(a1) · ... · h(an) voor ai ∈ Σ, <strong>en</strong> in het algeme<strong>en</strong><br />
voor x,y ∈ Σ ∗ geldt h(x · y) = h(x) · h(y).<br />
We breid<strong>en</strong> h uit tot tal<strong>en</strong> door woord voor woord te vervang<strong>en</strong>: h(K) = {h(x) |<br />
x ∈ K}.<br />
4.11 Voorbeeld. Σ = {a,b,c} <strong>en</strong> Δ = {0,1}. Laat h : Σ → Δ ∗ gegev<strong>en</strong> zijn door:<br />
h(a) = 10,h(b) = 100,h(c) = 010. Dan<br />
h(bbacaa) = 100 · 100 · 10 · 010 · 10 · 10 = (100) 3 (10) 3 .<br />
Ev<strong>en</strong>zo geldt dat h(acccaa) = 10 · 010 · 010 · 010 · 10 · 10 = (100) 3 (10) 3 .<br />
Laat K ⊆ Σ ∗ de taal {bac n a n | n ∈ N} zijn. Dan h(K) = {h(bac n a n ) | n ∈ N} =<br />
{100 · 10 · (010) n · (10) n | n ∈ N} = {(100) n+1 · (10) n+1 | n ∈ N}.<br />
Inverse homomorfism<strong>en</strong>. Net als bij elke functie kunn<strong>en</strong> we ook kijk<strong>en</strong> naar de<br />
inverse van e<strong>en</strong> homomorfisme, dwz. naar de verzameling van woord<strong>en</strong> die op e<strong>en</strong><br />
gegev<strong>en</strong> verzameling afgebeeld word<strong>en</strong>: voor h : Σ ∗ → Δ ∗ , <strong>en</strong> L ⊆ Δ ∗ definiër<strong>en</strong><br />
we h −1 (L) = {x ∈ Σ ∗ | h(x) ∈ L}. In het algemee<strong>en</strong> is h −1 ge<strong>en</strong> functie. We<br />
vervolg<strong>en</strong> het voorbeeld.<br />
4.12 Voorbeeld. Laat L = {(100) n (10) n | n ∈ N}. We hebb<strong>en</strong> al gezi<strong>en</strong> dat de taal<br />
K = {bac n a n | n ∈ N} afgebeeld wordt in L: h(K) ⊆ L. Er geldt daarom dat K ⊆<br />
h −1 (L). h −1 (L) bestaat echter uit meer woord<strong>en</strong>, ook bbacaa <strong>en</strong> acccaa behor<strong>en</strong><br />
ertoe. Om h −1 (L) volledig te vind<strong>en</strong> moet<strong>en</strong> we woord<strong>en</strong> ‘ontled<strong>en</strong>’; we do<strong>en</strong> dit<br />
van links naar rechts. Als voorbeeld kijk<strong>en</strong> we naar het woord (100) 3 (10) 3 .<br />
100.100.100.10.10.10 ← b.b.b.a.a.a<br />
100.100.10.010.10.10 ← b.b.a.c.a.a<br />
100.10.010.010.10.10 ← b.a.c.c.a.a<br />
10.010.010.010.10.10 ← a.c.c.c.a.a<br />
Aan de hand hiervan vermoed<strong>en</strong> we dat<br />
h −1 (L) = {λ} ∪ { b k ac n−k a n−1 | n ≥ 1,0 ≤ k ≤ n }.
36 HOOFDSTUK 4. TALEN EN AUTOMATEN<br />
4.2 Eindige Automat<strong>en</strong><br />
⊲ SCHAUM §12.5: Finite State Automata<br />
De automat<strong>en</strong> in SCHAUM zijn volg<strong>en</strong>s de gegev<strong>en</strong> definitie altijd deterministisch.<br />
We gev<strong>en</strong> hier e<strong>en</strong> wat algem<strong>en</strong>ere formulering. Het pomplemma SCHAUM p. 309<br />
behandel<strong>en</strong> we niet.<br />
4.2.1 Inleiding<br />
Gerichte graf<strong>en</strong> zijn e<strong>en</strong> goed middel om de werking van bepaalde system<strong>en</strong> weer<br />
te gev<strong>en</strong>. De toestand<strong>en</strong> van het systeem corresponder<strong>en</strong> dan met de punt<strong>en</strong> uit<br />
de graaf, de overgang<strong>en</strong> van e<strong>en</strong> toestand naar e<strong>en</strong> andere met de pijl<strong>en</strong> uit de<br />
graaf. De graaf di<strong>en</strong>t als model van het systeem, <strong>en</strong> kan gebruikt word<strong>en</strong> om het<br />
systeem te analyser<strong>en</strong> of te simuler<strong>en</strong>. De graaf kan nog verder versierd word<strong>en</strong>:<br />
de takk<strong>en</strong> kunn<strong>en</strong> nam<strong>en</strong> krijg<strong>en</strong> om de acties van het systeem weer te gev<strong>en</strong>, <strong>en</strong><br />
ev<strong>en</strong>zo kunn<strong>en</strong> we de punt<strong>en</strong> voorzi<strong>en</strong> van nadere informatie over de toestand. We<br />
kunn<strong>en</strong> bijvoorbeeld de aanvangstoestand van het systeem marker<strong>en</strong>, of toestand<br />
waarin het systeem stabiel is (wat dat ook moge betek<strong>en</strong><strong>en</strong>).<br />
4.13 Voorbeeld. We modeller<strong>en</strong> e<strong>en</strong> systeem, met acties a <strong>en</strong> b dat als e<strong>en</strong>-nalaatste<br />
actie (voor het stopp<strong>en</strong>) e<strong>en</strong> actie a doet. In de initiële toestand mag elke<br />
actie gedaan word<strong>en</strong>, alvor<strong>en</strong>s terug te ker<strong>en</strong> in die toestand. Voor terminatie van<br />
het systeem moet de actie a gedaan word<strong>en</strong>, daarna e<strong>en</strong> willekeurige actie, <strong>en</strong> we<br />
stopp<strong>en</strong>.<br />
Het plaatje hieronder links beschrijft dit gedrag. Het geeft ge<strong>en</strong> algoritme om van<br />
e<strong>en</strong> string over {a,b}, ‘on the fly’ van links naar rechts lez<strong>en</strong>d, te bepal<strong>en</strong> of die<br />
string als e<strong>en</strong>-na-laatste actie e<strong>en</strong> a had. De gegev<strong>en</strong> graaf laat ons in toestand 1 de<br />
keuze om bij actie a de tak (1,a,1) te kiez<strong>en</strong> of de tak (1,a,2). Dit werkt alle<strong>en</strong> als<br />
we van te vor<strong>en</strong> wet<strong>en</strong> wanneer we aan de e<strong>en</strong>-na-laatste actie zijn toegekom<strong>en</strong>.<br />
Voor e<strong>en</strong> algoritmische methode moet<strong>en</strong> we steeds de twee laatste letters onthoud<strong>en</strong>,<br />
zodat we op elk mom<strong>en</strong>t kunn<strong>en</strong> besluit<strong>en</strong> of de reeds gelez<strong>en</strong> string e<strong>en</strong><br />
juiste actie-reeks beschrijft. Dit geeft het tweede plaatje.<br />
a,b<br />
a a,b<br />
1 2 3<br />
b<br />
ab<br />
b<br />
b<br />
b<br />
a<br />
aa<br />
a<br />
bb a ba<br />
a
4.2. EINDIGE AUTOMATEN 37<br />
4.2.2 Definities<br />
E<strong>en</strong> eindige automaat is niets anders dan e<strong>en</strong> gerichte multigraaf met labels op de<br />
pijl<strong>en</strong>; de gelabelde gerichte graaf SCHAUM p.202. Hier zijn de reële gewicht<strong>en</strong><br />
echter vervang<strong>en</strong> door symbol<strong>en</strong>, e<strong>en</strong> abstractie van de ‘acties’ van de gemodelleerde<br />
system<strong>en</strong>. De gerichte graaf is bov<strong>en</strong>di<strong>en</strong> voorzi<strong>en</strong> van e<strong>en</strong> speciaal beginpunt<br />
<strong>en</strong> e<strong>en</strong> verzameling eindpunt<strong>en</strong>.<br />
4.14 Definitie. E<strong>en</strong> eindige automaat is e<strong>en</strong> vijf-tupel A = (Q,Σ,E,qin,F), waarbij<br />
• Q e<strong>en</strong> eindige, niet-lege, verzameling toestand<strong>en</strong>,<br />
• Σ e<strong>en</strong> alfabet,<br />
• E ⊆ Q × Σ × Q e<strong>en</strong> verzameling takk<strong>en</strong>,<br />
• qin ∈ Q de begintoestand,<br />
• F ⊆ Q de verzameling eindtoestand<strong>en</strong>. <br />
4.15 Voorbeeld. De automat<strong>en</strong> uit het vorige voorbeeld word<strong>en</strong> als volgt gespecificeerd:<br />
Q = { 1,2,3 }, Σ = { 0,1 },<br />
E = { (1,0,1),(1,1,1),(1,0,2),(2,0,3),(2,1,3) },<br />
qin = 1, F = { 3 },<br />
respectievelijk:<br />
Q = { 11,10,01,00 }, Σ = { 0,1 },<br />
E = { (i j,k, jk) | i, j,k ∈ {0,1} }<br />
qin = 11, F = { 01,00 }.<br />
De graaf-repres<strong>en</strong>tatie die we gebruik<strong>en</strong> is duidelijk. Toestand<strong>en</strong> corresponder<strong>en</strong><br />
met punt<strong>en</strong>, <strong>en</strong> takk<strong>en</strong> (toestandsovergang<strong>en</strong>) corresponder<strong>en</strong> met pijl<strong>en</strong> voorzi<strong>en</strong><br />
van e<strong>en</strong> label. De begintoestand heeft e<strong>en</strong> pijltje ter onderscheiding, de eindtoestand<strong>en</strong><br />
e<strong>en</strong> dubbele cirkel .<br />
De tak (p,a,q) uit E loopt van p naar q met label a. De begripp<strong>en</strong> wandeling<br />
<strong>en</strong> cykel zijn voor de hand ligg<strong>en</strong>de g<strong>en</strong>eralisaties van de begripp<strong>en</strong> voor gerichte<br />
graf<strong>en</strong>. Het zijn reeks<strong>en</strong> aane<strong>en</strong>geschakelde pijl<strong>en</strong> (takk<strong>en</strong>, toestandsovergang<strong>en</strong>)<br />
hier voorzi<strong>en</strong> van e<strong>en</strong> label.<br />
De wandeling π = (p0,a1, p1)(p1,a2, p2)...(pn−1,an, pn) noter<strong>en</strong> we ook wel als<br />
a1 a2<br />
an<br />
π = p0 → p1 → p2 ... pn−1 → pn. We zegg<strong>en</strong> dat deze wandeling loopt van p0<br />
naar pn, met label a1a2 ...an; zij heeft l<strong>en</strong>gte n.<br />
De taal bij e<strong>en</strong> automaat bestaat uit de labels afgelez<strong>en</strong> langs wandeling<strong>en</strong> van<br />
begin- naar eindtoestand.
38 HOOFDSTUK 4. TALEN EN AUTOMATEN<br />
4.16 Definitie. Zij A = (Q,Σ,E,qin,F) e<strong>en</strong> eindige automaat. De taal van A ,<br />
g<strong>en</strong>oteerd L(A ) is de verzameling<br />
{ w ∈ Σ ∗ | er is e<strong>en</strong> wandeling van qin naar e<strong>en</strong> toestand in F met label w }<br />
Het begrip wandeling kunn<strong>en</strong> we ook op e<strong>en</strong> inductieve manier definier<strong>en</strong>, net als<br />
de afsluiting van e<strong>en</strong> relatie, net als de ster van e<strong>en</strong> taal (bladzijde 32).<br />
Zij A = (Q,Σ,E,qin,F) e<strong>en</strong> eindige automaat. Gebaseerd op de éénstaps-relatie<br />
E ⊆ Q × Σ × Q (‘van p naar q met label a’) mak<strong>en</strong> we daar als volgt wandeling<strong>en</strong><br />
van:<br />
(i) (q,λ,q) ∈ E ∗ voor elke q ∈ Q,<br />
(ii) als (p,x,q) ∈ E ∗ <strong>en</strong> (q,a,r) ∈ E, dan (p,xa,r) ∈ E ∗<br />
(iii) E ∗ bevat ge<strong>en</strong> drietall<strong>en</strong> anders dan die met (i) <strong>en</strong> (ii) gevond<strong>en</strong>.<br />
Nu geldt (p,x,q) ∈ E∗ desdals er e<strong>en</strong> wandeling is van p naar q met label x. Als<br />
alternatief kunn<strong>en</strong> ook de macht<strong>en</strong> En , n-staps verbinding<strong>en</strong>, g<strong>en</strong>om<strong>en</strong> word<strong>en</strong> <strong>en</strong><br />
dan E∗ = <br />
n≥0 En . De drie begripp<strong>en</strong>, wandeling, E∗ inductief, E∗ als oneindige<br />
ver<strong>en</strong>iging, zijn allemaal equival<strong>en</strong>t. Dat zou (net als vergelijkbare definities voor<br />
de ster K∗ van e<strong>en</strong> taal K, of de afsluiting R∗ van e<strong>en</strong> binaire relatie, Definitie 1.5)<br />
formeel bewez<strong>en</strong> kunn<strong>en</strong> word<strong>en</strong> met inductie (natuurlijk).<br />
4.17 Opmerking. De notatie hier is dubbelzinnig. De takk<strong>en</strong> van de automaat E<br />
vorm<strong>en</strong> <strong>en</strong>erzijds de e<strong>en</strong>staps-relatie E ⊆ Q × Σ × Q <strong>en</strong> bepal<strong>en</strong> de relatie E ∗ die<br />
het effect van wandeling<strong>en</strong> sam<strong>en</strong>vat. In Voorbeeld 4.13, rechter automaat, vind<strong>en</strong><br />
we bijvoorbeeld (bb,aaaba,ba) ∈ E ∗ omdat er e<strong>en</strong> wandeling bb a → ba a → aa a →<br />
aa b → ab a → ba is van toestand bb naar toestand ba met label aaaba.<br />
Anderzijds vorm<strong>en</strong> de takk<strong>en</strong> e<strong>en</strong> eindige, niet-lege, verzameling, e<strong>en</strong> alfabet.<br />
Daarmee is E ∗ de verzameling van alle strings over E. In het voorbeeld is (ba,a,aa)<br />
(aa,a,aa)(bb,a,ba)(ab,b,bb) zo’n string. Let wel, deze string stelt ge<strong>en</strong> wandeling<br />
voor!<br />
Dit is wat informatici overloading noem<strong>en</strong>, dubbelzinnige notatie waarvan uit de<br />
context moet blijk<strong>en</strong> welke betek<strong>en</strong>is zij heeft. <br />
4.2.3 Voorbeeld<strong>en</strong><br />
Laatste <strong>en</strong> eerste letter. Automaat voor de taal<br />
{ x ∈ {a,b} ∗ | de eerste letter van x is gelijk aan de laatste letter van x }. De automaat<br />
onthoudt als het ware de eerste letter die langs de wandeling gelez<strong>en</strong> wordt,<br />
<strong>en</strong> mag daarna alle<strong>en</strong> eindig<strong>en</strong> wanneer de laatste letter op de wandeling daaraan<br />
gelijk is. Twee versies, beschrijv<strong>en</strong>d <strong>en</strong> algoritmisch.
a,b<br />
4.2. EINDIGE AUTOMATEN 39<br />
b<br />
b<br />
1 2<br />
0<br />
a,b<br />
a<br />
a<br />
3<br />
a<br />
b<br />
a b<br />
a,b ba<br />
b<br />
bb<br />
b a<br />
aa<br />
b<br />
ab<br />
a<br />
a<br />
Deelwoord. De taal van alle woord<strong>en</strong> over {a,b} met deelwoord aab,<br />
{a,b} ∗ { aab }{a,b} ∗ , beschrijv<strong>en</strong>d <strong>en</strong> algoritmisch.<br />
a,b a,b<br />
a<br />
λ a<br />
a<br />
aa<br />
b<br />
aab<br />
b<br />
a<br />
λ a<br />
a<br />
aa<br />
b<br />
aab<br />
Tell<strong>en</strong>. Met e<strong>en</strong> eindige automaat kunn<strong>en</strong> we niet onbeperkt tell<strong>en</strong>, zoals we in<br />
Stellling 4.21 zull<strong>en</strong> zi<strong>en</strong>, we hebb<strong>en</strong> t<strong>en</strong>slotte maar e<strong>en</strong> eindig aantal toestand<strong>en</strong><br />
tot onze beschikking.<br />
Tell<strong>en</strong> modulo e<strong>en</strong> constante (<strong>Hoofdstuk</strong> 3.1) lukt wel. We gev<strong>en</strong> automat<strong>en</strong> voor<br />
{ w ∈ {a,b} ∗ | #a(w) − #b(w) = 0 (mod 4) }, <strong>en</strong><br />
{ w ∈ {a,b} ∗ | #a(w) = 0 (mod 4) }.<br />
a<br />
a<br />
1 2<br />
b b b<br />
b<br />
a<br />
0 3 b 0 a 3 b<br />
a<br />
Echt modulo-rek<strong>en</strong><strong>en</strong> met de repres<strong>en</strong>tatie van e<strong>en</strong> getal gebeurt in het volg<strong>en</strong>de<br />
voorbeeld.<br />
b<br />
a<br />
b 1 2 b<br />
Modulo rek<strong>en</strong><strong>en</strong>. Voor w ∈ {0,1} ∗ bepal<strong>en</strong> we val(w) als de waarde die de<br />
string heeft, gelez<strong>en</strong> als binair getal. Dus, val : {0,1} ∗ → N is e<strong>en</strong> functie, inductief<br />
gedefinieerd door<br />
(i) val(λ) = 0,<br />
(ii) val(x0) = 2val(x),<br />
val(x1) = 2val(x) + 1, voor x ∈ {0,1} ∗ .<br />
a<br />
a<br />
a<br />
a,b
40 HOOFDSTUK 4. TALEN EN AUTOMATEN<br />
We bepal<strong>en</strong> e<strong>en</strong> automaat voor de taal { x ∈ {0,1} ∗ | val(x) = 0 (mod 3) }.<br />
De toestand<strong>en</strong> van de automaat zijn de restklass<strong>en</strong> 0,1,2. E<strong>en</strong> langs e<strong>en</strong> wandeling<br />
gelez<strong>en</strong> woord eindigt in de juiste restklasse. Dat kan door te zorg<strong>en</strong> dat elke tak<br />
de juiste berek<strong>en</strong>ing volgt, nl. (i,0,2i) <strong>en</strong> (i,1,2i + 1)<br />
4.2.4 Determinisme<br />
0<br />
1<br />
0 1 2<br />
1 0<br />
E<strong>en</strong> eindige automaat bepaalt e<strong>en</strong> algoritme dat voor e<strong>en</strong> woord na gaat of dit tot<br />
de taal behoort als er vanuit elke toestand voor elke letter precies één uitgaande<br />
tak met die letter is. We kunn<strong>en</strong> dan de unieke wandeling bij het woord volg<strong>en</strong><br />
om zo aan de laatste toestand het antwoord af te lez<strong>en</strong>.<br />
We formaliser<strong>en</strong> dat als volgt.<br />
4.18 Definitie. E<strong>en</strong> eindige automaat A = (Q,Σ,E,qin,F) heet (totaal) deterministisch<br />
als E e<strong>en</strong> functie van Q × Σ naar Q is. <br />
Als voorhe<strong>en</strong> kunn<strong>en</strong> we E uitbreid<strong>en</strong> tot e<strong>en</strong> relatie E ∗ in Q × Σ ∗ × Q. Bij<br />
e<strong>en</strong> deterministische automaat is dit e<strong>en</strong> functie (van Q × Σ ∗ naar Q). Voor elke<br />
(q,w) ∈ Q × Σ ∗ geeft E ∗ (q,w) de eindtoestand van de unieke wandeling met<br />
label w beginn<strong>en</strong>d in q. De taal van de automaat kunn<strong>en</strong> we nu schrijv<strong>en</strong> als<br />
{ w ∈ Σ ∗ | E ∗ (qin,w) ∈ F }.<br />
4.19 Voorbeeld. De rechter automaat uit Voorbeeld 4.13 is deterministisch. Als<br />
functie geschrev<strong>en</strong> hebb<strong>en</strong> we de volg<strong>en</strong>de takk<strong>en</strong>: E(i j,k) = jk voor alle i j ∈ Q<br />
<strong>en</strong> alle k ∈ Σ. In tabelvorm vind<strong>en</strong> we bij elke toestand i j <strong>en</strong> elke letter k e<strong>en</strong><br />
uitgaande tak naar de toestand volg<strong>en</strong>s:<br />
1<br />
i j : 11 10 01 00<br />
k : 0 10 00 10 00<br />
1 11 01 11 01<br />
Correctheid. E<strong>en</strong> automaat legt e<strong>en</strong> taal vast. Wanneer we bij e<strong>en</strong> gegev<strong>en</strong> taal<br />
e<strong>en</strong> automaat construer<strong>en</strong>, moet<strong>en</strong> we er ons van vergewiss<strong>en</strong> dat deze automaat<br />
1
4.2. EINDIGE AUTOMATEN 41<br />
inderdaad de gevraagde taal heeft. E<strong>en</strong> methode om dit te do<strong>en</strong> is om e<strong>en</strong> geschikte<br />
eig<strong>en</strong>schap van E ∗ (de relatie tuss<strong>en</strong> woord<strong>en</strong> <strong>en</strong> eindpunt van bijbehor<strong>en</strong>de<br />
wandeling<strong>en</strong>) inductief te bewijz<strong>en</strong>.<br />
Als we het idee k<strong>en</strong>n<strong>en</strong> waarmee de automaat ontworp<strong>en</strong> is, dan is het bewijs vaak<br />
e<strong>en</strong> e<strong>en</strong>voudige oef<strong>en</strong>ing. We gev<strong>en</strong> dan e<strong>en</strong> k<strong>en</strong>merk<strong>en</strong>de eig<strong>en</strong>schap voor de<br />
woord<strong>en</strong> die in elke toestand eindig<strong>en</strong> via e<strong>en</strong> wandeling vanuit de begintoestand<br />
<strong>en</strong> lat<strong>en</strong> dan zi<strong>en</strong> dat die eig<strong>en</strong>schap behoud<strong>en</strong> blijft door het volg<strong>en</strong> van de takk<strong>en</strong>.<br />
Voor deterministische automat<strong>en</strong> is die aanpak het e<strong>en</strong>voudigst: elk woord eindigt<br />
in precies één toestand. Bij beschrijv<strong>en</strong>de automat<strong>en</strong> kunn<strong>en</strong> er alternatiev<strong>en</strong> voor<br />
de wandeling zijn, <strong>en</strong> ook kunnn<strong>en</strong> er woord<strong>en</strong> zijn waar ge<strong>en</strong> wandeling voor<br />
bestaat (weg<strong>en</strong>s het ontbrek<strong>en</strong> van geschikte takk<strong>en</strong>).<br />
Het is natuurlijk niet altijd nodig om e<strong>en</strong> compleet bewijs met volledige inductie<br />
te gev<strong>en</strong>. E<strong>en</strong> korte uitleg, <strong>en</strong> e<strong>en</strong> beroep op het gezonde verstand do<strong>en</strong> wonder<strong>en</strong>.<br />
4.20 Voorbeeld. Hierbov<strong>en</strong> werd e<strong>en</strong> (deterministische) automaat voor de taal<br />
L = { x ∈ {0,1} ∗ | val(x) = 0 (mod 3) } gegev<strong>en</strong> door de volg<strong>en</strong>de takk<strong>en</strong>:<br />
i : 0 1 2<br />
a : 0 0 2 1<br />
1 1 0 2<br />
We ton<strong>en</strong> correctheid van de automaat aan, door de volg<strong>en</strong>de eig<strong>en</strong>schap inductief<br />
te bewijz<strong>en</strong>.<br />
Bewering. Voor x ∈ { 0,1 } ∗ , E ∗ (0,x) = i desdals val(x) = i (mod 3).<br />
Bewijs. Inductie naar x.<br />
basis. Voor x = λ, dan <strong>en</strong>erzijds E ∗ (0,λ) = 0, per definitie (van E ∗ ), terwijl<br />
anderzijds val(λ) = 0 (mod 3), alweer per definitie (van val ditmaal).<br />
inductiestap. We nem<strong>en</strong> aan dat de bewering klopt voor x. We ton<strong>en</strong> met<br />
behulp hiervan de bewering voor x0 <strong>en</strong> x1 aan.<br />
Voor letter 0 bevat de automaat de takk<strong>en</strong> (0,0,0), (1,0,2), <strong>en</strong> (2,0,1).<br />
Anderzijds geldt voor x0 de gelijkheid val(x0) = 2val(x).<br />
Door de drie mogelijkhed<strong>en</strong> voor val(x) (mod 3) te onderscheid<strong>en</strong>, zi<strong>en</strong><br />
we dat de bewering voor x0 ook geldt.<br />
val(x) E ∗ (0,x) tak E ∗ (0,x0) val(x0)<br />
0 (mod 3) 0 (0,0,0) 0 2 · 0 = 0 (mod 3)<br />
1 (mod 3) 1 (1,0,2) 2 2 · 1 = 2 (mod 3)<br />
2 (mod 3) 2 (2,0,1) 1 2 · 2 = 1 (mod 3)<br />
De midelste regel van de tabel, bijvoorbeeld, wordt als volgt gelez<strong>en</strong>: Als<br />
val(x) = 1 (mod 3) dan is E ∗ (,x) = { 1 } volg<strong>en</strong>s de inductieveronderstelling.<br />
De <strong>en</strong>ige tak met label 0 die deze toestand 1 verlaat is (1,0,2), zodat
42 HOOFDSTUK 4. TALEN EN AUTOMATEN<br />
E ∗ (,x0) = { 2 }. Anderzijds is val(x0) volg<strong>en</strong>s de inductieve definitie gelijk<br />
aan 2val(x) = 2.<br />
E<strong>en</strong> vergelijkbare tabel kan opgesteld word<strong>en</strong> voor x1, dwz. de verl<strong>en</strong>ging<br />
van x met letter 1.<br />
val(x) E ∗ (0,x) tak E ∗ (0,x1) val(x1)<br />
0 (mod 3) 0 (0,1,1) 1 2 · 0 + 1 = 1 (mod 3)<br />
1 (mod 3) 1 (1,1,0) 0 2 · 1 + 1 = 0 (mod 3)<br />
2 (mod 3) 2 (2,1,2) 2 2 · 2 + 1 = 2 (mod 3)<br />
4.2.5 Repres<strong>en</strong>teerbare tal<strong>en</strong><br />
De tal<strong>en</strong> die vastgelegd word<strong>en</strong> door e<strong>en</strong> eindige automaat het<strong>en</strong> repres<strong>en</strong>teerbaar.<br />
Ze vorm<strong>en</strong> e<strong>en</strong> verzameling, of liever gezegd, e<strong>en</strong> familie tal<strong>en</strong>, g<strong>en</strong>oteerd<br />
met REP. Over de familie REP is vrij veel bek<strong>en</strong>d: afsluitingseig<strong>en</strong>schapp<strong>en</strong><br />
(operaties die op tal<strong>en</strong> in REP toegepast mog<strong>en</strong> word<strong>en</strong> <strong>en</strong> dan tot e<strong>en</strong> andere taal<br />
uit REP leid<strong>en</strong>) <strong>en</strong> alternatieve karakterisaties van tal<strong>en</strong> uit REP.<br />
Niet élke taal behoort tot REP, dwz. niet elke taal heeft e<strong>en</strong> pass<strong>en</strong>de eindige<br />
automaat. (Er geldt zelfs REP is aftelbaar, terwijl P(Σ ∗ ) dat niet is.) Intuitief<br />
kunn<strong>en</strong> we met e<strong>en</strong> eindig aantal toestand<strong>en</strong> niet e<strong>en</strong> oneindig aantal ess<strong>en</strong>tieel<br />
verschill<strong>en</strong>de strings uit elkaar houd<strong>en</strong>. We bewijz<strong>en</strong> nu SCHAUM Example 12.8<br />
zónder het pomplemma te gebruik<strong>en</strong>.<br />
4.21 Stelling. { a n b n | n ∈ N } /∈ REP.<br />
Bewijs. Bewijs door middel van teg<strong>en</strong>spraak. Neem aan dat K = { a n b n |<br />
n ∈ N } wél door e<strong>en</strong> eindige automaat gerepres<strong>en</strong>teerd kan word<strong>en</strong>, <strong>en</strong> laat<br />
N het aantal toestand<strong>en</strong> van zo’n automaat zijn.<br />
Voor elk woord a n b n (n ∈ N) is er e<strong>en</strong> wandeling van qin naar e<strong>en</strong> toestand in<br />
F. Neem zo’n wandeling (het kunn<strong>en</strong> er meer zijn) voor a N b N <strong>en</strong> bekijk de<br />
toestand<strong>en</strong> op de eerste helft van de wandeling qin = q0 a → q1 a → q2 ... a → qN.<br />
Er zijn hier N + 1 toestand<strong>en</strong>, terwijl de automaat er N heeft. Er moet dus<br />
t<strong>en</strong>minste één toestand dubbel voorkom<strong>en</strong>; de wandeling bevat e<strong>en</strong> geslot<strong>en</strong><br />
wandeling. We kunn<strong>en</strong> dit geslot<strong>en</strong> deel uit de wandeling voor a N b N snijd<strong>en</strong><br />
(vgl. SCHAUMThm 8.2) <strong>en</strong> we houd<strong>en</strong> zo e<strong>en</strong> wandeling over van qin naar<br />
e<strong>en</strong> toestand in F voor e<strong>en</strong> woord a m b N met m < N.<br />
Dit betek<strong>en</strong>t dat dit woord ook tot de taal van de automaat behoort terwijl<br />
a m b N /∈ K.<br />
Teg<strong>en</strong>spraak.
4.2. EINDIGE AUTOMATEN 43<br />
Zonder bewijs gev<strong>en</strong> we belangrijke resultat<strong>en</strong> over eindige automat<strong>en</strong>, zie Fundam<strong>en</strong>tele<br />
Informatica 2. Allereerst blijkt e<strong>en</strong> willekeurige ‘beschrijv<strong>en</strong>de’ automaat<br />
in e<strong>en</strong> deterministische ‘algoritmische’ automaat omgezet te kunn<strong>en</strong> word<strong>en</strong>.<br />
Verder zijn de eindige automat<strong>en</strong> equival<strong>en</strong>t aan de reguliere expressies: ze<br />
specificer<strong>en</strong> dezelfde familie van tal<strong>en</strong>.<br />
4.22 Stelling.<br />
a. Gegev<strong>en</strong> e<strong>en</strong> eindige automaat kan e<strong>en</strong> deterministische eindige automaat<br />
geconstrueerd word<strong>en</strong> voor dezelfde taal.<br />
b. De familie van eindige automaattal<strong>en</strong> is gelijk aan de familie van tal<strong>en</strong> die<br />
met de operaties ver<strong>en</strong>iging, concat<strong>en</strong>atie <strong>en</strong> ster uit eindige tal<strong>en</strong> verkreg<strong>en</strong> word<strong>en</strong>,<br />
REP = REG. <br />
Als praktische oef<strong>en</strong>ing voor b. zull<strong>en</strong> we op het werkcollege e<strong>en</strong> aantal ker<strong>en</strong> de<br />
taal van e<strong>en</strong> automaat (REP) schrijv<strong>en</strong> met de operaties ver<strong>en</strong>iging, concat<strong>en</strong>atie<br />
<strong>en</strong> ster (REG). E<strong>en</strong> systematische aanpak wordt behandeld in Fundam<strong>en</strong>tele<br />
Informatica 2.
44 HOOFDSTUK 4. TALEN EN AUTOMATEN<br />
4.3 Turing Machine<br />
Tekst ooit geschrev<strong>en</strong> voor e<strong>en</strong> ander doel, alle<strong>en</strong> voor liefhebbers.<br />
Om te kunn<strong>en</strong> vergelijk<strong>en</strong> hoe efficiënt algoritm<strong>en</strong> zijn, moet<strong>en</strong> we ze uitvoer<strong>en</strong><br />
onder vergelijkbare omstandighed<strong>en</strong>, <strong>en</strong> in ieder geval op dezelfde computer. Het<br />
zou mooi zijn als er e<strong>en</strong> algeme<strong>en</strong> aanvaarde standaard architectuur gekoz<strong>en</strong> kon<br />
word<strong>en</strong>, zodat nieuwe algoritm<strong>en</strong> vergelek<strong>en</strong> kunn<strong>en</strong> word<strong>en</strong> met oude resultat<strong>en</strong><br />
in de literatuur versch<strong>en</strong><strong>en</strong>. Zo’n architectuur bestaat, <strong>en</strong> is in feite ge<strong>en</strong> electronisch<br />
rek<strong>en</strong>apparaat, maar e<strong>en</strong> wiskundig model. Dit model, de Turing Machine,<br />
werd opgesteld door de Britse wiskundige Alan Turing omdat deze wilde red<strong>en</strong>er<strong>en</strong><br />
over mogelijkhed<strong>en</strong> <strong>en</strong> onmogelijkhed<strong>en</strong> van de Algoritmiek, het oploss<strong>en</strong><br />
van problem<strong>en</strong> aan de hand van vaste recept<strong>en</strong>. Turing deed e<strong>en</strong> fundam<strong>en</strong>tele<br />
ontdekking: er zijn simpel te formuler<strong>en</strong> problem<strong>en</strong> waarvoor ge<strong>en</strong> algoritmisch<br />
recept bestaat. E<strong>en</strong> wonderlijk resultaat, vooral als we ons realizer<strong>en</strong> dat deze<br />
ontdekking stamt van vóór de tweede wereldoorlog, dus van voor de bouw van de<br />
eerste computers. Turings machine is daarmee niet alle<strong>en</strong> e<strong>en</strong> standaard machine<br />
om de complexiteit van algoritm<strong>en</strong> aan te ijk<strong>en</strong>, maar is allereerst e<strong>en</strong> fundam<strong>en</strong>teel<br />
model dat ons inzicht geeft in de mogelijkhed<strong>en</strong> van de computer. Hoewel de<br />
machine heel simpel van structuur is, is iedere<strong>en</strong> er van overtuigd dat elk computer<br />
algoritme tot e<strong>en</strong> programma voor de Turing Machine valt over te zett<strong>en</strong>. Dit kan<br />
niet bewez<strong>en</strong> word<strong>en</strong>, daarvoor ontbreekt e<strong>en</strong> waterdichte definitie van het begrip<br />
computer. Totdat anders aangetoond is blijft de Turing Machine de maat voor wat<br />
berek<strong>en</strong>baar is met behulp van programmeerbare computers.<br />
De Turing Machine is gebaseerd op het idee dat e<strong>en</strong> algoritme door e<strong>en</strong> (mechanische)<br />
klerk uitgevoerd moet kunn<strong>en</strong> word<strong>en</strong>. De klerk heeft e<strong>en</strong> onuitputtelijke<br />
voorraad papier waarop aantek<strong>en</strong>ing<strong>en</strong> gemaakt kunn<strong>en</strong> word<strong>en</strong> om tijd<strong>en</strong>s de<br />
verdere berek<strong>en</strong>ing te kunn<strong>en</strong> raadpleg<strong>en</strong>. De rek<strong>en</strong>stapp<strong>en</strong> die de klerk maakt<br />
moet<strong>en</strong> van te vor<strong>en</strong> strikt vastgelegd word<strong>en</strong> in e<strong>en</strong> programma, bestaande uit<br />
e<strong>en</strong> eindig aantal rek<strong>en</strong>regels, instructies. De klerk onthoudt waar hij mee bezig<br />
is, maar heeft slechts e<strong>en</strong> beperkte, eindige, geheug<strong>en</strong> capaciteit. Hij raadpleegt<br />
steeds de instructies om zijn volg<strong>en</strong>de aktie te bepal<strong>en</strong>, gebaseerd op zijn aantek<strong>en</strong>ing<strong>en</strong><br />
<strong>en</strong> zijn geheug<strong>en</strong>toestand.<br />
Hieronder e<strong>en</strong> plaatje van de machine zoals door Turing voorgesteld. We zi<strong>en</strong> e<strong>en</strong><br />
besturingse<strong>en</strong>heid die e<strong>en</strong> leeskop langs e<strong>en</strong> invoertape kan beweg<strong>en</strong>. De toestand<br />
die de besturingse<strong>en</strong>heid onthoudt, komt overe<strong>en</strong> met het beperkte beschikbare<br />
geheug<strong>en</strong>. Die toestand kan slechts e<strong>en</strong> van te vor<strong>en</strong> vastgelegd aantal waard<strong>en</strong><br />
aannem<strong>en</strong> (<strong>en</strong> dat is dus slechts e<strong>en</strong> eindig aantal, dat echter per Turing Machine<br />
kan variër<strong>en</strong>). De invoertape bestaat uit e<strong>en</strong> aane<strong>en</strong>gereg<strong>en</strong> aantal vakjes of cell<strong>en</strong>,<br />
die elk e<strong>en</strong> symbool bevatt<strong>en</strong>. Op deze tape leest de Turing Machine zijn invoer,<br />
maar de tape di<strong>en</strong>t ook als (extern) geheug<strong>en</strong> van de machine: er kan tijd<strong>en</strong>s het<br />
rek<strong>en</strong><strong>en</strong> informatie op geschrev<strong>en</strong> word<strong>en</strong>. In principe is de opslagcapaciteit van
4.3. TURING MACHINE 45<br />
b b 1 1 0 1 b<br />
invoertape<br />
begin: r<br />
eind: ∅<br />
leeskop<br />
toe- symbool<br />
stand 0 1 b<br />
r r,0,R r,1,R ℓ,b,L<br />
ℓ ∅,1,N ℓ,0,L ∅,1,N<br />
besturingse<strong>en</strong>heid<br />
✇<br />
r huidige<br />
toestand<br />
r❧ b b 1 1 0 1 b<br />
r❧ b b 1 1 0 1 b<br />
r❧ b b 1 1 0 1 b<br />
r❧ b b 1 1 0 1 b<br />
r❧ b b 1 1 0 1 b<br />
ℓ b b 1 1 0 1 b<br />
❧<br />
ℓ b b 1 1 0 0 b<br />
❧<br />
∅ b b 1 1 1 0 b<br />
❧<br />
Figuur 4.1: Links e<strong>en</strong> Turing Machine met drie symbol<strong>en</strong> (0,1 <strong>en</strong> b) <strong>en</strong> drie toestand<strong>en</strong><br />
(r,ℓ <strong>en</strong> eindtoestand ∅). Rechts e<strong>en</strong> berek<strong>en</strong>ing van deze Turing Machine<br />
op invoer 1101, getek<strong>en</strong>d is steeds de tape, de positie van de leeskop (met e<strong>en</strong><br />
kader om de tape positie), <strong>en</strong> de geld<strong>en</strong>de toestand (omcirkeld).<br />
de tape onbegr<strong>en</strong>sd, <strong>en</strong> loopt de tape naar twee zijd<strong>en</strong> oneindig door. Lege vakjes,<br />
nog onbeschrev<strong>en</strong>, word<strong>en</strong> aangegev<strong>en</strong> door het symbool b (voor blank). Hoewel<br />
er oneindig veel vakjes ter beschikking van de machine staan, is op elk mom<strong>en</strong>t het<br />
aantal beschrev<strong>en</strong> vakjes eindig. De akties van de machine word<strong>en</strong> vastgelegd in<br />
e<strong>en</strong> programma, dat uit e<strong>en</strong> aantal instructies bestaat. Elk van de instructies is van<br />
de vorm (p,A,q,B,d), met de volg<strong>en</strong>de interpretatie: als de toestand p is, <strong>en</strong> het<br />
symbool onder de kop is A, dan gaat de machine over in toestand q, schrijft B op<br />
de tape op de huidige positie, <strong>en</strong> beweegt de kop in de richting aangegev<strong>en</strong> door d.<br />
Hierbij kan d drie waard<strong>en</strong> aannem<strong>en</strong>: L linksaf, R rechtsaf, <strong>en</strong> N neutraal (de kop<br />
wordt niet verplaatst). De besturingse<strong>en</strong>heid bevat het eig<strong>en</strong>lijke Turing Machine<br />
programma, hier gegev<strong>en</strong> als e<strong>en</strong> tabel. Onderdeel van dit programma zijn de<br />
begin- <strong>en</strong> eindtoestand. De berek<strong>en</strong>ing begint in de begintoestand, <strong>en</strong> stopt zodra<br />
de eindtoestand wordt bereikt. Er zijn ge<strong>en</strong> instructies vanuit de eindtoestand.<br />
Voor de Turing Machine uit Figuur 4.1 zijn er drie mogelijke toestand<strong>en</strong>, r, ℓ <strong>en</strong><br />
de eindtoestand ∅, <strong>en</strong> drie mogelijke symbol<strong>en</strong> op de tape, 0, 1 <strong>en</strong> blank b. Het<br />
programma bevat zes instructies. Voor toestand r <strong>en</strong> tape symbool 1 vind<strong>en</strong> we in<br />
rij r <strong>en</strong> kolom 1 van de instuctietabel “r,1,R”. Dat wil zegg<strong>en</strong>, voor r <strong>en</strong> 1 is er<br />
de instructie (r,1,r,1,R); in woord<strong>en</strong> gezegd: in toestand r bij invoer 1 wordt de<br />
kop naar rechts bewog<strong>en</strong> (terwijl toestand <strong>en</strong> tape symbool gelijk blijv<strong>en</strong>). In het<br />
geval van de illustratie zou na deze aktie de kop op de cel gevuld met 0 kom<strong>en</strong> te<br />
staan; verder blijft alles gelijk.
46 HOOFDSTUK 4. TALEN EN AUTOMATEN<br />
4.23 Voorbeeld. We ontwerp<strong>en</strong> e<strong>en</strong> Turing Machine voor e<strong>en</strong> e<strong>en</strong>voudige taak.<br />
het herk<strong>en</strong>n<strong>en</strong> van het getal nul. Op de tape staat e<strong>en</strong> reeks 0-<strong>en</strong> <strong>en</strong> 1-<strong>en</strong> (omgev<strong>en</strong><br />
door blanko vakjes, dus met inhoud b). Deze reeks wordt gelez<strong>en</strong> <strong>en</strong> uitgeveegd<br />
(dus vervang<strong>en</strong> door b’s). Als er t<strong>en</strong>minste één 1 gelez<strong>en</strong> is, dan schrijft de machine<br />
1. Anders (er stond<strong>en</strong> alle<strong>en</strong> 0-<strong>en</strong> op de tape) schrijft de machine 0.<br />
Omdat we moet<strong>en</strong> onthoud<strong>en</strong> of we e<strong>en</strong> 1 zijn teg<strong>en</strong>gekom<strong>en</strong> voer<strong>en</strong> we in ieder<br />
geval twee toestand<strong>en</strong> in: n (voor ‘nul’) <strong>en</strong> e (voor ‘e<strong>en</strong>’). We beginn<strong>en</strong> in toestand<br />
n. Bij het lez<strong>en</strong> van e<strong>en</strong> 0 blijv<strong>en</strong> we in toestand n, overschrijv<strong>en</strong> we het symbool<br />
met b <strong>en</strong> gaan we naar rechts, volg<strong>en</strong>s de instructie (n,0,n,b,R). Bij het lez<strong>en</strong> van<br />
1 do<strong>en</strong> we hetzelfde, maar onthoud<strong>en</strong> we dat we dit symbool gezi<strong>en</strong> hebb<strong>en</strong>, <strong>en</strong><br />
gaan we over in toestand e volg<strong>en</strong>s de instructie (n,0,e,b,R).<br />
In toestand e hebb<strong>en</strong> we reeds e<strong>en</strong> 1 gelez<strong>en</strong> <strong>en</strong> wiss<strong>en</strong> we elk symbool dat we<br />
teg<strong>en</strong>kom<strong>en</strong>, met de instructies (e,0,e,b,R) <strong>en</strong> (e,1,e,b,R).<br />
Wanneer we e<strong>en</strong> b lez<strong>en</strong> zijn we aan het eind van de invoer gekom<strong>en</strong>. Zijn we op<br />
dat mom<strong>en</strong>t in toestand n dan schrijv<strong>en</strong> we 0 <strong>en</strong> stopp<strong>en</strong> we door naar de eindtoestand<br />
∅ te gaan; in toestand e hebb<strong>en</strong> we eerder e<strong>en</strong> 1 gelez<strong>en</strong> <strong>en</strong> schrijv<strong>en</strong> we 1.<br />
In deze laatste stap beweg<strong>en</strong> we de kop niet. Dit levert instructies (n,b,∅,0,N)<br />
<strong>en</strong> (e,b,∅,1,N).<br />
De uiteindelijke instructietabel is daarmee:<br />
toe- symbool<br />
stand 0 1 b<br />
n n,b,R e,b,R ∅,0,N<br />
e e,b,R e,b,R ∅,1,N<br />
Terug naar de eerste Turing Machine zoals gegev<strong>en</strong> in Figuur 4.1. Deze e<strong>en</strong>voudige<br />
Turing Machine zal, geplaatst op e<strong>en</strong> invoer string die uit null<strong>en</strong> <strong>en</strong> <strong>en</strong><strong>en</strong><br />
bestaat, in toestand r naar rechts over de tape beweg<strong>en</strong> totdat e<strong>en</strong> eerste b gevond<strong>en</strong><br />
wordt. Op dat mom<strong>en</strong>t staat de leeskop net ná de invoer. De toestand wordt<br />
dan ℓ <strong>en</strong> de kop gaat e<strong>en</strong> vakje terug naar links. Nu loopt de machine naar links,<br />
zolang e<strong>en</strong> 1 gelez<strong>en</strong> wordt. Deze 1 wordt dan telk<strong>en</strong>s door e<strong>en</strong> 0 vervang<strong>en</strong>.<br />
Wanneer de machine, zo doorgaand in toestand ℓ, e<strong>en</strong> 0 of e<strong>en</strong> b vindt, wordt deze<br />
door e<strong>en</strong> 1 overschrev<strong>en</strong>, de machine gaat over in toestand ∅ <strong>en</strong> stopt.<br />
Het is misschi<strong>en</strong> niet direct duidelijk, maar dit programma doet wel degelijk iets<br />
nuttigs; het telt bij de binaire invoer één op.