BuK/IIm11/Studenten/simawiel/ue11

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
= Kreativaufgabe (Gödelisierung und $\mu$-rekursive Funktionen =

<code id="4fe09dee4fd56" hidden>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Hilfsfunktionen                                ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define pow
  (lambda (number exp)
    (if (= exp 0)
      1
      (* number (pow number (- exp 1))))))

(define get-elem
  (lambda (set index)
    (if (= index 1)
      (car set)
      (get-elem (cdr set) (- index 1)))))

;Berechnet die Anzahl der Wörter mit Länge <= letterCount
(define word-number
  (lambda (cardinal-number letter-count)
    (if (= letter-count 0)
      0
      (+
        (pow cardinal-number letter-count)
        (word-number cardinal-number (- letter-count 1))))))
    
(define create-word
  (lambda (alphabet word-number cardinal-number word-length)
    (if (= 0 word-length)
      ""
      (let ((section-size (pow cardinal-number (- word-length 1))))
        (let ((rest (modulo word-number section-size))
            (result (quotient word-number section-size)))
          (if (= 0 rest)
            (string-append
              (string (get-elem alphabet result))
              (create-word alphabet section-size cardinal-number (- word-length 1)))
            (string-append
              (string (get-elem alphabet (+ result 1)))
              (create-word alphabet rest cardinal-number (- word-length 1)))))))))

(define index-of
  (lambda (word alphabet)
      (if (equal? word (car alphabet))
      1
      (+ 1 (index-of word (cdr alphabet))))))

(define fill-with-indexes
  (lambda (word-as-list list-to-fill alphabet)
    (if (null? word-as-list)
      list-to-fill
      (let* ((index (index-of (car word-as-list) alphabet)) (temp-list (append list-to-fill (list index))))
        (fill-with-indexes (cdr word-as-list) temp-list alphabet)))))
    
(define goedel-product-sum
  (lambda (indexes zero-based-length)
    (cond
      ((= 0 zero-based-length) 1)
      (else (+ 
              (* (car indexes) (expt 3 zero-based-length))
              (goedel-product-sum (cdr indexes) (- zero-based-length 1)))))))
</code>

<code id="4fe09dee4fdc7">
(define S (list #\a #\b))

(define goedel 
  (lambda (word alphabet)
    (let ( (indexes (fill-with-indexes (string->list word) '() alphabet)) )
    (goedel-product-sum indexes (- (length indexes) 1)))))
</code>

<run id="4fe09dee4ff0e">
(display "Rufe Gödel-Funktion auf:")
(display "(goedel 'aba' S)\n")
(goedel "aba" S)
</run>

<code id="4fe09dee4fe31">
(define word-of-power-set?
  (lambda (goedel-number-for-word index word-length alphabet)
    (cond 
      ((> index (expt (length alphabet) word-length)) 
         (word-of-power-set? goedel-number-for-word 1 (+ word-length 1) alphabet))
      ((= (goedel (create-word alphabet index (length alphabet) word-length) alphabet) goedel-number-for-word)
         #t)
      ((> (goedel (create-word alphabet index (length alphabet) word-length) alphabet) goedel-number-for-word)
         #f)
      (else 
        (word-of-power-set? goedel-number-for-word (+ index 1) word-length alphabet)))))
   
(define goedel-number?
  (lambda (number alphabet)
    (word-of-power-set? number 1 1 alphabet)))
</code>

<run id="4fe09dee4ff6e">
(goedel-number? (goedel "abbbbbbaaabab" S) S)
</run>
<run id="4fe09e7763d55">
(goedel-number? 15 S)
</run>
== Das Prädikat p ==
<code id="4fe09dee4fe92">
(define p
  (lambda (r y)
    (if (and (<= r y) (goedel-number? y S)) 1 0)))
</code>

<run id="4fe09dee4ffca">
(p 12 15)
</run>
<run id="4fe09e7763dca">
(p 16 16)
</run>