UPPSALA UNIVERSITET Föreläsningsanteckningar Institutionen för lingvistik och filologi Grundläggande datalogi II Mats Dahllöf http://stp.ling.uu.se/~matsd/uv/uv04/gd2/ September 2004 4 Strängarnas matematik Området matematisk lingvistik kan sägas handla om den abstrakta matematiska teorin bakom formella grammatiker. Språk förstås här som mängder av ändliga sekvenser av symboler (strängar). På så sätt abstraherar vi bort från allt som handlar om att språk är meningsfulla och används för olika syften. Den matematiska lingvistiken och dess språkbegrepp ligger på så sätt ganska lång bort ifrån den vanliga språkvetenskapens fokus. 4.1 Alfabet, strängar och strängars längd Vi utgår alltid från en ändlig mängd enkla symboler, ett s.k. alfabet, när vi talar om strängar. Elementen i alfabetet är från en grammatiks synvinkel alltså de uttryck som är enkla. Om man tar en typisk grammatik från ett läromedel i formell syntax är således vanliga ord element i alfabetet. Vi har alltså inte att göra med ortografiska alfabet. I den matematiska lingvistikens mer abstrakta exempelfall är dock ofta bokstäver som finns i alfabetet. Vi behöver inte bestämma någonting om vilka objekt som ingår i ett alfabet. Vi talar sedan om strängar över ett alfabet. En sträng över alfabetet T är en ändlig sekvens av objekt som är element i T. Ändliga sekvenser kan vi definiera som funktioner från positiva heltal till objekt. En sträng med längden n över ett alfabet T är således en funktion med definitionsområdet {x x är ett heltal och 1 =< x =< n} (alltså 1 alla heltal från och med 1 och till och med n) och värdeförrådet T. Heltalen pekar ut positioner i strängen, som alltså definieras av vilka symboler som finns på dessa positioner. Exempel: Den sträng som vi på det vanliga komprimerade sättet kan skriva det har regnat hela dagen utgörs egentligen av en funktion, låt oss kalla den S 1, som är sådan att: S 1 (1) = det S 1 (2) = har S 1 (3) = regnat S 1 (4) = hela S 1 (5) = dagen 1 1 =< x =< n betyder givetvis samma sak som 1 =< x och x =< n. 1
Definitionsområdet för S 1 är alltså {1,2,3,4,5}, och dess värdeförråd är {dagen,det,har,hela,regnat} eller en större mängd. S 1 är alltså en sträng över det alfabetet. S 1 kan också skrivas det,har,regnat,hela,dagen. Vi anger att den har längden 5 så här: det, har, regnat, hela, dagen = 5. (Detta sätt att skriva är givetvis lika bra: det har regnat hela dagen = 5.) Mer abstrakta exempel inom matematisk lingvistik kan byggas upp utifrån mycket små lexika, t.ex. är abba en sträng över lexikonet {a, b}. Definitionsområdet för abba är {1,2,3,4}. Längden är givetvis 4, eller med notation: abba = 4. Strängen abba kan lite mer uttryckligt skrivas: a, b, b, a. Den är alltså en funktion S 2, sådan att: S 2 (1) = a, S 2 (2) = b, S 2 (3) = b och S 2 (4) = a. Notationen abba leder till en viss grad av tvetydighet. Exempelvis kan vi inte skilja symbolen a från strängen a (med längden 1). Den strängen kan dock entydigt skrivas: a. (Se även kommentar kring notationen i samband med konkatenering, avsnitt 4.3.) 4.1.1 Tomma strängen: ε Man brukar räkna med att det finns en tom sträng också. Man kan tänka sig den som en motsvarighet till noll i aritmetiken och tomma mängden i mängdläran. Tomma strängen skrivs ε ( vanligt epsilon). ε = 0. (Den har längden noll.) Definitionsområdet för ε är /0, eftersom det inte finns några positioner i den. Oavsett vilket alfabet vi tänker oss, så är ε en sträng över det. I detta sammanhang får vi inte tänka på ε som ett element i ett alfabet, utan ε är namnet på en viss sträng (den tomma strängen). 4.2 Delsträngsrelationer 4.2.1 En fyrställig delsträngsrelation D är en delsträng till en sträng S mellan positionerna i och k om och endast om i och k är två heltal (delsträngens början och positionen efter delsträngens slut i S) som uppfyller villkoren 1 i S, 1 k S + 1, i k, och att det för varje heltal p sådant att i p < k gäller att D(p i + 1) = S(p). Denna uppställning illustrerar detta ganska utförligt. cabac är en delsträng till abbcabaccc mellan 4 och 9: Pos. i D: 1 2 3 4 5 D = c, a, b, a, c Pos. i S: 1 2 3 4 = i 5 6 7 8 9 = k 10 S = a, b, b, c, a, b, a, c, c, c Delstängar är lätta att känna igen. Några fler exempel: abb är en delsträng till abbcabaccc mellan 1 och 4. regnat, hela är en delsträng till det, har, regnat, hela, dagen mellan 4 och 6. 2
Notera även: ε är en delsträng till varje sträng S mellan i och i (i S ). abbcabaccc är en delsträng till abbcabaccc mellan 1 och 11. Det sista påståendet är ett exempel på ett mer generellt förhållande: Varje sträng S är en delsträng till sig själv mellan 1 och S + 1. 4.2.2 Den vanliga tvåställiga delsträngsrelationen D är en delsträng till en sträng S om och endast om det finns två heltal sådana att D är en delsträng till S mellan positionerna i och k. Exemplen ovan har sina motsvarigheter med den vanliga tvåställiga delsträngsrelationen: cabac är en delsträng till abbcabaccc. abb är en delsträng till abbcabaccc. regnat, hela är en delsträng till det, har, regnat, hela, dagen. ε är en delsträng till varje sträng S. abbcabaccc är en delsträng till abbcabaccc. Varje sträng är en delsträng till sig själv. 4.2.3 Prefix D är ett prefix till en sträng S om och endast om det finns ett heltal i sådant att D är en delsträng till S mellan positionerna 1 och i (d.v.s. från början av S och en godtycklig bit in). ε är ett prefix till abbcabaccc. (Generellt: ε är ett prefix till varje sträng.) a är ett prefix till abbcabaccc. ab är ett prefix till abbcabaccc. abb är ett prefix till abbcabaccc. o.s.v. Slutligen: abbcabaccc är ett prefix till abbcabaccc. (Generellt: Varje sträng är ett prefix till sig själv.) det, har är ett prefix till det, har, regnat, hela, dagen. 3
4.2.4 Suffix D är ett suffix till en sträng S om och endast om det finns ett heltal i sådant att D är en delsträng till S mellan positionerna i och S + 1 (d.v.s. från en godtycklig position i S till dess slut). ε är ett suffix till abbcabaccc. (Generellt: ε är ett suffix till varje sträng.) c är ett suffix till abbcabaccc. cc är ett suffix till abbcabaccc. ccc är ett suffix till abbcabaccc. o.s.v. Slutligen: abbcabaccc är ett suffix till abbcabaccc. (Generellt: Varje sträng är ett suffix till sig själv.) hela, dagen är ett suffix till det, har, regnat, hela, dagen. 4.3 Konkatenering av strängar En mycket viktig operation på strängar är ihopsättning, eller som man brukar säga i dessa sammanhang, konkatenering. Konkatenateringen av två strängar S 1 och S 2 är den sträng K sådan att K = S 1 + S 2 och S 1 är ett prefix till K och S 2 är ett suffix till K. K kan i detta fall skrivas S 1 S 2. (Konkatenatering är underförstått när strängar skrivs efter varandra.) hela, dagen det, har, regnat = hela, dagen, det, har, regnat a,b b,a = a,b,b,a (I komprimerad notation: abba = abba.) a,b,b,a a,b,b,a = a,b,b,a,a,b,b,a (I komprimerad notation: abbaabba = abbaabba.) Generellt (för alla S): εs = S och Sε = S. Notera den tvetydighet som den komprimerade notationen för med sig här: Ekvationen a,b b,a = a,b,b,a komprimeras till abba = abba, och vi ser inte var konkateneringen görs. Vi kan t.ex. inte skilja a, b, b a från a, b b, a, men det gör i denna typ av fall ingenting, eftersom det överordnade uttrycket står för samma sträng oavsett vilken syntaktisk tolkning vi väljer. 4.3.1 Multipel självkonkatenering av strängar Det är ofta intressant att konkatenera strängar med sig själva, och att kunna göra detta ett godtyckligt antal gånger. Det finns en speciell notation för detta ändamål, som ser ut som upphöjt till när man räknar med potenser. En sträng upphöjt till en viss tal står för denna sträng taget det antal gånger. Exempel: 4
a 3 = aaa. ba 3 b = baaab. (Siffran opererar bara på a.) (ba) 3 b = bababab. (Här visar vi med parenteser att siffran opererar på ba och inte bara på a.) ε 365 = ε. Följande två satser definierar induktivt (rekursivt) multipel självkonkatenering: S 0 = ε. S i = SS i 1, om i > 0. Uppenbart och generellt (för godtycklig sträng S och godtyckliga naturliga tal i och k) gäller följande: S i = S i. (Varför?) (S i ) k = S i k. (Varför?) 4.4 Språk (mängder av strängar) Inom matematisk lingvistik laborerar vi, som sagt, med ett särskilt språkbegrepp: Ett språk är här en mängd av strängar. Detta har inte nödvändigtvis någonting att göra med språk som människor använder. Chomsky, som införde detta språkbegrepp, ansåg dock att ett mänskligt språk motsvarar en sådan mängd, nämligen mängden av strängar som utgör grammatiska satser. Ur den matematiska lingvistikens perspektiv kan vi dock betrakta språk som abstrakta entititer utan empirisk förankring, och det är det vi skall fortsätta med här. Några enkla exempel: Minsta språket är /0. Ett annat språk är {ε}. {ε, aba, abba, abbba} är ett språk med fyra element. {aba, abba, abbba} är ett språk med tre element. Vi är dock sällan intresserade av så små språk. Vi behöver medel för att definiera större språk. 4.5 Kleenehöljet av ett alfabet (Kleenestjärna I) Kleenehöljet (uppkallat efter logikern Kleene) av ett alfabet är mängden av alla strängar över alfabetet ifråga. Eftersom det inte finns någon begränsning på strängarnas längd blir ett sådant språk oändligt, om nu inte alfabetet är tomma mängden förstås. Kleenehöljet av alfabetet T skrivs T, där stjärnsymbolen kallas Kleenestjärna. Några exempel: 5
/0 = {ε}. {a} = {ε,a,aa,aaa,aaaa,aaaaa,...}. (Ja, här får vi en oändlig mängd.) {a,b} = {ε,a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,bab,bba,...}. (Ännu en oändlig mängd.) 4.6 Ett språk över ett alfabet Ett språk över ett alfabet T är en delmängd (ändlig eller oändlig) av T. Exempel: {ε, a, d, bd, abd, dba, aaaa, ddbbaacc} är ett språk över alfabetet {a,b,c,d,e}. 4.7 Kleenehöljet av en sträng (Kleenestjärna II) Inte bara alfabet, utan även strängar har Kleenehöljen. (Detta gäller, som vi snart skall se, även språk.) Kleenehöljet av en sträng är mängden av alla strängar som utgörs av multipla självkonkateneringar av strängen ifråga, inklusive noll -fallet, ε. Vi kan säga detta lite mer formellt och komprimerat på detta sätt: S = {T i är ett naturligt tal och T = S i }. Några exempel: a b = {ab,aab,aaab,aaaab,...}. (Vi får nästan alltid en oändlig mängd.) (ba) = {ε,ba,baba,bababa,babababa,...}. ε = {ε}. 4.7.1 Plusoperatorn En plusoperator används i detta sammanhang så att S + förstås som en förkortning av SS. Språket S + innehåller alltså alla strängar som skapas av att S tas minst en gång. Om S ε, så ε / S +, medan alltid ε S. Exempel: (ab) + = {ab,abab,ababab,abababab,ababababab,...}. 4.8 Konkatenering av språk Vi talar även om konkatenering av språk (så vi måste hålla reda på om det är två strängar eller två språk som skall konkateneras när vi talat om konkatenering). Konkatenering av språk är dock definierat i termer av strängkonkatenering. Konkateneringen av två språk är sålunda mängden av de strängar som utgör konkateneringen av en godtycklig sträng ur det första givna språket med en godtycklig 6
sträng ur det andra givna språket. Lite mer formellt kan vi uttrycka detta så här, där L 1 L 2 är konkateneringen av de två språken L 1 och L 2. (Som förut uttrycker vi konkatenering genom att bara skriva två uttryck bredvid varandra.) Det gäller för alla strängar S att S L 1 L 2 om och endast om det finns två strängar S 1 och S 2 sådana att S 1 L 1, S 2 L 2 och S = S 1 S 2 (strängkonkatenering kommer in här). Några exempel: {a,b}{a,b} = {aa,ab,ba,bb}. {ε,a,b}{a,b} = {a,b,aa,ab,ba,bb}. {a} {a} = {a}. (Varför?) Generellt (för alla L): /0L = /0 och L/0 = /0. (Varför?) Generellt (för alla L): {ε}l = L och L{ε} = L. (Varför?) Problem: Låt oss tänka oss att vi har två ändliga språk, L och M: Hur förhåller sig LM till L och M? Hur kan LM ML? Visa med ett exempel! 4.9 Multipel självkonkatenering av språk Följande två satser definierar induktivt (rekursivt) multipel självkonkatenering av språk: L 0 = {ε}. L i = LL i 1, om i > 0. Likheten med definitionen av multipel självkonkatenering av strängar är uppenbar. Språket L i är alltså mängden av de strängar som bildas genom att vi konkatenerar i stycken godtyckliga strängar ur språket L. Exempel: {ε,a,b} 2 = {ε,a,b,aa,ab,ba,bb} {ε,a,b} 3 = {ε,a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,bab,bba,bbb} {a,b} 3 = {aaa,aab,aba,abb,baa,bab,bba,bbb} {ab,ba} 2 = {abab,abba,baab,baba} {aaa,bb} 3 = {aaaaaaaaa,aaaaaabb,aaabbaaa,aaabbbb, bbaaaaaa, bbaaabb, bbbbaaa, bbbbbb} 7
4.10 Kleenehöljet av ett språk (Kleenestjärna III) Ett tredje fall då vi använder Kleenestjärna är då vi vill tala om ett språks Kleenehölje. Ett språks Kleenehölje är unionen av alla multipla självkonkateneringar av språket ifråga. Med andra ord är det mängden av alla strängar som vi kan bilda genom att konkatenera ett godtyckligt antal godtyckliga strängar ur språket ifråga. L = {S i är ett naturligt tal och S L i }. Några exempel: {ba,c} = {ε,ba,c,baba,bac,cba,cc,bababa,babac,...}. {ε} = {ε}. {a} {b} = {ε,a,b,aa,ab,bb,aaa,aab,abb,bbb,...}. Kleenehöljet av en sträng kan lätt definieras i termer av Kleenehöljet av ett språk: Om S är en sträng, så är S = {S}. 4.10.1 Plusoperatorn, igen Notationen med plusoperator används även i detta sammanhang så att L + förstås som en förkortning av LL. Språket L + innehåller alltså alla strängar som består av konkateneringen av ett godtyckligt antal större än noll godtyckliga strängar från språket L. Exempel: {a,b} + = {a,b,aa,ab,ba,bb,...} 4.11 Antalsmässiga restriktioner på strängars utseende Ett kraftfullt sätt att definiera språk är att uttrycka antalsmässiga restriktioner på strängars utseende med hjälp av notationen för multipel självkonkatenering. Uttrycket a n b n står för språket som innehåller alla strängar som består av ett godtyckligt antal a följt av precis lika många b. Lite mer formellt uttryckt: a n b n = {S i är ett naturligt tal och S = a i b i }. Detta är alltså vad vi får: a n b n = {ε,ab,aabb,aaabbb,aaaabbbb,aaaaabbbbb,...}. Vi kan givetvis generalisera notationen på detta sätt: a n b n c n = {ε,abc,aabbcc,aaabbbccc,aaaabbbbcccc,aaaaabbbbbccccc,...}. Språk som a n b n och a n b n c n och detta notationssätt spelar stor roll i den matematiska lingvistikens resonemang. 2 2 Spr åket a n b n är kontextfritt, men ej regulj ärt. Spr åket n ab n c n är inte kontextfritt. 8
4.12 Vanliga mängdoperationer på språk Eftersom språk är mängder av strängar kan vi givetvis definiera ett nytt språk utifrån två givna med hjälp av de vanliga mängdoperationerna. Om vi exempelvis vill definiera språket som innehåller alla stränga över {a, b} som börjar och slutar med samma bokstav, så kan vi uttrycka det på detta sätt: {a,b} ({a}{a,b} {a}) ({b}{a,b} {b}) = {a,b,aa,bb,aaa,aba,bab,bbb,aaaa,aaba,...}. Några exempel på sanna påståenden om unioner av språk: {a,b} {c} = {ε,a,b,c,aa,ab,ba,bb,cc,aaa,aab,aba,abb, baa,bab,bba,bbb,ccc,...}. (Uppräkning efter stigande längd.) {a,b,c} {aa,bb} = {a,b,c}. (Varför?) Vi borde också kunna försäkra oss om sanningshalten i följande utsagor om snitten mellan språk: {a,b} {c} = /0. (aaab ) (a bbb) = {aaabbb}. (aaab c ) (a bbbc ) = {aaabbbc }. (aa) (aaa) = (aaaaaa). (Varför?) Även differensoperationen är användbar. Om vi t.ex. vill definiera språket som innehåller alla strängar av a och b med minst en förekomst av vardera symbol, så kan vi göra så här: ({a,b} a ) b = {ab,baaab,aba,abb,baa,bab,bba,...}. Några fler exempel: {a,b} ({a,b} b) = ({a,b} a) {ε}. 9