Pontus Johansson 1 grammatiker 21.1 G 1 (BBS 7)
Pontus Johansson 2 dagens föreläsning definitioner kontextfria regler (cfg) hur implementerar man cfg i prolog? vänsterrekursion
Pontus Johansson 3 definitioner några lingvistiska förkortningar: s = sentence np = noun phrase vp = verb phrase det = determiner n = noun v = verb
Pontus Johansson 4 np np = noun phrase (noun group) pelle flyger… en skabbig hund grubblar… hon sparras… tre bra band från seattle spelar… en tuff tvättbjörn som oskar äter…
Pontus Johansson 5 np (forts.) ett ”bevis” på att vissa ord hänger ihop inom samma np tycks alltså vara att de uppstår i liknande syntaktiska kontexter (t ex följs av ett verb) men individuella ord inom frasen behöver nödvändigtvis inte kunna det…
Pontus Johansson 6 np (forts.) *skabbig grubblar… *från spelar… *tuff äter…
Pontus Johansson 7 modell matematiska modeller –kontextfri grammatik (cfg), eller –frasstrukturgrammatik, och sägs vara i –backus-naur form (bnf) grundidé är hur som helst: –regler + ett lexikon
Pontus Johansson 8 definitioner (forts.) ett språk är en ändlig mängd satser en sats är en lista av terminaler… …som ingår i ett alfabete (en mängd av terminaler) en grammatik är en ändlig samling regler som definierar ett språk regler består av terminaler och icke- terminaler
Pontus Johansson 9 regler En kontextfri regel har formen: X 0 -> X 1 … X n där X 0 är en icke-terminal och X i är terminaler ELLER icke-terminaler
Pontus Johansson 10 regler (forts.) en icke-terminal återfinns i vänsterled (kallas också fras eller kategori) en terminal finns aldrig i vänsterledet, och utgörs typiskt av ord/element i lexikon/alfabete.
Pontus Johansson 11 exempel s -> np vp np -> det n vp -> v np det -> en n -> hund n -> bil v -> jagar ”en hund jagar en bil”
Pontus Johansson 12 trädrepresentation (’parse tree’) s npvp vnp det n n enhundjagarenbil terminaler icke-terminaler s -> np vp np -> det n vp -> v np det -> en n -> hund n -> bil v -> jagar
Pontus Johansson 13 cfg i prolog (1) % append version append([],L,L). append([H|T],L2,[H|L3]) :- append(T,L2,L3). s(Z) :- np(X), vp(Y), append(X,Y,Z). np(Z) :- det(X), n(Y), append(X,Y,Z). vp(Z) :- v(X), np(Y), append(X,Y,Z). det([en]). n([hund]). n([bil]). v([jagar]). s([en,hund,jagar,en,bil]) np([en,hund]) vp([jagar,en,bil]) append( [en,hund], [jagar,en,bil], [en,hund,jagar,en,bil] ) np([en,hund]) det([en]) n([hund]) append([en],[hund],[en,hund]) vp([jagar,en,bil]) v([jagar]) np([en,bil]) append([jagar],[en,bil],[jagar,en,bil])
Pontus Johansson 14 cfg i prolog (2) % difference list version s(List1, Rest) :- np(List1, List2), vp(List2, Rest). np(List,Rest) :- det(List,List2), n(List2,Rest). vp(List,Rest) :- v(List,List2), np(List2,Rest). det([en|Rest],Rest). n([hund|Rest],Rest). v([jagar|Rest],Rest). n([bil|Rest],Rest). skillnaden mellan List1 och Rest är en s om: skillnaden mellan List1 och List2 är en np, och skillnaden mellan List2 och Rest är en vp. npvpRest List2 List1 s
Pontus Johansson 15 körning… ?- s([en,bil,jagar,en,hund],[]). yes ?- s([en,bil,jagar,en,hund|[]],[]). yes ?- s([en,bil,jagar,en,hund,jättefort],[]). no ?- s([en,bil,jagar,en,hund,jättefort],Rest). Rest = [jättefort] ?- s([en,bil,jagar,en,hund,jättefort],[jättefort]). yes
Pontus Johansson 16 [en,hund][jagar,en,bil][jättefort] List2 List1 s
Pontus Johansson 17 cfg i prolog dcg = definite clause grammar (nästa föreläsning!) ”syntaktiskt socker för att dölja differenslistornas notation”
Pontus Johansson 18 cfg i prolog (3) % DCG (CFG) version s --> np,vp. np --> det,n. vp --> v,np. det --> [en]. n --> [hund]. v --> [jagar]. n --> [bil]. %difference list version s(List1, Rest) :- np(List1, List2), vp(List2, Rest). np(List,Rest) :- det(List,List2), n(List2,Rest). vp(List,Rest) :- v(List,List2), np(List2,Rest). det([en|Rest],Rest). n([hund|Rest],Rest). v([jagar|Rest],Rest). n([bil|Rest],Rest). % append version append([],L,L). append([H|T],L2,[H|L3]) :- append(T,L2,L3). s(Z) :- np(X), vp(Y), append(X,Y,Z). np(Z) :- det(X), n(Y), append(X,Y,Z). vp(Z) :- v(X), np(Y), append(X,Y,Z). det([en]). n([hund]). n([bil]). v([jagar]).
Pontus Johansson 19 mer cfg hur utökar vi vårt språk? vp --> v, np, adv. adv --> [jättefort].
Pontus Johansson 20 körning… ?- s([en,bil,jagar,en,hund,Hur],[]). Hur = jättefort
Pontus Johansson 21 körning… språket blir dubbelt så stort! ?- s(X,[]). X = [en,bil,jagar,en,bil] ? ; X = [en,bil,jagar,en,hund] ? ; X = [en,bil,jagar,en,bil,jättefort] ? ; X = [en,bil,jagar,en,hund,jättefort] ? ; X = [en,hund,jagar,en,bil] ? ; X = [en,hund,jagar,en,hund] ? ; X = [en,hund,jagar,en,bil,jättefort] ? ; X = [en,hund,jagar,en,hund,jättefort] ? ; no
Pontus Johansson 22 användning parsning –testar om en sträng accepteras av grammatiken (dvs om den ”känns igen”) –egentligen ska parsern ge info om strukturen (t ex genom ett parseträd) också… ?- s([en,hund,jagar,en,bil],[]). yes generering –låter grammatiken generera strängar (parsningens motsats) ?- s(Generated,[]). Generated = [en,hund,jagar,en,bil]
Pontus Johansson 23 en grammatik till % satser s --> np, vp. % verbfraser vp --> v. vp --> v, np. vp --> vp, pp. % nominalfraser np --> namn. np --> pron. np --> n. np --> det, n. % prepositionsfraser pp --> prep, np.
Pontus Johansson 24 en grammatik till (forts.) n --> [hund]. n --> [kastrull]. det --> [en]. v --> [kastar]. v --> [sover]. namn --> [pelle]. pron --> [han]. prep --> [på].
Pontus Johansson 25 några exempel en hund kastar en kastrull på pelle pelle sover han kastar en hund på en kastrull en hund sover pelle på han en kastrull kastar etc…
Pontus Johansson 26 vänsterrekursion vp --> vp, pp. kan få prolog i oändlig loop vp(List,Rest) :- vp(List,List2), pp(List2,Rest). vp(List,… etc…
Pontus Johansson 27 vänsterrekursion (forts.) vp --> v. vp --> v, np. vp --> vp, pp. vad innebär detta? ”efter varje vp kan en pp följa” vp --> v, somePP.% skriv om med ”somePP” vp --> v, np, somePP.% skriv om med ”somePP” somePP --> []. somePP --> pp.
Pontus Johansson 28 vänsterrekursion (forts.) obs! vänsterrekursion är ett prolog- problem (alltså inte ett lingvistiskt problem) –deklarativt är det ok –procedurellt är det inte ok alla vänsterrekursiva grammatiker kan skrivas om till icke- vänsterrekursiva grammatiker
Pontus Johansson 29 mixa terminaler och icke- terminaler n --> [dog]. n --> n1, [t2], n3, [t4]. n([dog|Rest],Rest). n(List1, Rest) :- n1(List1, [t2|List3]), n3(List3, [t4|Rest]).
Pontus Johansson 30 nästa föreläsning mer om dcg –argument –prologanrop från dcg –och lite till litteratur –21.2 –G 2.3 –M –(BBS 8)