Programowanie w Logice Gramatyki metamorficzne. Przemysław Kobylański na podstawie [CM2003] i [SS1994]

Podobne dokumenty
Języki formalne i automaty Ćwiczenia 1

Wprowadzenie do programowania języki i gramatyki formalne. dr hab. inż. Mikołaj Morzy

JAO - lematy o pompowaniu dla jezykow bezkontekstowy

Matematyczne Podstawy Informatyki

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

JAO - Wprowadzenie do Gramatyk bezkontekstowych

Gramatyki rekursywne

Języki i gramatyki formalne

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

Hierarchia Chomsky ego Maszyna Turinga

JĘZYKIFORMALNE IMETODYKOMPILACJI

Języki formalne i automaty Ćwiczenia 2

GRAMATYKI BEZKONTEKSTOWE

Wprowadzenie: języki, symbole, alfabety, łańcuchy Języki formalne i automaty. Literatura

11 Probabilistic Context Free Grammars

Gramatyki (1-2) Definiowanie języków programowania. Piotr Chrząstowski-Wachjtel

Języki formalne i automaty Ćwiczenia 9

Symbol, alfabet, łańcuch

Definiowanie języka przez wyrażenie regularne(wr)

JĘZYKI FORMALNE I METODY KOMPILACJI

Języki formalne i automaty Ćwiczenia 4

Gramatyki grafowe. Dla v V, ϕ(v) etykieta v. Klasa grafów nad Σ - G Σ.

Jaki język zrozumie automat?

Języki, automaty i obliczenia

Parsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Języki formalne i automaty Ćwiczenia 3

Automat ze stosem. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

3.4. Przekształcenia gramatyk bezkontekstowych

Gramatyka operatorowa

Programowanie w Logice

Programowanie w logice Prolog 2

Wprowadzenie do logiki Zdania, cz. III Język Klasycznego Rachunku Predykatów

Języki i operacje na językach. Teoria automatów i języków formalnych. Definicja języka

Matematyczne Podstawy Informatyki

Lista 5 Gramatyki bezkontekstowe i automaty ze stosem

Monoidy wolne. alfabetem. słowem długością słowa monoidem wolnym z alfabetem Twierdzenie 1.

JĘZYKI FORMALNE I METODY KOMPILACJI

Nierówność Krafta-McMillana, Kodowanie Huffmana

Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.

Metody Kompilacji Wykład 3

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Hierarchia Chomsky ego

Programowanie w Logice

Kompresja bezstratna. Entropia. Kod Huffmana

10. Translacja sterowana składnią i YACC

Języki formalne i automaty Ćwiczenia 6

Teoretyczne Podstawy Informatyki

JIP. Analiza składni, gramatyki

Semantyka rachunku predykatów

Gramatyki regularne i automaty skoczone

Metodologie programowania

Przykłady zdań w matematyce. Jeśli a 2 + b 2 = c 2, to trójkąt o bokach długości a, b, c jest prostokątny (a, b, c oznaczają dane liczby dodatnie),

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

złożony ze słów zerojedynkowych o długości co najmniej 3, w których druga i trzecia litera od końca sa

Matematyczna wieża Babel. 4. Ograniczone maszyny Turinga o językach kontekstowych materiały do ćwiczeń

(j, k) jeśli k j w przeciwnym przypadku.

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

- Dla danego zbioru S zbiór wszystkich jego podzbiorów oznaczany symbolem 2 S.

Jerzy Nawrocki, Wprowadzenie do informatyki

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Przykład: Σ = {0, 1} Σ - zbiór wszystkich skończonych ciagów binarnych. L 1 = {0, 00, 000,...,1, 11, 111,... } L 2 = {01, 1010, 001, 11}

Algorytmy zwiazane z gramatykami bezkontekstowymi

0-0000, , , itd

KATEDRA INFORMATYKI TECHNICZNEJ. Ćwiczenia laboratoryjne z Logiki Układów Cyfrowych. ćwiczenie 204

