You are on page 1of 4

Complexiteit Huiswerkopgave 4

a.

q 0 1 b
q0 (q1, 0, 1) (qrn, 1, -1) (qrn, b, -1)
q1 (qrn, 0, -1) (q0, 1, 1) (qry, b, -1)
qrn (qrn, 0, -1) (qrn, 1, -1) (qn, b, 1)
qry (qry, 0, -1) (qry, 1, -1) (qy, b, 1)

q0: Beginstaat. De leeskop staat aan het begin van de string of het laatst gelezen getal is een 1. Een
0 kan nog een geldige string opleveren, maar een 1 of een b niet.

q1: Het laatst gelezen getal is een 0. Een 1 kan nog een geldige string opleveren, 0 geeft een
ongelding string en b betekent dat de string geldig is.

qrn: De string voldoet niet. Deze staat spoelt de schrijfkop terug tot aan het begin van de string en
terminineert in qn.

qry: De string voldoet. De schrijfkop moet nog teruggespoeld worden naar het begin van de string.
Daar termineert het programma in qy.

b.
q 0 1 b # x
q0 - (q0, 1, -1) (q1, x, 1) - -
q1 - (q1, 1, 1) (q2, b, -1) (q1, #, 1) -
q2 - (q3, b, -1) - (q7, b, -1) -
q3 (q3, 1, -1) (q3, 1, -1) - (q3, #, -1) (q4, x, 1)
q4 (q4, 0, 1) (q5, 0, -1) - (a1, #, 1) -
q5 (q5, 0, -1) (q5, 1, -1) (q6, 1, 1) - (q5, x, -1)
q6 - (q6, 1, 1) - - (q4, x, 1)
q7 (q7, b, -1) - - - (qy, b, -1)

m*n wordt voor m#n op de tape gezet. Het extra tape symbool x wordt hier tussen geplaatst tijdens
het berekenen.

q0: beginstand. Plaatst x voor m#n op de tape.

q1: Loopt tot het einde van m#n

q2: Als er nog een 1 na # staat, moet m nog een keer gekopieerd naar m*n. De 1 wordt dan
weggehaald. Als n er niet meer is, is m*n al helemaal berekend.

q3: Loopt door tot de x. 0 wordt gebruikt om aan te geven dat een 1 van m in een ronde al is
gekopieerd. q3 zet deze dan weer terug naar 1 voor de volgende ronde.

q4: Kijkt of er nog een 1 van m gekopieerd moet worden in deze ronde van m naar m*n. Een 1 die
gekopieerd wordt, wordt op 0 gezet.

q5: Loopt door tot het begin van de tot nu toe opgebouwde m*n en zet hier een 1 voor.

q6: Loop terug vanaf het begin van m*n naar x.

q7: m*n is berekend. Deze staat haalt de symbolen die niet tot m*n behoren van de tape en zal
eindigen in qy als dit gebeurt is.

c.

y is een 1 die bekeken is en z is een 0 die bekeken is tijdens het bepalen of de string een even lengte
heeft. v is een 1 die bekeken is en w een 0 die bekeken is tijdens het tweede gedeelte wanneer
bepaalt wordt of de eerste helft van de string enen heeft waar de tweede helft nullen heeft en
omgedraaid.

q 1 0 y z v w b
q0 (q2, y, 1) (q2, z, 1) (q4, v, 0) (q9, w, 0) - - (qy, b, 0)
q1 (q3, y, -1) (q3, z, -1) (q13, y, 0) (q13, z, 0) - - -
q2 (q2, 1, 1) (q2, 0, 1) (q1, y, -1) (q1, y, -1) - - (q1, b, -1)
q3 (q3, 1, -1) (q3, 0, -1) (q0, y 1) (q0, z, 1) - - -
q4 - - (q5, y, -1) (q5, z, -1) (q4, v, -1) (q4, w, -1) -
q5 - - (q5, y, -1) (q5, z, -1) (q6, v, 1) (q6, w, 1) (q6, b, 1)
q6 - - (q13, y, 1) (q7, w, 1) - - -
q7 - - (q7, y, 1) (q7, z, 1) (q8, v, 1) (q8, v, 1) -
q8 - - (q4, v, -1) (q9, w, -1) (q8, v, 1) (q8, w, 1) (q12, b, -1)
q9 - - (q10, y, -1) (q10, z, -1) (q9, v, -1) (q9, w, -1) -
q10 (q10, y, -1) (q10, z, -1) (q11, v, 1) (q11, w, 1) (q11, b, 1)
q11 - - (q7, v, 1) (q13, w, 1) - - -
q12 - - - - (q12, 1, -1) (q12, 0, -1) (qy, b, 1)
q13 - - (q13, y, 1) (q13, z, 1) (q13, v, 1) (q13, w, 1) (q14, b, -1)
q14 - - (q14, 1, -1) (q14, 0, -1) (q14, 1, -1) (q14, 0, -1) (qn, b, 1)

q0 t/m q3 worden gebruikt om te bepalen dat een string een even lengte heeft.

q0: Beginstaat. Kijkt of een string een even lengte heeft door een symbool in de linkerhelft te
bekijken en deze te veranderen in y of z. Als in deze staat een y of z gelezen wordt, betekent het dat
de string een even lengte heeft. Een blanco symbool betekent hier een lege string en moet dus
geaccepteerd worden.

q1: Kijkt of de string een even lengte heeft door een symbool in de linkerhelft te bekijken en met y
of z te markeren dat deze gelezen is. Als in deze staat een y of z wordt gelezen, is de string oneven
en wordt dus niet geaccepteerrd

q2: Brengt de schrijf- en leeskop naar het eerste symbool van de rechterhelft dat niet niet bekeken
is. De rechterhelft wordt van achter naar voren bekeken, dus de kop moet zo ver mogelijk
doorlopen.

q3: Brengt de schrijf- en leeskop naar het eerste symbool van de linkerhelft dat nog niet bekeken is.

q4 t/m q11 worden gebruikt om te bepalen dat de rechterhelft een 0 heeft op elke plaats waar de
linkerhelft een 1 heeft en omgedraaid. De symbolen moeten hier weer opnieuw bekeken worden.

q4: Het eerste nog niet bekeken symbool van de rechterhelft is een 1. Het symbool op dezelfde
plaats in de linkerhelft moet dus een 0 zijn. Het symbool in de linkerhelft wordt op bekeken gezet,
en de schrijf- en leeskop wordt naar het einde van de linkerhelft gebracht.

q5: Het eerste nog niet bekeken symbool van de rechterhelft moet een 1 zijn. De schrijf- en leeskop
wordt door deze staat naar dit symbool gebracht

q6: Bekijk of symbool in de rechthelft klopt. Dit symbool wordt op bekeken gezet. Als dit symbool
niet klopt, wordt de string niet geaccepteerd.

q7: De kop moet teruggebracht worden naar het volgende niet bekeken symbool uit de linkerhelft.
Deze staat brengt de kop tot aan het begin van de linkerhelft.

q8: De linkerhelft is bereikt. Het eerste nog niet bekeken symbool wordt opgezocht. Als alle
symbolen bekeken zijn, kan de string geaccepteerd worden.

q9, q10 en q11: Hetzelfde als q4, q5 en q6, alleen moet volgende niet bekeken symbool in de
rechterhelft een 1 zijn, want het symbool in de rechterhelft is een 0.

q12: De string kan geaccepteerd worden en de lees- en schrijfkop staat aan het einde van de string.
Deze staat brengt de kop weer naar het begin van de string en herstelt deze weer tot zijn
oorspronkelijke staat.

q13: De string kan niet geaccepteerd worden. Deze staat brengt de lees- en schrijfkop naar het einde
van de string

q14: De string kan niet geaccepteerd worden en de kop staat aan het einde van de string. Deze
wordt naar voren gebracht en ondertussen wordt de string weer hersteld naar zijn oorspronkelijke
staat.

Voorbeelden:
De positite van de kop wordt in de voorbeelden aangegeven met |x|

Een ja-instantie is de string: 001110.

Eerst wordt bekeken of de string even is. De kop loopt van het eerste symbool naar het laatste nog
niet bekeken symbool heen en weer:

z|0|111z.

Dit gaat door totdat de hele string omgezet is.

zzy|y|yz.

Deze string wordt bereikt wanneer het programma zich in staat q0 bevindt, wat betekent dat de
string even is.

Vervolgens worden de symbolen uit de linkerhelft en rechthelft op dezelfde plek met elkaar
vergeleken.

|z|zyvyz

Op de eerste plaats van de linkerhelft stond een 1 en op de eerste plaats van de rechterheflt stong
een 0, de string kan dus nog geaccepteerd worden:

wzyv|y|z.

Dit gaat door totdat elk symbool vergeleken is:

wwvvvw| |

De kop loopt nu terug en de string wordt weer goed gezet:

|0|01110

Een nee-instantie is 00100, want deze string is oneven.

De string zz|y|zz wordt bereikt wanneer het programma zich in staat q1 bevindt. Dit betekent dat de
string niet geaccepteerd wordt. De kop loopt door tot het einde van de string en loopt daarna weer
terug naar het begin terwijl het de nullen en enen weer herstelt: |0|0100.

http://morphett.info/turing/turing.html?50017dba8cc05d1e6604
http://morphett.info/turing/turing.html?a2f55bc4d4a3e6e8a0c8

You might also like