Lista zadań 3 Zadanie 1 Listy liczb naturalnych [n1, n2, …, nk] moŜna traktować jako skończone ciągi tych liczb n:{1,2,…,k} → N. Jak wiadomo list o tych samych elementach, ale nie koniecznie takich samych list, jest nieskończenie wiele. Natomiast tych, które są określone przez ciągi róŜnowartościowe, a więc, które są permutacjami, jest dokładnie k! dla k-elementowej listy. Zdefiniuj a) zbiory elementów takich list, za pomocą relacji przynaleŜności liczby do listy liczb, b) równość zbiorów, c) zawieranie zbiorów, d) sumę zbiorów, e) iloczyn zbiorów, f) róŜnicę zbiorów, g) moc zbiorów. Podaj implementację tych definicji w języku Pascal (lub w Basic albo C++ czy Prolog). Czy metodę zastosowaną w rozwiązaniu moŜna przenieść dla co najwyŜej kelementowych list danych z dowolnej dziedziny? Zadanie 2 Określ w języku Prolog pojecie zbioru liter słów co najwyŜej k-literowych, wykorzystując relację zawierania się jednego słowa w drugim słowie. Określ takŜe działania na tych zbiorach. Skorzystaj z dołączonego do niniejszej listy zadań dodatku. Zadanie 3 Zbiór V = {Λ, S, A, B, 0, 1} , gdzie T = {0, 1} z regułami produkcji: S::= SAB, S::= Λ A::= 0, B::= 1 określa gramatykę bezkontekstową G języka bezkontekstowego L⊆V*. Gdzie, Λ jest słowem pustym, S – literą początkową, zbiór T jest zbiorem symboli terminalnych. Wykorzystując predykat podstawiania jednego tekstu za drugi tekst zawarty w trzecim tekście zdeklarowany w języku Prolog (patrz dodatek), określ reguły produkcji jako predykaty: reguła1(spring,spring), reguła2(spring,spring), reguła3(spring,spring), reguła3(spring,spring). Określ takŜe predykat akceptowalne(spring), ustalający, Ŝe słowo jest generowane przez gramatykę G. Zadanie 4 Zastosuj notację Backusa-Naura do zdefiniowania języka rachunku zdań. Dokonaj wywodu w tej notacji następujących formuł rachunku zdań: a) ((p⇒q)∧r), b) (¬(¬p∧¬q)⇔(p∨q)), c) (p⇒(q⇒(r⇒p))). Dodatek PREDICATES /*deklaracje predykatów */ litera_alfabetu(string) /*predykat uznający litery w jednoelementowych łańcuchach za litery budowanego języka */ litera_terminalna(string) /*predykat ustalajacy, Ŝe litera w jednoelementowym łańcuchu jest literą terminalną */ słowo(string) /* predykat ustalający, Ŝe łańcuch liter jest słowem */ CLAUSES /*deklaracja formuł – klauzul – faktów i reguł */ /* deklaracja liter alfabetu */ litera_alfabetu(""). /* "" - słowo puste */ litera_alfabetu("S"). litera_alfabetu("A"). litera_alfabetu("B"). litera_alfabetu("0"). litera_alfabetu("1"). /* deklaracja liter terminalnych */ litera_terminalna("0"). litera_terminalna("1"). /* deklaracja słów */ słowo(X) :- litera_alfabetu(X). słowo(Z) :- słowo(X), słowo(Y), concat(X,Y,Z). /* concat(X,Y,Z) jest standardowym zapisem tworzącym dla łańcuchów słów X, Y ich konkatenację Z=XY lub dla X,Z znajdujący Y, lub dla Y,Z znajdujący X */ Relacje i operacje na tekstach (łańcuchach znaków, słowach języka) PREDICATES zawieranie(string,string) /* zawieranie(T1,T2) – tekst T1 zawarty jest w tekście T2, np. tekst „bc” zawarty jest w tekście „aabcd” */ podstawienie(string,string,string,string) /* podstawienie(T1,T2,T3,T4) – tekst T4 jest wynikiem podstawienia tekstu T1 za tekst T2 w tekście T3 na pierwszym miejscu, na którym tekst T2 występuje w tekście T3. Np. tekst „aabbc” jest wynikiem podstawienie tekstu „a” za tekst „b” na pierwszym miejscu w tekście „abbbc” , gdzie tekst „b” występuje */ poczatek(string,string,string) /* poczatek(T1,T2,P) – tekst P jest częścią tekstu T2 poprzedzającą występowanie w nim tekstu T1 */ koniec(string,string,string) /* koniec(T1,T2,P) – tekst P jest częścią tekstu T2 następującą po występowaniu w nim tekstu T1 */ podstawienie_globalne(string,string,string,string) /* podstawienie_globalne(T1,T2,T3,T4) – tekst T4 jest wynikiem podstawienia tekstu T1 za tekst T2 w tekście T3 w kaŜdym miejscu, na którym tekst T2 występuje w tekście T3. Np. tekst „aaaac” jest wynikiem podstawienie tekstu „a” za tekst „b” w kaŜdym miejscu w tekście „abbbc” , gdzie tekst „b” występuje */ cyfra(string) /* predykat cyfra(T)rozpoznaje wśród łańcuchów znaków cyfry: „0”, „1”, ...”9” */ ciag_cyfr(string) /* predykat ciag_cyfr(T)rozpoznaje wśród łańcuchów znaków ciągi cyfr: np. „019” */ ciag_cyfr_w_tekscie(string,string,string) /* ciag_cyfr_w_tekscie(T,L,R) – L jest ciągiem cyfr na początku tekstu T, a R jest pozostałą częścią tekstu T */ napis_liczby(string) /* predykat napis_liczby(T) rozpoznaje wśród ciągów cyfr napisy liczb, tj. ciągi cyfr nie zaczynające się od cyfry „0” */ napis_liczby_w_tekscie(string,string,string) /* - predykat rozpoznaje na początku tekstu napis liczby oraz wyróŜnia pozostałą część takstu */ CLAUSES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % ZAWIERANIE TEKSTÓW % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% zawieranie("",""). zawieranie(T1,T2):T2<>"",concat(T1,_,T2); T2<>"",frontStr(1,T2,_,N_T2), zawieranie(T1,N_T2). /* występowanie w argumencie formuły atomowej symbolu „_“ oznacza, Ŝe istnieje jakaś wartość tego argumentu przy której formuła ta zachodzi; wyraŜenie postaci frontStr(1,T2,_,N_T2)oznacza, Ŝe z tekstu T2 została pobrana pierwsza litera i reszta po pobraniu tej litery jest tekstem N_T2; zawieranie tekstów zostało określone rekurencyjnie: 1) tekst pusty zawiera się w tekście pustym, 2) zawieranie tekstu T1 w tekście T2 zachodzi, gdy istnieje jakiś tekst taki, Ŝe konkatenacja T1 z tym tekstem daje tekst T2, jeśli tak nie jest, to sprawdzamy ten warunek po popraniu a tekstu T2 pierwszej litery, a pobieranie liter powtarzamy do momentu uzyskania zawierania, lub do momentu otrzymania tekstu pustego, a wtedy zawieranie nie zachodzi */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% koniec(T1,T2,K):T2<>"",concat(T1,K,T2),!; T2<>"",frontStr(1,T2,_,N_T2), koniec(T1,N_T2,K). /* prosimy o wyjaśnienie powyŜszej reguły: określenie tekstu K, który przy zawieraniu tekstu T1 w tekście T2 jest pozostałą częścią tekstu T2 występującą po pierwszym zakończeniu tekstu T1 (tekst T1 moŜe wystąpić w róŜnych miejscach tekstu T2) */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% poczatek(T1,T2,P):koniec(T1,T2,K),concat(T,K,T2),concat(P,T1,T). /* poczatek(T1,T2,P)- zachodzi przy zawieraniu tekstu T1 w tekście T2; jeśli za pomocą predykatu konkatenacji i predykatu koniec pomniejszymy T2 o koniec K, a tekst który pozostanie pomniejszymy o tekst T1, to otrzymamy szukany początek P występujący w tekście T2 przed tekstem T1; P moŜe być tekstem pustym */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % PODSTAWIANIE TEKSTU ZA TEKST W TEKŚCIE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% podstawienie(T1,T2,T3,T4):T1<>T2, T3<>"", poczatek(T2,T3,P),koniec(T2,T3,K),!, concat(P,T1,T),concat(T,K,T4). /* podstawienie(T1,T2,T3,T4) – pierwsze, jednokrotne, podstawienie tekstu T1 za tekst T2 w tekście T3, w wyniku czego otrzymujemy tekst T4; prosimy o wyjaśnienie podanej reguły */ podstawienie_globalne(T1,T2,T3,T4):podstawienie(T1,T2,T3,N_T3),!, podstawienie_globalne(T1,T2,N_T3,T4); T4=T3,!. /* podstawienie_globalne(T1,T2,T3,T4) – kolejne podstawienia tekstu T1 za tekst T2 w tekście T3 wszędzie tam gdzie tekst T2 występuje przy pierwszym i po następnych podstawieniach, w wyniku czego otrzymujemy tekst T4; prosimy o wyjaśnienie podanej reguły */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % NAPIS LICZBY % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% cyfra("0"). cyfra("1"). cyfra("2"). cyfra("3"). cyfra("4"). cyfra("5"). cyfra("6"). cyfra("7"). cyfra("8"). cyfra("9"). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Rozpoznawanie napisu jako ciągu cyfr %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ciag_cyfr(X):X<>"", cyfra(X),!; X<>"", cyfra(C), concat(C,N_X,X),cyfra(N_X),!; X<>"", cyfra(C), concat(C,N_X,X),!, napis_liczby(N_X). napis_liczby(X):ciag_cyfr(X),frontStr(1,X,C,_),C<>"0",!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Rozpoznawanie ciągu cyfr na początku napisu %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ciag_cyfr_w_tekscie("","",""). ciag_cyfr_w_tekscie(T,L,R):T<>"",ciag_cyfr(T),L=T,R="",!; T<>"", frontStr(1,T,L,R),cyfra(L), frontStr(2,T,L1,_),not(ciag_cyfr(L1)); T<>"", frontStr(1,T,C,N_T), cyfra(C), ciag_cyfr_w_tekscie(N_T,N_L,R), concat(C,N_L,L). napis_liczby_w_tekscie(T,L,R):ciag_cyfr_w_tekscie(T,L,R), frontStr(1,L,C,_),C<>"0",!.