Lista 3. - Pierwsza

Transkrypt

Lista 3. - Pierwsza
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",!.

Podobne dokumenty