ZADANIA Z AUTOMATU SKOŃCZONEGO SPRAWOZDANIE NR 4

Algorytmy stochastyczne, wykład 05 Systemy Liendenmayera, modelowanie roślin

Zadanie analizy leksykalnej

Analiza metodą zstępującą. Bartosz Bogacki.

Rozwiązania około dwustu łatwych zadań z języków formalnych i złożoności obliczeniowej i być może jednego chyba trudnego (w trakcie tworzenia)

Programowanie w logice

Języki formalne i automaty Ćwiczenia 8

Interpretacja Niech U będzie zbiorem formuł takim, że zbiór {p 1,..., p k } jest zbiorem wszystkich symboli predykatywnych, {f 1,..., f l } jest zbior

Rachunek predykatów. Formuły rachunku predykatów. Plan wykładu. Relacje i predykaty - przykłady. Relacje i predykaty

Programowanie w Logice Przykłady programów. Przemysław Kobylański

Klasyczne i kwantowe podejście do teorii automatów i języków formalnych p.1/33

Języki programowania zasady ich tworzenia

Gramatyki atrybutywne

Dopełnienie to można wyrazić w następujący sposób:

Semantyka rachunku predykatów pierwszego rzędu. Dziedzina interpretacji. Stałe, zmienne, funkcje. Logika obliczeniowa.

Składnia rachunku predykatów pierwszego rzędu

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Efektywna analiza składniowa GBK

0.1 Lewostronna rekurencja

10110 =

Maszyna Turinga. Algorytm. czy program???? Problem Hilberta: Przykłady algorytmów. Cechy algorytmu: Pojęcie algorytmu

Analiza semantyczna. Gramatyka atrybutywna

1. Składnia. Logika obliczeniowa - zadania 1 SKŁADNIA Teoria

Maszyna Turinga języki

Teoria układów logicznych

Efektywny parsing języka naturalnego przy użyciu gramatyk probabilistycznych

Wygra Polska czy Brazylia, czyli o tym jak zwięźle zapisywać informacje

Wykład 5. Jan Pustelnik

Rozważmy funkcję f : X Y. Dla dowolnego zbioru A X określamy. Dla dowolnego zbioru B Y określamy jego przeciwobraz:

Programowanie logiczne a negacja

Klasyczny rachunek predykatów

W pewnym mieście jeden z jej mieszkańców goli wszystkich tych i tylko tych jej mieszkańców, którzy nie golą się

Zadanie 1. (6 punktów) Słowo w nazwiemy anagramem słowa v jeśli w można otrzymać z v poprzez zamianę kolejności liter. Niech

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Programowanie w Logice Struktury danych (Lista 2)

Transkrypt:

Programowanie w Logice Gramatyki metamorficzne Przemysław Kobylański na podstawie [CM2003] i [SS1994]

Gramatyki bezkontekstowe Gramatyką bezkontekstową jest uporządkowana czwórka G = Σ, N, S, P, gdzie Σ jest skończonym i niepustym alfabetem (symbole terminalne) T jest skończonym i niepustym zbiorem symboli nieterminalnych S T jest wyróżnionym nieterminalem nazywanym symbolem początkowym P jest skończonym zbiorem reguł produkcji postaci n w, gdzie n N oraz w (Σ N) Jeśli u = u nu, dla u, u (Σ N), oraz n w P, to mówimy, że słowo v = u wu jest w jednym kroku wyprowadzalne ze słowa u, co zapisujemy u v.

Gramatyki bezkontekstowe Niech będzie domknięciem tranzytywnym relacji wyprowadzenia. Mówimy, że słowo w Σ jest wyprowadzalne w gramatyce G, jeśli S w. Język wszystkich słów wyprowadzalnych w gramatyce S oznaczamy przez L(G): L(G) = {w Σ S w}. Symbolem ε będziemy oznaczać słowo puste.

