29.08.2013 Views

Hoofdstuk 4 Talen en Automaten - Liacs

Hoofdstuk 4 Talen en Automaten - Liacs

Hoofdstuk 4 Talen en Automaten - Liacs

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!