Ein seltsames Halteanalyseprogramm

Ein neuer Weg zur Bearbeitung des Halteproblems

Zur Erinnerung: Das Halteproblem besteht darin, eine Funktion (mit Funktionsdefinition) zu entwickeln, mit der man testen kann, ob eine übergebene Funktion bei der Verarbeitung übergebener Daten hält oder nicht.

Black Box

Die Entwicklung einer geeigneten Funktionsdefinition für die Funktion istHaltend scheint schwierig - vielleicht sogar unmöglich - zu sein.

Wir schlagen daher hier einen anderen Weg ein. Wir nehmen an, wir hätten eine geeignete Funktionsdefinition für die Funktion istHaltend:

def istHaltend(quelltext, daten):
    ...
    return ...

Ziel ist es jetzt, Konsequenzen aus dieser Annahme zu ziehen.

Halteverhalten bei der Verarbeitung des eigenen Quelltextes

Mit der Funktion istHaltend kann man u.a. testen, wie sich ein Programm verhält, wenn es den eigenen Quelltext analysiert.

# Funktionsdefinitionen

def istHaltend(quelltext, daten):
    ...
    return ...

# Funktionsaufruf

quelltextEnthaeltWhile = """
def enthaeltWhile ( quelltext ) :   
    tokenliste = quelltext . split ( )
    gefunden = False
    for token in tokenliste :
        if token == 'while' :
            gefunden = True 
    return gefunden
"""
print(istHaltend(quelltextEnthaeltWhile, quelltextEnthaeltWhile))

Aufgabe 1

(a) Warum müsste hier der Wert True ausgegeben werden?

(b) Konstruiere einen Beispielquelltext, bei dem der Wert False ausgegeben wird.

Ein Programm zur Umkehr des Halteverhaltens

Die Funktion umkehrHalteverhalten ist etwas seltsam konzipiert.

def umkehrHalteverhalten (quelltext):

    def istHaltend(quelltext, daten):
        ...
        return ...

    if istHaltend(quelltext, quelltext) == True:
        while True:
            pass
    else:
        return False

Aufgabe 2

(a) Welches Ergebnis erwartest du beim folgenden Beispielaufruf?

# Funktionsdefinitionen

def umkehrHalteverhalten(quelltext):

    def istHaltend(quelltext, daten):
        ...
        return ...

    if istHaltend(quelltext, quelltext) == True:
        while True:
            pass
    else:
        return False

# Funktionsaufruf

quelltextEnthaeltWhile = """
def enthaeltWhile ( quelltext ) :   
    tokenliste = quelltext . split ( )
    gefunden = False
    for token in tokenliste :
        if token == 'while' :
            gefunden = True 
    return gefunden
"""
print(umkehrHalteverhalten(quelltextEnthaeltWhile))

(b) Welches Ergebnis erwartest du hier?

# Funktionsdefinitionen

def umkehrHalteverhalten(quelltext):

    def istHaltend(quelltext, daten):
        ...
        return ...

    if istHaltend(quelltext, quelltext) == True:
        while True:
            pass
    else:
        return False

# Funktionsaufruf

quelltextLoop = """
def loop (quelltext):   
    while True:
        pass
    return True
"""
print(umkehrHalteverhalten(quelltextLoop))

(c) Und welches Ergebnis ergibt sich hier?

# Funktionsdefinitionen

def umkehrHalteerhalten(quelltext):

    def istHaltend(quelltext, daten):
        ...
        return ...

    if istHaltend(quelltext, quelltext) == True:
        while True:
            pass
    else:
        return False

# Funktionsaufruf

quelltextUmkehrHalteverhalten = """
def umkehrHalteverhalten(quelltext):

    def istHaltend(quelltext, daten):
        ...
        return ...

    if istHaltend(quelltext, quelltext) == True:
        while True:
            pass
    else:
        return False
"""
print(umkehrHalteverhalten(quelltextUmkehrHalteverhalten))
X

Fehler melden

X

Suche