Gramatyki bezkontekstowe Example (Język palindromów) Niech G = Σ, N, S, P, gdzie Σ = {a, b} N = {S} P = {S ε, S a, S b, S asa, S bsb} Wówczas język L(G) składa się z palindromów nad alfabetem {a, b}: L(G) = {ε, a, b, aa, bb, aaa, aba, bab, bbb, aaaa, abba, baab, bbbb,...}

Gramatyki bezkontekstowe Example (Język poprawnie rozstawionych nawiasów) Niech G = Σ, N, S, P, gdzie Σ = {(, )} N = {S} P = {S ε, S (S)S} Wówczas język L(G) składa się ze słów w których poprawnie rozstawiono nawiasy: L(G) = {ε, (), ()(), (()), ()()(), ()(()), (())(), (()()), ((())),...}

Gramatyki bezkontekstowe Example (Prosta gramatyka zdań języka angielskiego) Niech G = Σ, N, zdanie, P, gdzie Σ = {the, apple, man, eats, sings} N = zdanie, fraza_rzecz, fraza_czas, przedimek, rzeczownik, czasownik

Gramatyki bezkontekstowe Example (cd.) P = zdanie fraza_rzecz fraza_czas, fraza_rzecz przedimek rzeczownik, fraza_czas czasownik fraza_rzecz, fraza_czas czasownik, przedimek the, rzeczownik apple, rzeczownik man, czasownik eats, czasownik sings

Gramatyki bezkontekstowe Example (cd.) Wówczas język L(G) składa się z kilkunastu prostych zdań języka angielskiego: the apple eats the apple, the apple eats the man, the apple sings the apple, the apple sings the man, the apple eats, the apple sings, L(G) = the man eats the apple, the man eats the man, the man sings the apple, the man sings the man. the man eats, the man sings

Analiza składniowa w Prologu Spróbujmy napisać analizator w postaci predykatów akceptujących listy słów: z d a n i e (X) : append (Y, Z, X), f r a z a _ r z e c z (Y), f r a z a _ c z a s (Z ). f r a z a _ r z e c z (X) : append (Y, Z, X), przedimek (Y), r z e c z o w n i k (Z ). f r a z a _ c z a s (X) : append (Y, Z, X), czasownik (Y), f r a z a _ r z e c z (Z ). f r a z a _ c z a s (X) : czasownik (X ).

Analiza składniowa w Prologu przedimek ( [ the ] ). r z e c z o w n i k ( [ a p p l e ] ). r z e c z o w n i k ( [ man ] ). czasownik ( [ e a t s ] ). czasownik ( [ s i n g s ] ). Przykłady analizy i syntezy zdań:?- zdanie([the, man, eats, the, apple]). true ; false.?- zdanie(x). X = [the, apple, eats, the, apple] ; X = [the, apple, eats, the, man] ; ERROR: Out of global stack Exception: (8) fraza_czas(_g21)?

Analiza składniowa w Prologu Zapiszemy predykaty w ten sposób aby wydzielały w liście prefiks wyprowadzalny z danego nieterminala i oddawały pozostały sufiks listy: z d a n i e (X, Z) : f r a z a _ r z e c z (X, Y), f r a z a _ c z a s (Y, Z ). f r a z a _ r z e c z (X, Z) : przedimek (X, Y), r z e c z o w n i k (Y, Z ). f r a z a _ c z a s (X, Z) : czasownik (X, Y), f r a z a _ r z e c z (Y, Z ). f r a z a _ c z a s (X, Y) : czasownik (X, Y ).

