autotool-Aufgaben zum Pumping-Lemma für kontextfreie Sprachen

$Id: pump.html,v 1.1.1.1 2002/05/24 10:46:47 challenger Exp $

Vorwort

Die Pumping-Eigenschaft für eine Sprache L besagt:

Es gibt eine Zahl n > 0, so daß für alle w in L mit |w| >= n gilt: es existieren Wörter u, v, x, y, z mit

Die Verneinung dieser Eigenschaft ist:

Für alle Zahlen n > 0 existiert ein Wort w in L mit |w| >= n, so daß für alle Wörter u,v,x,y,z gilt:

Der Student soll sich, für vorgelegte Sprache L, für eine der beiden Versionen entscheiden, und die Begründung dafür durch das autotool prüfen lassen.

Idealerweise belegt das Korrekturprogramm die All-Quantoren (durch Würfeln oder vollständiges Probieren), und der Student belegt die Existenz-Quantoren (durch Nachdenken).

Allerdings hängt die Belegung der inneren Existenz-Quantoren von den umgebenden All-quantifizierten Variablen ab. Der Student muß also skolemisieren, d. h. seine Belegung als Funktion angeben. Das geschieht in der professionellen Version.

Da wir jedoch derzeit nicht voraussetzen können, daß alle Studenten Haskell-Funktionen schreiben können, gibt es die Standard-Version, bei der es genügt, nur eine Liste einiger Argument-Wert-Paare der Funktion anzugeben.


Standard-Version

(Quelltexte)

Einzusenden ist ein Datum des Typs Pump:

data Pump = Nein
	     { wort :: FiniteMap Int String }
	  | Ja
	     { n :: Int
	     , zerlege :: FiniteMap String Zerlegung 
	     }

Pump-Eigenschaft widerlegen

Wenn Sie der Meinung sind, daß die vorgelegte Sprache L die Pumping-Eigenschaft nicht erfüllt, dann schreiben Sie
import Pump
student = Nein { wort = listToFM [ ( n1, w1 ), ( n2, w2 ), .. ] }
Dabei ist wort eine Funktion, die als Liste von (Argument, Wert)-Paaren angegeben wird. Dabei soll für alle Paare (n :: Int, w :: String) gelten:

Pump-Eigenschaft bestätigen

Wenn Sie der Meinung sind, daß die vorgelegte Sprache L die Pump-Eigenschaft erfüllt, dann schreiben Sie
import Pump
student = Ja 
        { n = 3
	, zerlege = listToFM
	    [ ("abb", Zerlegung { u = "", v = "ab", x = "b", y ="", z = "" } )
            , ..
            ]
        }
wobei zerlege eine Funktion (als Liste von geordneten Paaren) ist, so daß für alle Paare (w, (u,v,x,y,z)) aus der Liste gelten soll:

Scores

Für Ja-Antworten zählt die Größe n, und für Nein-Antworten die Summe der Längen der Funktionswerte von 1 bis 10. (Beides als Low-Score.)

Professionelle Version

(Quelltexte)

Einzusenden ist ein Datum des Typs Pump:

data Pump = Nein
	     { schnitt :: NFA Int
	     , wort :: Int -> String
	     , expo :: Int -> Zerlegung -> Int
	     }
	  | Ja
	     { n :: Int
	     , zerlege :: String -> Zerlegung
	     }

Pump-Eigenschaft widerlegen

Die Kontraposition des Pumping-Lemmas wird benutzt, um nachzuweisen, daß eine Sprache L nicht kontextfrei ist. Oft betrachtet man die Pumping-Eigenschaft nicht von L selbst, sondern von L' = Durchschnit von L mit einer geeignet gewählten regulären Sprache R.

Wenn Sie der Meinung sind, daß es eine reguläre Sprache R gibt, so daß L' = L geschnitten mit R die Pumping-Eigenschaft nicht erfüllt, dann schreiben Sie

import Pump
student = Nein 
	{ schnitt = build "( 0^* 1^* )^2"
   	, wort = wo
   	, expo = ex
	} 
wo n = replicate n '0' ++ replicate n '1'
ex n zer = 3
Die Komponenten `wort' und `expo' sind Funktionen.

Für alle w = wort n und i = expo n ( Zerlegung u v x y z ) soll gelten

Pump-Eigenschaft bestätigen

Wenn Sie der Meinung sind, daß die vorgelegte Sprache L die Pump-Eigenschaft erfüllt, dann schreiben Sie
import Pump
student = Ja 
        { n = 3
	, zerlege = zer
        }
zer w = Zerlegung { u = w, v = "", x = "", y = "", z = "" }
Dabei ist die Komponente `zerlege' eine Funktion, die zum einem beliebigen Wort w in L eine Zerlegung u v x y z konstruiert, so daß gilt:

Scores

Für Ja-Antworten zählt die Größe n, und für Nein-Antworten die Summe der Längen der Wörter [ wort k | k <- [ 1 .. 10 ] ]. (Beides als Low-Score.)