Kreativaufgabe Zeitbeschränkte Prozesse (Kretschmer, Schumann)
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
;Autoren
:[mailto://s3toschu@stud.hszg.de Tom Schumann]<br/>
:[mailto://s3hakret@stud.hszg.de Hannes Kretschmer]
=Aufgabenstellung=
Implementieren Sie die im Beweis definierte Aufzählfunktion für $M \subseteq \text{ A*}$ unter Verwendung der Cantorschen Paarungsfunktion. Wählen Sie im Fallbeispiel $A = \{a,b,c\}, g: \N \mapsto A^*$ und M = $\{w |w \in A^* \text{ und } w \text{ enthält Fibonacci-zahlig viele } b's\}$.
Machen Sie bei der Konstruktion von $\chi^'_M$ nur von der Semi-Entscheidbarkeit der Menge der Fibonacci-Zahlen Gebrauch, obwohl doch deren Entscheidbarkeit durch Beschränkung des Suchraumes gegeben ist.
'''Hinweis:''' Sie benötigen keine ''engines''. Das einfache Timer-System reicht aus.
=Lösung=
==Abbildung der Natürlichen Zahlen==
<popup text="Vollständigen Code"><code rows="11">
class Naturals:
def __init__(self):
self.current = 0
def __next__(self):
result = self.current
self.current += 1
return result
def __iter__(self):
return self
</code>
==Generierung von $A^*$==
<popup text="Vollständigen Code"><code>
def generate_a_star(A, count):
A_star = []
for s in A:
A_star.append(s)
for i in range(0, count):
A_star_temp = A_star.copy()
for p in A_star_temp:
for s in A:
if (p + s) not in A_star:
A_star.append(p + s)
A_star.append("")
return A_star
</code></popup>
==Menge der Fibonacci-Wörter==
<popup text="Vollständigen Code"><code>
class FibWords:
def __init__(self):
self.current = 0
def __next__(self):
self.current += 1
result = fib(self.current)
return result
def __iter__(self):
return self
def fib(n):
if n == 1:
return "b"
elif n == 0:
return "b"
else:
return fib(n - 1) + fib(n - 2)
</code></popup>
==Cantorsche Paarungsfunktion==
<popup text="Vollständigen Code"><code>
def cantor(x, y):
return int(((x + y) * (x + y + 1) / 2) + y)
def get_w_from_cantor(z):
return int(math.floor(0.5 * ((math.sqrt(8 * z + 1)) - 1)))
def get_x_from_cantor(z):
w = get_w_from_cantor(z)
return w - get_y_from_cantor(z)
def get_y_from_cantor(z):
w = get_w_from_cantor(z)
t = int(w * (w + 1) * 0.5)
return z - t
</code></popup>
==$g: \N \mapsto A^*$==
<popup text="Vollständigen Code"><code>
def g(x):
j = 0
for i in A_star:
if j == x:
return i
j += 1
</code></popup>
==Aufzählfunktion==
<popup text="Vollständigen Code"><code>
def f(z):
x = get_x_from_cantor(z)
y = get_y_from_cantor(z)
fib_word = g(x)
chi_thread = ChiThread(fib_word)
chi_thread.start()
time.sleep(y)
chi_thread.join(timeout=2)
if chi_thread.return_result():
return fib_word
else:
return "b"
</code></popup>
==Zeitbegrenzung==
<code>
class ChiThread(Thread):
def __init__(self, w):
super(ChiThread, self).__init__()
self.word = w
self.result = False
self.stoprequest = threading.Event()
def join(self, timeout=None):
self.stoprequest.set()
super(ChiThread, self).join(timeout)
def run(self):
self.result = chi_strich_m(self.word)
def return_result(self):
return self.result
</code>