Analiza składniowa w Prologu przedimek ( [ the X ], X ). r z e c z o w n i k ( [ a p p l e X ], X ). r z e c z o w n i k ( [ man X ], X ). czasownik ( [ e a t s X ], X ). czasownik ( [ s i n g s X ], X ). Przykład syntezy zdań:?- zdanie(x, []). X = [the, apple, eats, the, apple] ; X = [the, apple, eats, the, man] ; X = [the, apple, sings, the, apple] ; X = [the, apple, sings, the, man] ; X = [the, apple, eats] ; X = [the, apple, sings] ; X = [the, man, eats, the, apple] ; X = [the, man, eats, the, man] ; X = [the, man, sings, the, apple] ; X = [the, man, sings, the, man] ; X = [the, man, eats] ; X = [the, man, sings].

Produkcje gramatyki jako klauzule W Prologu produkcje gramatyki można zapisywać wprost w programie: z d a n i e > f r a z a _ r z e c z, f r a z a _ c z a s. f r a z a _ r z e c z > przedimek, r z e c z o w n i k. f r a z a _ c z a s > czasownik, f r a z a _ r z e c z. f r a z a _ c z a s > czasownik. przedimek > [ the ]. r z e c z o w n i k > [ a p p l e ]. r z e c z o w n i k > [ man ]. czasownik > [ e a t s ]. czasownik > [ s i n g s ]. Symbole nieterminalne zapisuje się w takiej postaci jak nazwy predykatów, symbole terminalne podaje się między nawiasami kwadratowymi, strzałkę zapisuje się trzema znakami -->.

Produkcje gramatyki jako klauzule Jeżeli ten sam nieterminal występuje w więcej niż jednej produkcji, to prawe ich strony można połączyć średnikiem (alternatywa): z d a n i e > f r a z a _ r z e c z, f r a z a _ c z a s. f r a z a _ r z e c z > przedimek, r z e c z o w n i k. f r a z a _ c z a s > czasownik, f r a z a _ r z e c z ; czasownik. przedimek > [ the ]. r z e c z o w n i k > [ a p p l e ] ; [ man ]. czasownik > [ e a t s ] ; [ s i n g s ].

Produkcje gramatyki jako klauzule Do analizy i syntezy służą predykaty phrase/2 i phrase/3. W pierwszym przypadku ma on postać phrase(+nieterminal,?listaterminali):?- phrase(zdanie, [the, man, eats, the, apple]). true.?- findall(x, phrase(zdanie, X), L). L = [[the,apple,eats,the,apple],[the,apple,eats,the,man], [the,apple,sings,the,apple],[the,apple,sings,the,man], [the,apple,eats],[the,apple,sings], [the,man,eats,the,apple],[the,man,eats,the,man], [the,man,sings,the,apple],[the,man,sings,the,man], [the,man,eats],[the,man,sings]]

Produkcje gramatyki jako klauzule W drugim przypadku ma on postać phrase(+nieterminal,?listaterminali,?listapozostałychterminali), przy czym trzecim parametrem odbiera się sufiks, który nie jest wyprowadzony z podanego nieterminala:?- phrase(fraza_rzecz, [the, man, eats, the, apple], X). X = [eats, the, apple].?- phrase(zdanie, [the, man, eats, the, apple], X). X = [].

Produkcje gramatyki jako klauzule Example (Język poprawnie rozstawionych nawiasów) W SWI-Prologu, począwszy od wersji 7, aby łańcuch znaków traktowany był w postaci listy kodów należy umieścić go między odwróconymi apostrofami (w starszych wersjach między cudzysłowami). s2 >. s2 > (, s2, ), s2. Dialog:?- phrase(s2, (()) ). true.?- phrase(s2, ())( ). false.

Parametry nieterminali W Prologu nieterminale mogą mieć parametry, dzięki którym nie tylko mogą przeprowadzać analizę składniową ale również dokonywać przekształcenia sparsowanego słowa do postaci prologowego termu (stąd nazwa gramatyki metamorficzne). Example (Kody regularnych drzew binarnych) Regularne drzewa binarne będziemy zapisywać w postaci termów zbudowanych z funktora f/2 (wierzchołki wewnętrzne) i stałej a (liście). Drzewo kodować będziemy w postaci ciągu zer i jedynek w sposób następujący: Liść a kodujemy cyfrą 0. Drzewo f(x, Y) o dwóch poddrzewach X i Y, kodujemy w postaci ciągu złożonego kolejno z cyfry 1, następnie kodu poddrzewa X i na końcu kodu poddrzewa Y.

