BuK/IIm11/Studenten/sirabien/goedelisierung
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Scheme</language>
=Aufgabe=
Illustrieren Sie die folgenden Aussagen durch den Einsatz selbst entwickelter Scheme-Prozeduren. Wählen Sie exemplarisch S = {a, b} und die Verschlüselung im 3er-System, mit $a \mapsto 1$, $b \mapsto 2$ als Gödelisierung $h$ mit $h(w) = \sum_{i=0}^{|w|−1}~{a_i3^i}$ mit $a_i ∈ \{1, 2\}$. Das Wort $aba$ erhält dann die Gödelnummer $h(aba) = 1 \cdot 32 + 2 \cdot 31 + 1 \cdot 30 = 16$.
Nicht jede natürliche Zahl ist Gödelnummer eines Wortes aus $S^∗$: Beispielsweise ist $10 = 1 \cdot 32 + 0 \cdot 31 + 1 \cdot 30$ keine.
=Hilfsfunktionen=
<code id="4fe090ebc6161">;Returns the position of an element in a list (first element has position 1).
(define position
(lambda (element list)
(if (null? list)
(position element list) ;(rotate #\T 180)
(if (equal? element (car list))
1
(+ 1 (position element (cdr list)))))))
;Returns the element at the position in a list (first element has position 1).
(define element
(lambda (position list)
(if (null? list)
(element position list) ;(rotate #\T 180)
(if (= position 1)
(car list)
(element (- position 1) (cdr list))))))
(define BASE 3)
(define S '(#\a #\b))</code>
=Gödelisierung=
Die Scheme Prozedur zur Gödelisierung von $S^*$ durch Verschlüsselung im 3er-System.
<code id="4fe090ebc61d9">(define h
(lambda (w)
(let* (
(wList (string->list w))
(letterCount (length wList)))
(if (= letterCount 0)
0
(+
(* (position (car wList) S) (expt BASE (- letterCount 1)))
(h (list->string (cdr wList))))))))</code>
<run id="4fe090ebc6502">(display "Gödelnummer von abab:\n")
(h "abab")</run>
=Umkehrfunktion der Gödelisierung=
Die Umkehrfunktion $h^-1$ liefert für Nicht-Gödelnummern kein Ergebnis. Sie würde also ewig weiter laufen. Um eine Funktion zu erhalten, die für später für die Prädikatsfunktion verwendet werden kann, ist im folgende Funktion implementiert:
$nice\text{-}h^{-1}(x) = =\cases{h^{-1}(x), \text{wenn x Gödelnummer}\\ false, \text{sonst}}$
<code id="4fe090ebc6265">;Returns the word for the Gödelnumber n if n is a Gödelnumber or
;false if it's not.
(define nice-h-1
(lambda (n)
(let (
(quot (quotient n BASE))
(rest (modulo n BASE)))
(if (= rest 0)
#f
(let ((letter (string (element rest S))))
(if (= quot 0)
letter
(let ((word (nice-h-1 quot)))
(if (equal? word #f)
#f
(string-append word letter)))))))))</code>
<run id="4fe090ebc6567">(display "Wort für Gödelnummer 50:\n")
(nice-h-1 50)
(display "Ergebnis für Zahl die keine Gödelnummer ist:\n")
(nice-h-1 10)</run>
=G=
Die Prädikatsfuntion für g
<code id="4fe090ebc62ec">(define p
(lambda (r y)
(if (> r y)
0
(if (equal? #f (nice-h-1 y))
0
1))))</code>
Die Funktion g errechnet die n-te gültige Gödelnummer wobei n als Parameter übergeben wird.
<code id="4fe090ebc6390">(define g
(lambda (i)
(letrec
((fkt (if (= i 1)
(lambda (n)
(= 0 (- 1 (p 0 n))))
(lambda (n)
(= 0 (- 1 (p (+ (g (- i 1)) 1) n))))))
(worker
(lambda (n)
(if (fkt n)
n
(worker (+ n 1))))))
(worker 1))))</code>
<run id="4fe090ebc65cb">(display "Die 8. Gödelnummer ist:\n")
(g 8)</run>
Die folgende Funktion gibt eine Liste mit den ersten n Gödelnummern zurück. Laut Hinweis sollen die ersten 10 Gödelnummern zurück gegeben werden. Das dauert allerdings zu lang.
<code id="4fe090ebc6402">(define goedelGen
(lambda (n)
(if (= n 0)
'()
(append (goedelGen (- n 1)) (list (g n))))))</code>
<run id="4fe090ebc662a">(display "Die ersten 8 Gödelnummern sind:\n")
(goedelGen 8)</run>
Die Funktion k gibt das Wort zurück, welches der n-ten Gödelnummer entspricht.
<code id="4fe090ebc646f">(define k
(lambda (n)
(nice-h-1 (g n))))</code>
<run id="4fe090ebc668c">(display "Das 8. Wort der gödelgeordneten Folge der Wörter aus S* ist:\n")
(k 8)</run>