Berechenbarkeitstheorie/Entscheidbarkeit und Aufzählbarkeit

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
==Aufzählbarkeit==

<code id="4f71911f5966d">
(define tree-1 '(1 (2 (4) (5)) (3 (6) (7))))

(define node? (lambda (tree)
                (and 
                 (list? tree)
                 (= (length tree) 3))))

(define leaf? (lambda (tree)
                (and 
                 (list? tree)
                 (= (length tree) 1))))


(define tiefe (lambda (tree)
                (cond
                  [(leaf? tree) (list (car tree))]
                  [else 
                   (let( [element (car tree)]
                         [left (cadr tree)]
                         [right (caddr tree)])
                     (cons element
                           (append (tiefe left)
                                   (tiefe right))))])))
</code>
<run id="4f71911f5972a">(display tree-1)</run>


Beispiel: Wörter der Länge 3 über $\{a,b\}^*$

Die zu charakterisierende Menge ist eine endliche, denn es gibt nur $2^3=8$ solche Wörter.

<code id="4f6cafece05e6">
(define chi-laenge3
  (lambda (w)
    (if (member w '("aaa" "aab" "aba" "baa" "abb" "bab" "bba" "bbb"))
      #t
      #f))) 
</code>
<run id="4f6cafece065c">(chi-laenge3 "abb")</run>


Beispiel: Wörter über $\{a,b\}^*$, die mit $a$ beginnen. 

<code id="4f6ca9bc8928d">
(define chi-a
  (lambda (w)
    (char=? (string-ref w 0) #\a)))
</code> 
<run id="4f6ca9bc89383">
(chi-a "ababaab")
</run>

Die Menge der Primzahlen ist aufzählbar unendlich:
<code id="4f71666af239c" hidden>
(define prim?
  (lambda (n)
    (letrec
        ((helfer
          (lambda (t)
            (cond
              ((> t (sqrt n)) #t)
              ((= (remainder n t) 0) #f)
              (else
               (helfer (+ t 2)))))))
      (cond
        ((= n 1) #f)
        ((= n 2) #t)
        ((= (remainder n 2) 0) #f)
        (else
         (helfer 3))))))
</code>
<run id="4f71666af2ed9">(prim? 31)</run>
<code id="4f71666af2b1e">
(define f 
  (lambda (n)
    (if (prim? n)
      n
      2)))
</code>
<run id="4f71666af3428">(f 31)</run>