Parametry nieterminali Example (cd.) Gramatyka metamorficzna dla kodów regularnych drzew binarnych: kod ( a ) > 0. kod ( f (X, Y) ) > 1, kod (X), kod (Y ). Dialog:?- phrase(kod(x), 1100100 ). X = f(f(a, a), f(a, a)).?- phrase(kod(f(f(a, a), a)), X), format( ~s~n, [X]). 11000 X = [49, 49, 48, 48, 48].

Cele umieszczane w produkcjach Do produkcji gramatyki można wstawiać prologowe cele umieszczając je w nawiasach klamrowych. Example (Liczby binarne) b i n (X) > b i n ( 0, X ). b i n (X, X) >. b i n (X, Z) > 0, {Y i s 2 X}, b i n (Y, Z ). b i n (X, Z) > 1, {Y i s 2 X+1}, b i n (Y, Z ). Dialog:?- phrase(bin(n), 101010 ). N = 42.?- phrase(bin(n), 11111111 ). N = 255.

Cele umieszczane w produkcjach Example (Gramatyka metamorficzna głównych liczebników) number ( 0 ) > [ z e r o ]. number (N) > xxx (N ). xxx (N) > d i g i t (D), [ hundred ], rest_xxx (N1 ), {N i s D 100 + N1 }. xxx (N) > xx (N ). rest_xxx ( 0 ) > [ ]. rest_xxx (N) > [ and ], xx (N ). xx (N) > d i g i t (N ). xx (N) > t e e n (N ). xx (N) > t e n s (T), rest_xx (N1 ), {N i s T+N1 }. rest_xx ( 0 ) > [ ]. rest_xx (N) > d i g i t (N ).

Cele umieszczane w produkcjach Example (cd.) d i g i t ( 1 ) > [ one ]. d i g i t ( 2 ) > [ two ]. d i g i t ( 3 ) > [ t h r e e ]. d i g i t ( 4 ) > [ f o u r ]. d i g i t ( 5 ) > [ f i v e ]. d i g i t ( 6 ) > [ s i x ]. d i g i t ( 7 ) > [ s e v e n ]. d i g i t ( 8 ) > [ e i g h t ]. d i g i t ( 9 ) > [ n i n e ]. t e e n (10) > [ ten ]. t e e n (11) > [ e l e v e n ]. t e e n (12) > [ t w e l v e ]. t e e n (13) > [ t h i r t e e n ]. t e e n (14) > [ f o u r t e e n ]. t e e n (15) > [ f i f t e e n ]. t e e n (16) > [ s i x t e e n ]. t e e n (17) > [ s e v e n t e e n ]. t e e n (18) > [ e i g h t e e n ]. t e e n (19) > [ n i n e t e e n ].

Cele umieszczane w produkcjach Example (cd.) t e n s (20) > [ twenty ]. t e n s (30) > [ t h i r t y ]. t e n s (40) > [ f o r t y ]. t e n s (50) > [ f i f t y ]. t e n s (60) > [ s i x t y ]. t e n s (70) > [ s e v e n t y ]. t e n s (80) > [ e i g h t y ]. t e n s (90) > [ n i n e t y ]. Dialog:?- phrase(number(n), [thirteen]). N = 13.?- phrase(number(n), [twenty, five]). N = 25.?- phrase(number(n), [six, hundred, and, sixty, six]). N = 666.

