IIm18-Kreativaufgabe9

Aus ProgrammingWiki
Archivierte Version vom 2019-06-16T22:36:38+00:00. Aktuelle Version

Inhaltsverzeichnis

Kernaussagen der Vorlesung

  • nicht alle total berechenbare Funktionen sind primitv-rekursiv (AP-Funktion)
  • man kann keine nicht totale Funktion als primitiv-rekursive Funktion darstellen
  • man kann mit dem unbeschränkten μ-Operator μ-rekursive (d.h. partiell-rekursive) Funktionen darstellen. Diese sind so aufgebaut, dass es zu einem Endloszyklus kommen kann, wenn die geforderte Bedingung niemals erfüllt werden kann
  • Die Menge der Turing-berechenbaren Funktionen und die Menge der μ-rekursiven Funktionen (partiell berechenbare Funktionen) sind identisch
  • μ-rekursive Funktionen können mit while-Programmen implementiert werden


μ-Funktion durchdenken mit imaginären Werten

  • μf(0) = g(1)
    • 1 - p(0,0) = 1
    • 1 - p(0,1) = 1
    • 1 - p(0,2) = 1
    • 1 - p(0,3) = 1
    • 1 - p(0,4) = 1
    • 1 - p(0,5) = 0 -> 5 ist 0. goedelnummer
  • μf(1) = g(2)
    • 1 - p(g(1)+1, 0) = 1 - p(6,0) = 1
    • 1 - p(g(1)+1, 1) = 1 - p(6,1) = 1
    • 1 - p(g(1)+1, 2) = 1 - p(6,2) = 1
    • 1 - p(g(1)+1, 3) = 1 - p(6,3) = 1
    • 1 - p(g(1)+1, 4) = 1 - p(6,4) = 1
    • 1 - p(g(1)+1, 5) = 1 - p(6,5) = 1
    • 1 - p(g(1)+1, 6) = 1 - p(6,6) = 1
    • ...
    • 1 - p(g(1)+1, 35) = 1 - p(6,35) = 0 -> 35 ist 1. Gödelnummer
  • μf(2) = g(3)
    • 1 - p(g(2)+1, 0) = 1 - p(36,0) = 1
    • 1 - p(g(2)+1, 1) = 1 - p(36,1) = 1
    • 1 - p(g(2)+1, 2) = 1 - p(36,2) = 1
    • 1 - p(g(2)+1, 3) = 1 - p(36,3) = 1
    • 1 - p(g(2)+1, 4) = 1 - p(36,4) = 1
    • 1 - p(g(2)+1, 5) = 1 - p(36,5) = 1
    • 1 - p(g(2)+1, 6) = 1 - p(36,6) = 1
    • ...
    • 1 - p(g(2)+1, 120) = 1 - p(36,120) = 0 -> 120 ist 2. Gödelnummer


Implementierung der Kreativaufgabe (Java) 🐇

  • Das folgende Programm implementiert die Funktion k. Mit dieser kann das Wort aus dem Alphabet S* für die n-te Gödelnummer (unterliegt Gödelordnung) berechnet werden
  • Die Funktion k ruft intern die μ-rekursive Funktion auf, um die i-te Gödelnummer zu berechnen. Mit der Umkehrfunktion der Gödelisierung wird daraus dann das Wort berechnet


public class Application {

   public static void main(String[] args) {
       Alphabet alphabet = new Alphabet('a', 'b');
       Goedelisierung3erSystem goedelisierung3erSystem = new Goedelisierung3erSystem(alphabet);
       KFunction kFunction = new KFunction(goedelisierung3erSystem);
       IntStream.iterate(0, i -> i + 1)
               .limit(2000)
               .peek(goedelIndex -> System.out.print(String.format("Goedel-Index: %d \t\t", goedelIndex)))
               .mapToObj(kFunction::getWordForGoedelIndex)
               .forEach(word -> System.out.println(String.format("Word: %s", word)));
   }

}

