BuK/IIm20/Vorlesung 3 Nerlich
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Python</language>
=== S.9 ===
<code id="6073186d90b37">
#/usr/bin/env python3
from random import Random
class WordGenerator:
"""docstring for WordGenerator"""
def __init__(self, alphabet: set):
if not alphabet.isdisjoint({None}):
raise ValueError("The alphabet cannot contain None")
self._alphabet = frozenset(alphabet)
self._generator = Random()
self._word = ""
self._ended = False
def __iter__(self):
return self
def __next__(self):
result = self._generator.choice(tuple(self._alphabet.union({None})))
if result is None or self._ended:
self._ended = True
raise StopIteration()
else:
self._word = self._word + result
return result
@property
def alphabet(self) -> frozenset:
return self._alphabet
@property
def word(self):
while not self._ended:
try:
next(self)
except StopIteration:
pass
return self._word
def next(self):
return self.__next__()
def reset(self):
self._word = ""
self._ended = False
def chi_length_3(w: WordGenerator): # requires at most 4 checks
for n in range(1,4):
try:
print("Letter #{} is '{}'".format(n, next(w))) # up to 3 checks, determining lengths 0 to 2
except StopIteration:
print("Word '{}' is of length shorter than 3!".format(w.word))
return False
try:
print("Letter #4 is '{}'".format(next(w))) # fourth check shows whether of length 3
print("Word '{}' is of length longer than 3!".format(w.word))
return False
except StopIteration:
print("Word '{}' is of length 3.".format(w.word))
return True
def chi_starts_with_letter(w: WordGenerator, letter): # always requires only one check
try:
result = next(w) # one check
print("Letter #1 is '{}'".format(result))
if result == letter:
print("Word '{}' starts with '{}'!".format(w.word, letter))
return True
else:
print("Word '{}' does not start with '{}'.".format(w.word, letter))
return False
except StopIteration:
print("Word '{}' does not start at all.".format(w.word))
return False
A = {'a', 'b'}
</code>
<run id="6073186d90bc4">chi_length_3(WordGenerator(A))</run>
<run id="6073186d90c2b">chi_starts_with_letter(WordGenerator(A), 'a')</run>
=== S.10 ===
Berechenbarkeit $:= \exists$ Algorithmus, der für jedes $x \in D_f$ den Funktionswert $f$ effektiv ermittelt (effektiv = es muss ein entsprechendes Verfahren geben)
{| border="1" cellpadding="5" cellspacing="0"
|-
| $A$ || endlich
|-
| $A^\ast$ || abzählbar unendlich
|-
| $\mathcal{P}(A^\ast)$ || überabzählbar unendlich
|-
| $\chi_M$ || überabzählbar unendlich
|-
| $\chi_M$ berechenbar || ?????
|-
| $\chi_M$ implementierbar || abzählbar unendlich
|-
|}
=== S.15–16 (Aufzählbarkeit) ===
==== $G$ (gerade Zahlen) ====
$G \subset \mathbb{N}$
kann $\mathbb{N}$ auf $G$ abbilden: 0→0, 1→2, 2→4, etc.
==== $P$ (Primzahlen) ====
$P \subset \mathbb{N}$, $\exists$ berechenbare Methode für Entscheidung $n \in P \hspace{4mm} \longrightarrow \hspace{4mm} f:$ durchprobieren
==== $A^\ast$ ====
trivial: längenlexikografisch aufzählen
==== $\forall$ endliche Menge ====
nehme beliebiges Element $e$ aus Menge $M$ und bilde damit eine neue Menge $M'$ (beim ersten Mal also: $M' = \{e\}$)
wiederhole für Restmenge $M \backslash M'$, bis $M \backslash M' = \empty$
==== $G = \{(0,0), (0,1), \ldots\}$ ====
[1] $f: \mathbb{N} \mapsto G$ bijektiv
Diagonalisierung: $\mathbb{Z} \times \mathbb{Z}$
[2] Ordnungsrelation $p_<$
$p_<(g_1, g_2) :\ <\!(f^{-1}(g_1), f^{-1}(g_2))$
[3] $k$: Platznummern
trivial: $k := f^{-1}$
[4] Aufzählprozedur${}_G$, Berechenbarkeit?
$f$ implementieren:
<code id="6073577774944">
def grid():
yield (0, 0)
x = 0
y = 1
phase = 0
while True:
if phase % 4 == 0:
x = x+1
y = y-1
if y == 0:
phase = phase+1
elif phase % 4 == 1:
x = x-1
y = y-1
if x == 0:
phase = phase+1
elif phase % 4 == 2:
x = x-1
y = y+1
if y == 0:
phase = phase+1
elif phase % 4 == 3:
x = x+1
y = y+1
if x == 0:
phase = phase+1
yield (x, y)
if phase % 4 == 0 and x == 0:
y = y+1
g = grid()
</code>
<run id="60735777749b8">
for i in range(0, 20):
print(next(g))
</run>
Berechenbarkeit: trivial
=== S.20 ===
==== Halteproblem semi-entscheidbar ====
Immer, wenn das Programm terminiert, kann in endlicher Zeit eine Antwort gegeben werden.
==== $FIBS$ ====
Aufzählfunktion $f$: (nach Berechnungsvorschrift)
siehe Definition Berechenbarkeit, Aufzählfunktion ermittelt effektiv Funktionswert
semi-entscheidbar: $\chi'_M : \begin{cases} \text{True}, & f\ \text{liefert Wert;}\\ \perp, & \text{else.}\end{cases}$
entscheidbar: $f(x) < f(x+1)\ \forall x \in \mathbb{N} \Longrightarrow f(x) < g < f(x+1) \rightarrow g \not\in FIBS$ für gesuchtes $g$
==== $QZ$ ====
Aufzählfunktion $q$: nach Berechnungsvorschrift
siehe Definition Berechenbarkeit, Aufzählfunktion ermittelt effektiv Funktionswert
semi-entscheidbar: $\chi'_{QZ} : \begin{cases} \text{True}, & q\ \text{liefert Wert;}\\ \perp, & \text{else.}\end{cases}$
$q(x) < q(x+1)\ \forall x \in \mathbb{N} \Longrightarrow q(x) < g < q(x+1) \rightarrow g \not\in QZ$ für gesuchtes $g$
==== $M = \{a, b\}^\ast | w = a \cdot w'\ \forall w \in M$ ====
siehe oben, entscheidbar $\Rightarrow$ semi-entscheidbar
=== S.23 ===
<code id="607363bc9af9e">
def even():
x = 0
while True:
yield(x)
x = x+2
def odd():
x = 1
while True:
yield(x)
x = x+2
def both():
e = even()
o = odd()
while True:
yield(next(e))
yield(next(o))
b = both()
</code>
<run id="607363bc9b077">
for i in range(0, 30):
print(next(b))
</run>