Tłumaczenie zdań na formuły rachunku predykatów Rzeczownikowi własnemu odpowiada prologowa stała np. john. Rzeczownikowi odpowiada jednoargumentowy predykat wyrażający własność np. man(x). Czasownikowi nieprzechodniemu odpowiada jednoargumentowy predykat wyrażający własność np. lives(x). Czasownikowi przechodniemu odpowiada dwuargumentowy predykat wyrażający relację np. loves(x, Y). Przedimkowi every odpowiada kwantyfikator ogólny. Przedimkowi a odpowiada kwantyfikator szczegółowy (egzystencjalny). Fraza rzeczownikowa może zawierać klauzulę względną zaczynającą się od słowa that, która precyzuje rzeczownik podając jego dodatkowe własności i relacje.

f r a z a _ c z a s (X, P) > czasownik_przech (X, Y, P1 ), f r a z a _ r z e c z (Y, P1, P ). f r a z a _ c z a s (X, P) > c z a s o w n i k _ n i e p r z e c h (X, P ). Gramatyki metamorficzne Tłumaczenie zdań na formuły rachunku predykatów : op (900, xfx, =>). : op (800, xfy, &). : op (550, xfy, : ). z d a n i e (P) > f r a z a _ r z e c z (X, P1, P), f r a z a _ c z a s (X, P1 ). f r a z a _ r z e c z (X, P1, P) > przedimek (X, P2, P1, P), r z e c z o w n i k (X, P3 ), k l a u z u l a _ w z g l (X, P3, P2 ). f r a z a _ r z e c z (X, P, P) > rzeczownik_wlasny (X ).

Tłumaczenie zdań na formuły rachunku predykatów k l a u z u l a _ w z g l (X, P1, P1&P2 ) > [ t h a t ], f r a z a _ c z a s (X, P2 ). k l a u z u l a _ w z g l (_, P, P) > [ ]. przedimek (X, P1, P2, a l l (X ) : ( P1=>P2 ) ) > [ e v e r y ]. przedimek (X, P1, P2, e x i s t s (X ) : ( P1&P2 ) ) > [ a ]. r z e c z o w n i k (X, [ man ]. r z e c z o w n i k (X, [ woman ]. man(x) ) > woman(x) ) >

Tłumaczenie zdań na formuły rachunku predykatów rzeczownik_wlasny ( john ) > [ john ]. czasownik_przech (X, Y, [ l o v e s ]. czasownik_przech (X, Y, [ knows ]. c z a s o w n i k _ n i e p r z e c h (X, [ l i v e s ]. l o v e s (X,Y) ) > knows (X,Y) ) > l i v e s (X) ) >

Tłumaczenie zdań na formuły rachunku predykatów Dialog:?- phrase(zdanie(x), [john, lives]). X = lives(john).?- phrase(zdanie(x), [john, knows, john]). X = knows(john, john).?- phrase(zdanie(x), [john, knows, a, woman]). X = exists(g1): (woman(g1)&knows(john, G1)).?- phrase(zdanie(x), [john, loves, every, woman]). X = all(g1): (woman(g1)=>loves(john, G1)).?- phrase(zdanie(x), [every, man, loves, a, woman]). X = all(g1): (man(g1)=>exists(g2): (woman(g2)&loves(g1, G2))).

Tłumaczenie zdań na formuły rachunku predykatów Dialog:?- phrase(zdanie(x), [john, loves, every, woman, that, loves, john]). X = all(g1): (woman(g1)&loves(g1, john)=>loves(john, G1)).?- phrase(zdanie(x), [every, man, loves, every, woman, that, knows, john]). X = all(g1): (man(g1)=>all(g2): (woman(g2)&knows(g2, john)=>loves(g1, G2)))

Tłumaczenie zdań na formuły rachunku predykatów Dialog:?- phrase(zdanie(x), [john, loves, a, woman, that, knows, a, man, that, knows, john]). X = exists(g1): ((woman(g1)&exists(g2): ((man(g2)&knows(g2, john))& knows(g1, G2)))&loves(john, G1))