Aufgabe 1:
20
Umrechnung zwischen ZahlensystemenVervollständigen Sie folgende Tabelle!
100%
Fett-Markiert sind die vorgegebenen Werte| dezimal | binaer | dyadisch | 3-adisch |
| 35 | 100011 | 11211 | 322 |
| 49 | 110001 | 21121 | 1211 |
| 83 | 1010011 | 121211 | 2232 |
| 127 | 1111111 | 1111111 | 11131 |
Aufgabe 2:
30
Simulation einer RAM durch ein Python-ProgrammWenden Sie die Konstruktion aus Satz 2.20 auf folgendes RAM-Programm an, das hier eine Funktion N × N → N berechnet. Geben Sie das entstehende Python-Programm ab!
0 R3 <- RR2
1 R3 <- R3 + R2
2 R2 <- R2 + R1
3 RR2 <- R3
4 R0 <- R0 - R1
5 IF R0 > 0 GOTO 0
6 R0 <- RR2
7 STOP
100%
def read(u,v,a): # liefert den Inhalt von Ra
i=0
while (i < len(u) and u[i] != a): # Index a suchen
i=i+1
if (i == len(u)):
u += [a]
v += [0]
return v[i]
def write(u,v,a,b):
i=0
# Listen erweitern
# Inhalt von Ra zurueck
# schreibt b in Ra
while (i < len(u) and u[i] != a): # Index a suchen
i=i+1
if (i == len(u)):
u += [a]
v += [0]
v[i] = b
# Listen erweitern
# schreibt b in Ra
def phi(x1,x2):
u = [0,1]
v = [x1,x2]
br = 0
while (br < 7):
if (br == 0):
# 0: R3 <- RR2
i = read(u,v,2)
j = read(u,v,i)
write(u,v,3,j)
br = br + 1
if (br == 1):
# 1: R3 <- R3 + R2
i = read(u,v,3) + read(u,v,2)
write(u,v,3,i)
br = br + 1
if (br == 2):
# 2: R2 <- R2 + R1
i = read(u,v,2) + read(u,v,1)
write(u,v,2,i)
br = br + 1
if (br == 3):
# 3: RR2 <- R3
i = read(u,v,3)
j = read(u,v,2)
write(u,v,j,i)
br = br + 1
if (br == 4):
# 4: R0 <- R0 - R1
i = read(u,v,0) - read(u,v,1)
if (i < 0):
i=0
write(u,v,0,i)
br = br + 1
if (br == 5):
# 5: IF R0 > 0 GOTO 0
if (read(u,v,0) > 0):
br = 0
else:
br = br + 1
if (br == 6):
# 6: R0 <- RR2
i = read(u,v,2)
j = read(u,v,i)
write(u,v,0,j)
br = br + 1
#if (br == 7):
# 7: STOP
#while ende
return read(u,v,0)
Aufgabe 3:
20
TM-ProgrammSei l : N → N mit l(x) = 2x + 1. Geben Sie ein kommentiertes Programm einer 1-Band-TM an, die l in dyadischer Darstellung berechnet. (gefordert: Beschreibung der Arbeitsweise + kommentiertes Programm)
100%
Aufgabe 4:
30
Simulation einer TM durch ein Python-ProgrammSimulieren Sie folgende 2-Band-Turingmaschine M entsprechend der im Beweis des Satzes 2.45 verwendeten Methode. Neben den in While-Programmen erlaubten Konstrukten dürfen Sie auch die im Skript auf Seite 69 beschriebenen Erweiterungen (z.B. Listen) benutzen. Sei M=(Σ,Z,f,z0,z1) mit Σ={,1,2,∗} und Z={z0,z1,z2,z3}. Die Überführungsfunktion f : {z0, z2, z3} × Σ2 → Z × Σ2 × {L, O, R}2 ist durch folgendes Programm gegeben, wobei durch _ dargestellt ist.
(z0,1,_)->(z0,1,1,R,L)
(z0,2,_)->(z0,2,2,R,L)
(z0,_,_)->(z2,_,_,O,R)
(z2,_,1)->(z2,1,_,R,R)
(z2,_,2)->(z3,2,_,R,R)
(z3,_,1)->(z3,1,_,R,R)
(z3,_,2)->(z3,_,_,R,R)
Sei g : N → N die Funktion, die von M in dyadischer Darstellung berechnet wird. Für Ihr Python-Programm P muss dann gelten:• Falls x ∈ N − Dg, so liefert P bei Eingabe x kein definiertes Ergebnis.
• Falls x ∈ Dg, so liefert P bei Eingabe x den Wert g(x).
0%
Keine Loesung mitgeschriebenZusatzaufgabe 1:
20
Definition von Turing-MaschinenSeien k ∈ N+, Z eine endliche Menge und Σ eine endliche Menge mit ,∗ ∈ Σ. Bestimmen Sie die Anzahl der k-Band-Turing-Maschinen mit dem Alphabet Σ und der Zustandsmenge Z.
0%
Keine Loesung mitgeschriebenZusatzaufgabe 2:
30
RAM-SimulatorSchreiben Sie ein Python-Programm, das allgemeine RAMs simulieren kann. Dabei sind RAM-Programme als Listen entsprechend der Punkte 1 und 2 auf Seite 164 codiert. Beispiel:
Programm:
0 R3 <-
1 IF R1=0 GOTO 5
2 R2<-R2+R0
3 R1<-R1-R3
4 GOTO1
5 R0<-R2
6 STOP
Code als Python-Liste:[[3, 3, 1, 0], [7, 1, 5, 0], [4, 2, 2, 0], [5, 1, 1, 3], [6, 1, 0, 0], [0, 0, 2, 0], [9, 0, 0, 0]]
100%
def read(u,v,a): # liefert den Inhalt von Ra
i=0
while (i < len(u) and u[i] != a): # Index a suchen
i=i+1
if (i == len(u)):
u += [a]
v += [0]
return v[i]
def write(u,v,a,b):
i=0
# Listen erweitern
# Inhalt von Ra zurueck
# schreibt b in Ra
while (i < len(u) and u[i] != a): # Index a suchen
i=i+1
if (i == len(u)):
u += [a]
v += [0]
v[i] = b
# Listen erweitern
# schreibt b in Ra
def phi(code, args):
u = []
v = args
i = 0
while (i < len(args)):
u.append(i)
i = (i+1)
br = 0
while (br < len(code)):
step = code[br]
befehl = step[0]
a = step[1]
b = step[2]
c = step[3]
if (befehl == 0):
# Ri <- Rj
i = read(u,v,b)
write(u,v,a,i)
br = br + 1
if (befehl == 1):
# Ri <- RRj
i = read(u,v,b)
j = read(u,v,i)
write(u,v,a,j)
br = br + 1
if (befehl == 2):
# RRi <- Rj
i = read(u,v,b)
j = read(u,v,a)
write(u,v,j,i)
br = br + 1
if (befehl == 3):
# Ri <- j
write(u,v,a,b)
br = br + 1
if (befehl == 4):
# Ri <- Rj + Rk
i = read(u,v,b) + read(u,v,c)
write(u,v,a,i)
br = br + 1
if (befehl == 5):
# Ri <- Rj-Rk
i = read(u,v,b) - read(u,v,c)
if (i < 0):
i=0
write(u,v,a,i)
br = br + 1
if (befehl == 6):
# GOTO i
br = a
if (befehl == 7):
# IF Ri=0GOTO j
if (read(u,v,a) == 0):
br = b
else:
br = br + 1
if (befehl == 8):
# IF Ri>0GOTO j
if (read(u,v,a) > 0):
br = b
else:
br = br + 1
if (befehl == 9):
# STOP
br = (len(code)+2) # Mehr als zwei nicht!!!!
return read(u,v,0)
Für Testzwecke:
#TROLLOLLOLOLOLLOLLOLOLOLOLO
print phi([[3, 3, 1, 0],[7, 1, 5, 0],[4, 2, 2, 0],[5, 1, 1, 3],[6, 1, 0, 0],[0, 0, 2, 0],[9, 0, 0, 0]], [7, 13, 42, 1, 77])