private final List<character> characters;</character>

   public Alphabet(Character... characters) {
       this.characters = new ArrayList<>(new TreeSet<>(Arrays.asList(characters)));
   }
   public int getNumberForCharacter(Character character) {
       if (!characters.contains(character)) {
           throw new IllegalArgumentException(String.format("Alphabet doesn't contain character %s", character));
       }
       return characters.indexOf(character)+1;
   }
   public List<character> getCharacters() {
       return characters;
   }</character>
   public char getCharacterForNumber(Integer number) {
       return characters.get(number-1);

}

public class Goedelisierung3erSystem {

   private final Alphabet alphabet;
   public Goedelisierung3erSystem(Alphabet alphabet) {
       this.alphabet = alphabet;
   }
   public int getGoedelNumberFromWord(String wordFromSStern) {
       char[] chars = wordFromSStern.toCharArray();
       int goedelNumber = 0;
       for (int i = 0; i < chars.length; i++) {
           int charNumber = alphabet.getNumberForCharacter(chars[i]);
           int potenz = chars.length - i - 1;
           goedelNumber += getGoedelSummand(charNumber, potenz);
       }
       return goedelNumber;
   }
   public String getWordFromGoedelNumber(int goedelNumber) {
       Deque<integer> factorList = new LinkedList&lt;&gt;();
       int dividend = goedelNumber;
       do {
           int rest = dividend % 3;
           if (rest == 0 || rest &gt; alphabet.getCharacters().size()) {
               throw new NotAGoedelNumberException(String.format("%d is not a number for a valid character in alphabet", rest));
           }</integer>
           int quotient = dividend / 3;
           factorList.addFirst(rest);
           dividend = quotient;
       } while (dividend != 0);
       StringBuilder stringBuilder = new StringBuilder();
       for (Integer factor : factorList) {
           stringBuilder.append(alphabet.getCharacterForNumber(factor));
       }
       return stringBuilder.toString();
   }
   public boolean isNumberGoedelNumber(int number) {
       try {
           getWordFromGoedelNumber(number);
           return true;
       } catch (NotAGoedelNumberException e) {
           return false;
       }
   }
   private int getGoedelSummand(int charNumber, int potenz) {
       return (int) (charNumber * Math.pow(3, potenz));
   }

}

public class MueFunction {

   private Goedelisierung3erSystem goedelisierung3erSystem;
   private Map<integer integer> gMap = new HashMap&lt;&gt;();</integer>
   public MueFunction(Goedelisierung3erSystem goedelisierung3erSystem) {
       this.goedelisierung3erSystem = goedelisierung3erSystem;
   }
   public int muef(int i) {
       // check if value is already in g map
       if (gMap.containsKey(i + 1)) {
           return gMap.get(i + 1);
       }
       // elementar case
       if (i == 0) {
           int n = 0;
           while (1 - p(0, n) != 0) {
               n++;
           }
           gMap.put(1, n);
           return n;
       }
       // all other cases
       else {
           int n = 0;
           while (1 - p(muef(i - 1) + 1, n) != 0) {
               n++;
           }
           gMap.put(i + 1, n);
           return n;
       }
   }
   private int p(int r, int y) {
       if (r <= y && goedelisierung3erSystem.isNumberGoedelNumber(y)) {
           return 1;
       } else {
           return 0;
       }
   }

}

public class KFunction {

   private Goedelisierung3erSystem goedelisierung3erSystem;
   private MueFunction mueFunction;
   public KFunction(Goedelisierung3erSystem goedelisierung3erSystem) {
       this.goedelisierung3erSystem = goedelisierung3erSystem;
       this.mueFunction = new MueFunction(goedelisierung3erSystem);
   }
   public String getWordForGoedelIndex(int goedelIndex){
       int goedelNumber = mueFunction.muef(goedelIndex);
       return goedelisierung3erSystem.getWordFromGoedelNumber(goedelNumber);
   }

}


Implementierung der Kreativaufgabe (JavaScript)


A*-Klasse

Number Converter

µ-rekursive Funktion

  • S = {a, b}
  • Verschlüsselung im 3er-System mit a -> 1 und b -> 2