Metody matematyczne w semantyce j˛ezyków programowania
Transkrypt
Metody matematyczne w semantyce j˛ezyków programowania
Metody matematyczne w semantyce j˛ezyków programowania Paweł Waszkiewicz [email protected] Informatyka Teoretyczna Uniwersytet Jagielloński Metody matematyczne w semantyce jezyków ˛ programowania – p. 1/6 Semantyka Semantyka to po prostu znaczenie. Metody matematyczne w semantyce jezyków ˛ programowania – p. 2/6 Semantyka Semantyka to po prostu znaczenie. Gdy mówimy o semantyce (fragmentu) programu, to mamy na myśli oczekiwany wynik, rezultat wykonania programu, który stanowi jego znaczenie. Metody matematyczne w semantyce jezyków ˛ programowania – p. 2/6 Semantyka Semantyka to po prostu znaczenie. Gdy mówimy o semantyce (fragmentu) programu, to mamy na myśli oczekiwany wynik, rezultat wykonania programu, który stanowi jego znaczenie. Na przykład, semantyka˛ fragmentu programu if x = 0 then 1 else x ∗ f (x − 1) jest funkcja silnia. Metody matematyczne w semantyce jezyków ˛ programowania – p. 2/6 Semantyka Semantyka to po prostu znaczenie. Gdy mówimy o semantyce (fragmentu) programu, to mamy na myśli oczekiwany wynik, rezultat wykonania programu, który stanowi jego znaczenie. Na przykład, semantyka˛ fragmentu programu if x = 0 then 1 else x ∗ f (x − 1) jest funkcja silnia. Semantyka jezyka ˛ programowania jest wiec ˛ niczym innym, tylko znaczeniem poszczególnych konstrukcji składniowych definiujacych ˛ jezyk. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 2/6 Trzy style semantyki Semantyka aksjomatyczna. Znaczenie programu definiuje sie˛ aksjomatycznie, podajac ˛ reguły pewnej logiki własności programu. Metody matematyczne w semantyce jezyków ˛ programowania – p. 3/6 Trzy style semantyki Semantyka aksjomatyczna. Znaczenie programu definiuje sie˛ aksjomatycznie, podajac ˛ reguły pewnej logiki własności programu. Semantyka operacyjna. Znaczenie programu definiuje sie˛ podajac ˛ dozwolone kroki obliczeniowe w trakcie wykonania tego programu. Metody matematyczne w semantyce jezyków ˛ programowania – p. 3/6 Trzy style semantyki Semantyka aksjomatyczna. Znaczenie programu definiuje sie˛ aksjomatycznie, podajac ˛ reguły pewnej logiki własności programu. Semantyka operacyjna. Znaczenie programu definiuje sie˛ podajac ˛ dozwolone kroki obliczeniowe w trakcie wykonania tego programu. Semantyka denotacyjna. Określa matematyczny model jezyka ˛ programowania. Znaczenie programu definiuje sie˛ abstrakcyjnie jako element odpowiedniej struktury matematycznej. Metody matematyczne w semantyce jezyków ˛ programowania – p. 3/6 Semantyka operacyjna dana przez indukcyjnie zdefiniowana˛ relacje˛ ewaluacji E⇓V ozn.: program E redukuje sie˛ do wartości V (wartości to wyniki obliczeń programu). Metody matematyczne w semantyce jezyków ˛ programowania – p. 4/6 Semantyka operacyjna dana przez indukcyjnie zdefiniowana˛ relacje˛ ewaluacji E⇓V ozn.: program E redukuje sie˛ do wartości V (wartości to wyniki obliczeń programu). Na przykład, jeśli E jest wyrażeniem boolowskim , to E ⇓ V opisuje sytuacje, ˛ gdy E przyjmuje wartość V ∈ {true, f alse}. Metody matematyczne w semantyce jezyków ˛ programowania – p. 4/6 Semantyka operacyjna dana przez indukcyjnie zdefiniowana˛ relacje˛ ewaluacji E⇓V ozn.: program E redukuje sie˛ do wartości V (wartości to wyniki obliczeń programu). Na przykład, jeśli E jest wyrażeniem boolowskim , to E ⇓ V opisuje sytuacje, ˛ gdy E przyjmuje wartość V ∈ {true, f alse}. Uwaga! Dla programu E może nie istnieć wartość V taka, że E ⇓ V , gdyż nie każdy program E kończy obliczenia. Metody matematyczne w semantyce jezyków ˛ programowania – p. 4/6 Równość programów Dwa programy E1 i E2 sa˛ obserwowalnie równe wtedy i tylko wtedy, gdy C[E1 ] ⇓ V ⇐⇒ C[E2 ] ⇓ V dla wszystkich kontekstów C[·] i wszystkich wartości V . Metody matematyczne w semantyce jezyków ˛ programowania – p. 5/6 Równość programów Dwa programy E1 i E2 sa˛ obserwowalnie równe wtedy i tylko wtedy, gdy C[E1 ] ⇓ V ⇐⇒ C[E2 ] ⇓ V dla wszystkich kontekstów C[·] i wszystkich wartości V . obserwowalna równość jest trudna do sprawdzenia, gdyż definicja wymaga kwantyfikacji po wszystkich kontekstach Metody matematyczne w semantyce jezyków ˛ programowania – p. 5/6 Semantyka denotacyjna Tu każdemu fragmentowi programu E jest przypisana jego denotacja [[E]], czyli matematyczny obiekt reprezentujacy ˛ jego znaczenie Metody matematyczne w semantyce jezyków ˛ programowania – p. 6/6 Semantyka denotacyjna Tu każdemu fragmentowi programu E jest przypisana jego denotacja [[E]], czyli matematyczny obiekt reprezentujacy ˛ jego znaczenie Przykład [[if x = 0 then 1 else x ∗ f (x − 1)]] = ! (silnia). Metody matematyczne w semantyce jezyków ˛ programowania – p. 6/6 Semantyka denotacyjna Tu każdemu fragmentowi programu E jest przypisana jego denotacja [[E]], czyli matematyczny obiekt reprezentujacy ˛ jego znaczenie Przykład [[if x = 0 then 1 else x ∗ f (x − 1)]] = ! (silnia). Obiekt [[E]] ∈ D jest nazywany również znaczeniem, semantyka, ˛ obiektem semantycznym i jest elementem pewnego zbioru D zwanego dziedzina˛ semantyczna˛ lub dziedzina. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 6/6 Semantyka denotacyjna Tu każdemu fragmentowi programu E jest przypisana jego denotacja [[E]], czyli matematyczny obiekt reprezentujacy ˛ jego znaczenie Przykład [[if x = 0 then 1 else x ∗ f (x − 1)]] = ! (silnia). Obiekt [[E]] ∈ D jest nazywany również znaczeniem, semantyka, ˛ obiektem semantycznym i jest elementem pewnego zbioru D zwanego dziedzina˛ semantyczna˛ lub dziedzina. ˛ Cecha˛ charakterystyczna˛ semantyki denotacyjnej jest to, że znaczenie fragmentu programu zależy wyłacznie ˛ od znaczenia jego podfragmentów. Ta cecha semantyki denotacyjnej jest nazywana kompozycyjnościa. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 6/6 Przykład kompozycyjności Majac ˛ dwie funkcje cz˛eściowe [[C]], [[D]] : Stan → Stan oraz funkcje˛ [[B]] : Stan → {true, f alse}, definiujemy: [[if B then C else D ]] = λs ∈ Stan.if ([[B]](s), [[C]](s), [[D]](s)), gdzie x if (b, x, y) := y jeśli b = true, jeśli b = f alse, Metody matematyczne w semantyce jezyków ˛ programowania – p. 7/6 Denotacja złożenia instrukcji Denotacja dwóch nastepuj ˛ acych ˛ po sobie instrukcji (komend, rozkazów) [[C; C ′ ]] := [[C ′ ]] ◦ [[C]] = λs ∈ Stan.[[C ′ ]]([[C]](s)) jest złożeniem dwóch funkcji cz˛eściowych [[C]], [[C ′ ]] : Stan → Stan, które sa˛ denotacjami instrukcji C, C ′ . Metody matematyczne w semantyce jezyków ˛ programowania – p. 8/6 Prosty j˛ezyk imperatywny IMP SKŁADNIA: W yr zbiór wyrażeń boolowskich (ozn. b) Akc zbiór prymitywnych akcji (ozn. a) Zd zbiór zdań (ozn. z) dany przez gramatyk˛e: z ::= a | skip | z;z | (if b then z else z) Metody matematyczne w semantyce jezyków ˛ programowania – p. 9/6 Prosty j˛ezyk imperatywny IMP SKŁADNIA: W yr zbiór wyrażeń boolowskich (ozn. b) Akc zbiór prymitywnych akcji (ozn. a) Zd zbiór zdań (ozn. z) dany przez gramatyk˛e: z ::= a | skip | z;z | (if b then z else z) OBIEKTY SEMANTYCZNE (DZIEDZINY): Bool = {true, f alse} zbiór wart. logicznych (ozn. t) Stan zbiór stanów programu (ozn. s) Roz ⊆ (Stan → Stan) zbiór rozkazów (ozn. θ) Metody matematyczne w semantyce jezyków ˛ programowania – p. 9/6 Prosty j˛ezyk imperatywny IMP DENOTACJA Metody matematyczne w semantyce jezyków ˛ programowania – p. 10/6 Prosty j˛ezyk imperatywny IMP DENOTACJA [[·]] : W yr → (Stan → Bool) jest zadana z góry Metody matematyczne w semantyce jezyków ˛ programowania – p. 10/6 Prosty j˛ezyk imperatywny IMP DENOTACJA [[·]] : W yr → (Stan → Bool) jest zadana z góry [[·]] : Akc → Roz jest zadana z góry Metody matematyczne w semantyce jezyków ˛ programowania – p. 10/6 Prosty j˛ezyk imperatywny IMP DENOTACJA [[·]] : W yr → (Stan → Bool) jest zadana z góry [[·]] : Akc → Roz jest zadana z góry [[·]] : Zd → Roz jest zdefiniowana za pomoca˛ dwóch poprzednich funkcji zgodnie z wymogiem kompozycyjności: Metody matematyczne w semantyce jezyków ˛ programowania – p. 10/6 Prosty j˛ezyk imperatywny IMP DENOTACJA [[·]] : W yr → (Stan → Bool) jest zadana z góry [[·]] : Akc → Roz jest zadana z góry [[·]] : Zd → Roz jest zdefiniowana za pomoca˛ dwóch poprzednich funkcji zgodnie z wymogiem kompozycyjności: [[skip]](s) = s Metody matematyczne w semantyce jezyków ˛ programowania – p. 10/6 Prosty j˛ezyk imperatywny IMP DENOTACJA [[·]] : W yr → (Stan → Bool) jest zadana z góry [[·]] : Akc → Roz jest zadana z góry [[·]] : Zd → Roz jest zdefiniowana za pomoca˛ dwóch poprzednich funkcji zgodnie z wymogiem kompozycyjności: [[skip]](s) = s [[z1 ; z2 ]](s) = [[z2 ]]([[z1 ]](s)) Metody matematyczne w semantyce jezyków ˛ programowania – p. 10/6 Prosty j˛ezyk imperatywny IMP DENOTACJA [[·]] : W yr → (Stan → Bool) jest zadana z góry [[·]] : Akc → Roz jest zadana z góry [[·]] : Zd → Roz jest zdefiniowana za pomoca˛ dwóch poprzednich funkcji zgodnie z wymogiem kompozycyjności: [[skip]](s) = s [[z1 ; z2 ]](s) = [[z2 ]]([[z1 ]](s)) [[if b then z1 else z2 ]](s) = if ([[b]](s), [[z1 ]](s), [[z2 ]](s)) Metody matematyczne w semantyce jezyków ˛ programowania – p. 10/6 Wymagania dla dziedzin „Zwykłe” zbiory nie nadaja˛ sie˛ na dziedziny: przypuśćmy, że rozszerzyliśmy IMP o dodatkowe zdanie z ::= while b do z. Oczekujemy, że: [[while b do z]] = [[if b then z; while b do z else skip]] Metody matematyczne w semantyce jezyków ˛ programowania – p. 11/6 Wymagania dla dziedzin „Zwykłe” zbiory nie nadaja˛ sie˛ na dziedziny: przypuśćmy, że rozszerzyliśmy IMP o dodatkowe zdanie z ::= while b do z. Oczekujemy, że: [[while b do z]] = [[if b then z; while b do z else skip]] Oznaczajac ˛ θ = [[while b do z]], mamy: θ(s) = if ([[b]](s), θ([[z]](s)), s). Metody matematyczne w semantyce jezyków ˛ programowania – p. 11/6 Wymagania dla dziedzin „Zwykłe” zbiory nie nadaja˛ sie˛ na dziedziny: przypuśćmy, że rozszerzyliśmy IMP o dodatkowe zdanie z ::= while b do z. Oczekujemy, że: [[while b do z]] = [[if b then z; while b do z else skip]] Oznaczajac ˛ θ = [[while b do z]], mamy: θ(s) = if ([[b]](s), θ([[z]](s)), s). W szczególnym przypadku jeśli [[b]] = true i z = skip, to θ(s) = θ(s), czyli θ może być dowolna; tymczasem powinna być niezdefiniowana! Metody matematyczne w semantyce jezyków ˛ programowania – p. 11/6 Wymagania dla dziedzin „Zwykłe” zbiory nie nadaja˛ sie˛ na dziedziny: przypuśćmy, że rozszerzyliśmy IMP o dodatkowe zdanie z ::= while b do z. Oczekujemy, że: [[while b do z]] = [[if b then z; while b do z else skip]] Oznaczajac ˛ θ = [[while b do z]], mamy: θ(s) = if ([[b]](s), θ([[z]](s)), s). W szczególnym przypadku jeśli [[b]] = true i z = skip, to θ(s) = θ(s), czyli θ może być dowolna; tymczasem powinna być niezdefiniowana! Wniosek: Funkcja θ powinna być funkcja˛ cz˛eściowa. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 11/6 Wymagania dla dziedzin Każda funkcja cz˛eściowa p : A → B jest równoważna U funkcji totalnej p : A → B⊥ , gdzie B⊥ = B {⊥}. Metody matematyczne w semantyce jezyków ˛ programowania – p. 12/6 Wymagania dla dziedzin Każda funkcja cz˛eściowa p : A → B jest równoważna U funkcji totalnej p : A → B⊥ , gdzie B⊥ = B {⊥}. Zdanie p(x) = ⊥ jest interpretowane jako: p przyjmuje dla argumentu x wartość niezdefiniowana. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 12/6 Wymagania dla dziedzin Każda funkcja cz˛eściowa p : A → B jest równoważna U funkcji totalnej p : A → B⊥ , gdzie B⊥ = B {⊥}. Zdanie p(x) = ⊥ jest interpretowane jako: p przyjmuje dla argumentu x wartość niezdefiniowana. ˛ w tej interpretacji fragment programu majacy ˛ niezdefiniowane znaczenie może być zawarty w programie wiekszym, ˛ posiadajacym ˛ nietrywialna˛ semantyk˛e. Metody matematyczne w semantyce jezyków ˛ programowania – p. 12/6 Wymagania dla dziedzin Każda funkcja cz˛eściowa p : A → B jest równoważna U funkcji totalnej p : A → B⊥ , gdzie B⊥ = B {⊥}. Zdanie p(x) = ⊥ jest interpretowane jako: p przyjmuje dla argumentu x wartość niezdefiniowana. ˛ w tej interpretacji fragment programu majacy ˛ niezdefiniowane znaczenie może być zawarty w programie wiekszym, ˛ posiadajacym ˛ nietrywialna˛ semantyk˛e. Wniosek: dziedziny semantyczne powinny być wyposażone w element ⊥. Interpretacja ⊥ sugeruje, że dowolna funkcja p pomiedzy ˛ dziedzinami powinna spełniać p(⊥) = ⊥. Metody matematyczne w semantyce jezyków ˛ programowania – p. 12/6 Wymagania dla dziedzin Przykład dziedziny: płaskie liczby naturalne N⊥ . x ⊑ y ⇐⇒ (x = ⊥) ∨ (x = y) Metody matematyczne w semantyce jezyków ˛ programowania – p. 13/6 Wymagania dla dziedzin Przykład dziedziny: płaskie liczby naturalne N⊥ . x ⊑ y ⇐⇒ (x = ⊥) ∨ (x = y) Warunek p(⊥) = ⊥ jest równoważny stwierdzeniu, że funkcja p : N⊥ → N⊥ jest monotoniczna. Metody matematyczne w semantyce jezyków ˛ programowania – p. 13/6 Wymagania dla dziedzin Przykład dziedziny: płaskie liczby naturalne N⊥ . x ⊑ y ⇐⇒ (x = ⊥) ∨ (x = y) Warunek p(⊥) = ⊥ jest równoważny stwierdzeniu, że funkcja p : N⊥ → N⊥ jest monotoniczna. Podobnie funkcja if : Bool⊥ × Stan⊥ × Stan⊥ → Stan⊥ definiowana jako: s jeśli b = true, if (b, s, s′ ) := s′ jeśli b = f alse, ⊥ jeśli b = ⊥ jest monotoniczna. Metody matematyczne w semantyce jezyków ˛ programowania – p. 13/6 Wymagania dla dziedzin Wróćmy do semantyki while: pamietaj ˛ ac, ˛ że θ = [[while b do z]], równość: θ(s) = if ([[b]](s), θ([[z]](s)), s) jest w istocie wymaganiem istnienia punktu stałego: θ = F (θ) dla funkcji F = λg.if ([[b]], g ◦ [[z]], 1Stan⊥ ). Metody matematyczne w semantyce jezyków ˛ programowania – p. 14/6 Wymagania dla dziedzin Wróćmy do semantyki while: pamietaj ˛ ac, ˛ że θ = [[while b do z]], równość: θ(s) = if ([[b]](s), θ([[z]](s)), s) jest w istocie wymaganiem istnienia punktu stałego: θ = F (θ) dla funkcji F = λg.if ([[b]], g ◦ [[z]], 1Stan⊥ ). A zatem denotacja petli ˛ while jest niczym innym, tylko punktem stałym funkcji F typu (Stan⊥ → Stan⊥ ) → (Stan⊥ → Stan⊥ ). Metody matematyczne w semantyce jezyków ˛ programowania – p. 14/6 Wymagania dla dziedzin Wróćmy do semantyki while: pamietaj ˛ ac, ˛ że θ = [[while b do z]], równość: θ(s) = if ([[b]](s), θ([[z]](s)), s) jest w istocie wymaganiem istnienia punktu stałego: θ = F (θ) dla funkcji F = λg.if ([[b]], g ◦ [[z]], 1Stan⊥ ). A zatem denotacja petli ˛ while jest niczym innym, tylko punktem stałym funkcji F typu (Stan⊥ → Stan⊥ ) → (Stan⊥ → Stan⊥ ). Wniosek: Każda funkcja miedzy ˛ dziedzinami powinna posiadać (najmniejszy) punkt stały. Metody matematyczne w semantyce jezyków ˛ programowania – p. 14/6 Kategoria Dcpo Podzbiór D ⊆ P posetu P jest skierowany jeśli jest niepusty i dla każdej pary x, y ∈ D istnieje z ∈ D taki, że x, y ⊑ z. Metody matematyczne w semantyce jezyków ˛ programowania – p. 15/6 Kategoria Dcpo Podzbiór D ⊆ P posetu P jest skierowany jeśli jest niepusty i dla każdej pary x, y ∈ D istnieje z ∈ D taki, że x, y ⊑ z. Poset nazywamy zupełnym, jeśli każdy jego podzbiór skierowany posiada supremum. Metody matematyczne w semantyce jezyków ˛ programowania – p. 15/6 Kategoria Dcpo Podzbiór D ⊆ P posetu P jest skierowany jeśli jest niepusty i dla każdej pary x, y ∈ D istnieje z ∈ D taki, że x, y ⊑ z. Poset nazywamy zupełnym, jeśli każdy jego podzbiór skierowany posiada supremum. Funkcje˛ f : P → Q nazywamy ciagł ˛ a, ˛ jeśli zachowuje suprema zbiorów skierowanych: _ f( D) = _ f (d). d∈D Metody matematyczne w semantyce jezyków ˛ programowania – p. 15/6 Kategoria Dcpo Podzbiór D ⊆ P posetu P jest skierowany jeśli jest niepusty i dla każdej pary x, y ∈ D istnieje z ∈ D taki, że x, y ⊑ z. Poset nazywamy zupełnym, jeśli każdy jego podzbiór skierowany posiada supremum. Funkcje˛ f : P → Q nazywamy ciagł ˛ a, ˛ jeśli zachowuje suprema zbiorów skierowanych: _ f( D) = _ f (d). d∈D Posety zupełne z elementami najmniejszymi plus tworza˛ kategorie˛ idealnie nadajac ˛ a˛ sie˛ na funkcje ciagłe ˛ uniwersum dziedzin semantycznych. Metody matematyczne w semantyce jezyków ˛ programowania – p. 15/6 Prof. Dana S. Scott fot. Andrej Bauer Ur. 1932 – informatyk, logik, filozof. W latach 1972-1981 pracował na Uniwersytecie Oxfordzkim jako profesor logiki matematycznej. Tu razem z Ch. Stracheyem stworzył teorie˛ dziedzin i podstawy semantyki denotacyjnej. W 1976 roku został uhonorowany nagroda˛ Turinga, fundowana˛ przez Towarzystwo ACM. Kariere˛ profesorska˛ Scott zakończył w 2003 na Uniwersytecie Carnegie Mellon w Pittsburgu, choć wykłada i bierze udział w konferencjach informatycznych do dziś. Metody matematyczne w semantyce jezyków ˛ programowania – p. 16/6 Twierdzenie o punkcie stałym TWIERDZENIE (Scott): Każda funkcja ciagła ˛ f: P →P na posecie zupełnym z elementem najmniejszym ⊥ ∈ P posiada najmniejszy punkt stały f ix(f ) = {f n (⊥) | n ∈ ω}. _ Co wiecej, ˛ operator f ix : [P, P ] → P , f 7→ f ix(f ) jest ciagły. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 17/6 Twierdzenie o punkcie stałym TWIERDZENIE (Scott): Każda funkcja ciagła ˛ f: P →P na posecie zupełnym z elementem najmniejszym ⊥ ∈ P posiada najmniejszy punkt stały f ix(f ) = {f n (⊥) | n ∈ ω}. _ Co wiecej, ˛ operator f ix : [P, P ] → P , f 7→ f ix(f ) jest ciagły. ˛ Dowód: ⊥ ⊑ f (⊥). Metody matematyczne w semantyce jezyków ˛ programowania – p. 17/6 Twierdzenie o punkcie stałym TWIERDZENIE (Scott): Każda funkcja ciagła ˛ f: P →P na posecie zupełnym z elementem najmniejszym ⊥ ∈ P posiada najmniejszy punkt stały f ix(f ) = {f n (⊥) | n ∈ ω}. _ Co wiecej, ˛ operator f ix : [P, P ] → P , f 7→ f ix(f ) jest ciagły. ˛ Dowód: ⊥ ⊑ f (⊥). Z monotoniczności: f (⊥) ⊑ f 2 (⊥) ⊑ f 3 (⊥) ⊑ ... ⊑ f n (⊥) ⊑ ... Metody matematyczne w semantyce jezyków ˛ programowania – p. 17/6 Twierdzenie o punkcie stałym TWIERDZENIE (Scott): Każda funkcja ciagła ˛ f: P →P na posecie zupełnym z elementem najmniejszym ⊥ ∈ P posiada najmniejszy punkt stały f ix(f ) = {f n (⊥) | n ∈ ω}. _ Co wiecej, ˛ operator f ix : [P, P ] → P , f 7→ f ix(f ) jest ciagły. ˛ Dowód: ⊥ ⊑ f (⊥). Z monotoniczności: f (⊥) ⊑ f 2 (⊥) ⊑ f 3 (⊥) ⊑ ... ⊑ f n (⊥) ⊑ ... Z ciagłości: ˛ W W W n n f ( n∈ω f (⊥)) = n∈ω f (f (⊥)) = n∈ω f n (⊥). Metody matematyczne w semantyce jezyków ˛ programowania – p. 17/6 Twierdzenie o punkcie stałym Jeśli x ∈ D jest innym punktem stałym f , to ⊥ ⊑ x oraz f (⊥) ⊑ f (x) = x, ..., f n (⊥) ⊑ f n (x) = x. Prosta indukcja pokazuje wiec, ˛ że f ix(f ) = _ f n (⊥) ⊑ x. n∈ω Dowiedliśmy zatem, że f ix(f ) jest najmniejszym punktem stałym funkcji f . Metody matematyczne w semantyce jezyków ˛ programowania – p. 18/6 Twierdzenie o punkcie stałym Pokażemy teraz, że operator f ix jest ciagły. ˛ Rozważmy dla każdego n ∈ ω funkcje˛ itn : [P, P ] → P itn (f ) = f n (⊥). Metody matematyczne w semantyce jezyków ˛ programowania – p. 19/6 Twierdzenie o punkcie stałym Pokażemy teraz, że operator f ix jest ciagły. ˛ Rozważmy dla każdego n ∈ ω funkcje˛ itn : [P, P ] → P itn (f ) = f n (⊥). Funkcja it0 , przyporzadkowuj ˛ aca ˛ każdej funkcji f element najmniejszy ⊥, jest funkcja˛ ciagł ˛ a. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 19/6 Twierdzenie o punkcie stałym Pokażemy teraz, że operator f ix jest ciagły. ˛ Rozważmy dla każdego n ∈ ω funkcje˛ itn : [P, P ] → P itn (f ) = f n (⊥). Funkcja it0 , przyporzadkowuj ˛ aca ˛ każdej funkcji f element najmniejszy ⊥, jest funkcja˛ ciagł ˛ a. ˛ Indukcyjnie: itn jest funkcja˛ ciagł ˛ a˛ dla każdego n ∈ ω. Metody matematyczne w semantyce jezyków ˛ programowania – p. 19/6 Twierdzenie o punkcie stałym Pokażemy teraz, że operator f ix jest ciagły. ˛ Rozważmy dla każdego n ∈ ω funkcje˛ itn : [P, P ] → P itn (f ) = f n (⊥). Funkcja it0 , przyporzadkowuj ˛ aca ˛ każdej funkcji f element najmniejszy ⊥, jest funkcja˛ ciagł ˛ a. ˛ Indukcyjnie: itn jest funkcja˛ ciagł ˛ a˛ dla każdego n ∈ ω. Funkcje {itn | n ∈ ω} tworza˛ łańcuch, którego supremum jest f ix. Metody matematyczne w semantyce jezyków ˛ programowania – p. 19/6 while X > 0 do (Y := X ∗ X; X := X − 1), (Andy Pitts) Przedyskutujmy semantyk˛e powyższej petli, ˛ gdy zbiór stanów programu jest posetem Stan⊥ , gdzie Stan = N × N (z porzadkiem ˛ po współrz˛ednych): Metody matematyczne w semantyce jezyków ˛ programowania – p. 20/6 while X > 0 do (Y := X ∗ X; X := X − 1), (Andy Pitts) Przedyskutujmy semantyk˛e powyższej petli, ˛ gdy zbiór stanów programu jest posetem Stan⊥ , gdzie Stan = N × N (z porzadkiem ˛ po współrz˛ednych): [[X > 0]] jest funkcja, ˛ która parze (x, y) ∈ Stan⊥ przypisze wartość true, jeśli x > 0, przypisze wartość false, jeśli x ¬ 0 oraz przypisze wartość ⊥ jeśli x = ⊥. Metody matematyczne w semantyce jezyków ˛ programowania – p. 20/6 while X > 0 do (Y := X ∗ X; X := X − 1), (Andy Pitts) Przedyskutujmy semantyk˛e powyższej petli, ˛ gdy zbiór stanów programu jest posetem Stan⊥ , gdzie Stan = N × N (z porzadkiem ˛ po współrz˛ednych): [[X > 0]] jest funkcja, ˛ która parze (x, y) ∈ Stan⊥ przypisze wartość true, jeśli x > 0, przypisze wartość false, jeśli x ¬ 0 oraz przypisze wartość ⊥ jeśli x = ⊥. Załóżmy też, że [[Y := X ∗ Y ]] jest funkcja˛ dana˛ z góry jako [[Y := X ∗ Y ]](x, y) = (x, xy) oraz [[X := X − 1]] jest funkcja˛ dana˛ z góry jako [[X := X − 1]](x, y) = (x − 1, y). Metody matematyczne w semantyce jezyków ˛ programowania – p. 20/6 θ = [[while X > 0 do (Y := X ∗ X; X := X − 1)]], Zgodnie z wymogiem kompozycyjności [[Y := X ∗ Y ; X = X − 1]](x, y) = [[X = X − 1]](x, xy) = (x − 1, xy). Metody matematyczne w semantyce jezyków ˛ programowania – p. 21/6 θ = [[while X > 0 do (Y := X ∗ X; X := X − 1)]], Zgodnie z wymogiem kompozycyjności [[Y := X ∗ Y ; X = X − 1]](x, y) = [[X = X − 1]](x, xy) = (x − 1, xy). Pamietaj ˛ ac ˛ że F (θ) = θ = if ([[X > 0]], θ[[Y := X ∗Y ; X = X −1]], 1Stan⊥ ) dostaniemy (x, y) jeśli x = 0 F (θ)(x, y) = θ(x − 1, xy) jeśli x > 0 ⊥ w przeciwnym przypadku. Metody matematyczne w semantyce jezyków ˛ programowania – p. 21/6 F (θ)(x, y) = (x, y), jeśli x = 0; θ(x − 1, xy), jeśli x > 0; ⊥ wpp Aby znaleźć funkcje˛ θ : Stan⊥ → Stan⊥ zastosujemy metode˛ kolejnych przybliżeń z dowodu tw. Scotta. Metody matematyczne w semantyce jezyków ˛ programowania – p. 22/6 F (θ)(x, y) = (x, y), jeśli x = 0; θ(x − 1, xy), jeśli x > 0; ⊥ wpp Aby znaleźć funkcje˛ θ : Stan⊥ → Stan⊥ zastosujemy metode˛ kolejnych przybliżeń z dowodu tw. Scotta. Pierwsze przybliżenie θ0 (x, y) = ⊥ ∈ Stan⊥ . Nastepnie ˛ budujemy ciag ˛ dalszych przybliżeń jako θn+1 = F (θn ) dla n ∈ ω. Metody matematyczne w semantyce jezyków ˛ programowania – p. 22/6 F (θ)(x, y) = (x, y), jeśli x = 0; θ(x − 1, xy), jeśli x > 0; ⊥ wpp Aby znaleźć funkcje˛ θ : Stan⊥ → Stan⊥ zastosujemy metode˛ kolejnych przybliżeń z dowodu tw. Scotta. Pierwsze przybliżenie θ0 (x, y) = ⊥ ∈ Stan⊥ . Nastepnie ˛ budujemy ciag ˛ dalszych przybliżeń jako θn+1 = F (θn ) dla n ∈ ω. (x, y) θ1 (x, y) = F (θ0 )(x, y) = ⊥ jeśli x = 0 jeśli x 1 ∨ (x, y) = ⊥. Metody matematyczne w semantyce jezyków ˛ programowania – p. 22/6 F (θ)(x, y) = (x, y), jeśli x = 0; θ(x − 1, xy), jeśli x > 0; ⊥ wpp Aby znaleźć funkcje˛ θ : Stan⊥ → Stan⊥ zastosujemy metode˛ kolejnych przybliżeń z dowodu tw. Scotta. Pierwsze przybliżenie θ0 (x, y) = ⊥ ∈ Stan⊥ . Nastepnie ˛ budujemy ciag ˛ dalszych przybliżeń jako θn+1 = F (θn ) dla n ∈ ω. (x, y) jeśli x = 0 jeśli x 1 ∨ (x, y) = ⊥. (x, y) jeśli x = 0 jeśli x = 1 jeśli x 2 ∨ (x, y) = ⊥. θ1 (x, y) = F (θ0 )(x, y) = ⊥ θ2 (x, y) = F (θ1 )(x, y) = (0, y) ⊥ Metody matematyczne w semantyce jezyków ˛ programowania – p. 22/6 F (θ)(x, y) = (x, y), jeśli x = 0; θ(x − 1, xy), jeśli x > 0; ⊥ wpp θ3 (x, y) = F (θ2 )(x, y) = (x, y) jeśli x = 0 (0, y) jeśli x = 1 (0, 2y) jeśli x = 2 ⊥ jeśli x 3 ∨ (x, y) = ⊥, Metody matematyczne w semantyce jezyków ˛ programowania – p. 23/6 F (θ)(x, y) = (x, y), jeśli x = 0; θ(x − 1, xy), jeśli x > 0; ⊥ wpp θ3 (x, y) = F (θ2 )(x, y) = (x, y) jeśli x = 0 (0, y) jeśli x = 1 (0, 2y) jeśli x = 2 ⊥ jeśli x 3 ∨ (x, y) = ⊥, θ4 (x, y) = F (θ3 )(x, y) = (x, y) jeśli x = 0 jeśli x = 1 (0, y) (0, 2y) jeśli x = 2 (0, 6y) jeśli x = 3 ⊥ jeśli x 4 ∨ (x, y) = ⊥, Metody matematyczne w semantyce jezyków ˛ programowania – p. 23/6 θ∞ = [[while X > 0 do (Y := X ∗ X; X := X − 1)]], i w ogólności (x, y) jeśli x = 0 θn (x, y) = (0, (x!)y) jeśli 0 < x < n ⊥ jeśli x 4 ∨ (x, y) = ⊥. Metody matematyczne w semantyce jezyków ˛ programowania – p. 24/6 θ∞ = [[while X > 0 do (Y := X ∗ X; X := X − 1)]], i w ogólności (x, y) jeśli x = 0 θn (x, y) = (0, (x!)y) jeśli 0 < x < n ⊥ jeśli x 4 ∨ (x, y) = ⊥. Widzimy, że wartości funkcji θ0 , θ1 , θ2 , ... zgadzaja˛ sie˛ na wspólnych argumentach, a wiec ˛ ich suma mnogościowa jest dobrze zdefiniowana˛ funkcja; ˛ nazwijmy ja˛ θ∞ . Jak łatwo sprawdzić, θ∞ jest dana jako (x, y) θ∞ (x, y) = (0, (x!)y) jeśli x = 0 jeśli x > 0. Metody matematyczne w semantyce jezyków ˛ programowania – p. 24/6 θ∞ = [[while X > 0 do (Y := X ∗ X; X := X − 1)]], Czy θ∞ = F (θ∞ )? Tak, ponieważ: (x, y) jeśli x = 0 F (θ∞ )(x, y) = θ∞ (x − 1, xy) jeśli x > 0 (x, y) jeśli x = 0 = (0, y) jeśli x = 1 (0, (x − 1)!xy) jeśli x > 1 = θ∞ (x, y). Zgodnie z twierdzeniem Scotta θ∞ jest najmniejszym ˛ spełnia wszystkie warunki, punktem stałym funkcji F , a wiec aby móc pretendować do roli semantyki petli ˛ while. Metody matematyczne w semantyce jezyków ˛ programowania – p. 25/6 Liczby naturalne Poset ω nie jest zupełny, ponieważ łańcuch ω nie ma supremum. Funkcja nastepnik ˛ jest ciagła, ˛ ale nie posiada żadnego punktu stałego. Metody matematyczne w semantyce jezyków ˛ programowania – p. 26/6 Odcinek Odcinek [0,1] z naturalnym porzad˛ kiem jest krata˛ zupełna, ˛ a wiec ˛ w szczególności posetem zupełnym. Metody matematyczne w semantyce jezyków ˛ programowania – p. 27/6 Dziedzina pododcinków [0, 1] Niech I[0, 1] oznacza zbiór wszystkich podprzedziałów domknietych, ˛ niepustych przedziału [0,1] uporzad˛ kowany wzgledem ˛ odwrotnej inkluzji, to znaczy: [a, b] ⊑ [c, d] ⇐⇒ [a, b] ⊇ [c, d]. Jest to poset zupełny. Metody matematyczne w semantyce jezyków ˛ programowania – p. 28/6 Zbiór pot˛egowy Niech X bedzie ˛ dowolnym zbiorem. Zbiór potegowy ˛ P(X) jest krata˛ zupełna˛ iSdla każdego Y ⊆ X mamy W V T Y = Y i Y = Y. P(X) jest wiec ˛ w szczególności posetem zupełnym. Najmniejszym elementem P(X) jest ∅, a najwiekszym ˛ X. Metody matematyczne w semantyce jezyków ˛ programowania – p. 29/6 Model zbioru Cantora Zbiór wszystkich skończonych i nieskończonych ciagów ˛ zerojedynkowych {0, 1}∞ w porzadku ˛ prefiksowym jest posetem zupełnym. Każdy zbiór skierowany jest łańcuchem. Elementem najmniejszym jest ciag ˛ pusty ε. Zbiór elementów maksymalnych pokrywa sie˛ ze zbiorem wszystkich ciagów ˛ nieskończonych, który posiada strukture˛ zbioru Cantora. Metody matematyczne w semantyce jezyków ˛ programowania – p. 30/6 Własności posetów zupełnych TWIERDZENIE (produkt) Niech D, E bed ˛ a˛ posetami zupełnymi. Wówczas: Metody matematyczne w semantyce jezyków ˛ programowania – p. 31/6 Własności posetów zupełnych TWIERDZENIE (produkt) Niech D, E bed ˛ a˛ posetami zupełnymi. Wówczas: Zbiór D × E = {(d, e) | d ∈ D, e ∈ E} z porzadkiem ˛ po współrz˛ednych: (x1 , y1 ) ⊑ (x2 , y2 ) ⇐⇒ (x1 ⊑ x2 ∧ y1 ⊑ y2 ) jest zupełny. Metody matematyczne w semantyce jezyków ˛ programowania – p. 31/6 Własności posetów zupełnych TWIERDZENIE (produkt) Niech D, E bed ˛ a˛ posetami zupełnymi. Wówczas: Zbiór D × E = {(d, e) | d ∈ D, e ∈ E} z porzadkiem ˛ po współrz˛ednych: (x1 , y1 ) ⊑ (x2 , y2 ) ⇐⇒ (x1 ⊑ x2 ∧ y1 ⊑ y2 ) jest zupełny. Jeśli D i E posiadaja˛ elementy najmniejsze, to D × E ma element najmniejszy (⊥D , ⊥E ). Metody matematyczne w semantyce jezyków ˛ programowania – p. 31/6 Własności - produkt Projekcje πD : D × E → D i πE : D × E → E dane odpowiednio przez πD (x, y) = x, πE (x, y) = y sa˛ funkcjami ciagłymi. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 32/6 Własności - produkt Projekcje πD : D × E → D i πE : D × E → E dane odpowiednio przez πD (x, y) = x, πE (x, y) = y sa˛ funkcjami ciagłymi. ˛ Jeśli Z jest dowolnym posetem zupełnym, a funkcje f : Z → D oraz g : Z → E sa˛ ciagłe, ˛ to funkcja hf, gi : Z → D × E definiowana jako: ∀z ∈ Z hf, gi(z) = (f (z), g(z)) jest ciagła. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 32/6 Własności - eksponent TWIERDZENIE (eksponent) Niech D, E bed ˛ a˛ zupełne. Wówczas: Metody matematyczne w semantyce jezyków ˛ programowania – p. 33/6 Własności - eksponent TWIERDZENIE (eksponent) Niech D, E bed ˛ a˛ zupełne. Wówczas: Zbiór funkcji ciagłych ˛ [D, E] wraz z relacja˛ f ⊑ g ⇐⇒ ∀x ∈ D f (x) ⊑ g(x) jest posetem zupełnym, Metody matematyczne w semantyce jezyków ˛ programowania – p. 33/6 Własności - eksponent TWIERDZENIE (eksponent) Niech D, E bed ˛ a˛ zupełne. Wówczas: Zbiór funkcji ciagłych ˛ [D, E] wraz z relacja˛ f ⊑ g ⇐⇒ ∀x ∈ D f (x) ⊑ g(x) jest posetem zupełnym, Funkcja ewaluacji ev : [D, E] × D → E definiowana jako: ev(f, x) = f (x) dla każdej f ∈ [D, E] oraz x ∈ D, jest funkcja˛ ciagł ˛ a. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 33/6 Własności - eksponent Ponieważ relacja ⊑ w zbiorze funkcji jest zdefiniowana poprzez odwołanie do cz˛eściowego porzadku ˛ w E, [D, E] jest również cz˛eściowym porzadkiem. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 34/6 Własności - eksponent Ponieważ relacja ⊑ w zbiorze funkcji jest zdefiniowana poprzez odwołanie do cz˛eściowego porzadku ˛ w E, [D, E] jest również cz˛eściowym porzadkiem. ˛ Załóżmy, że F jest skierowanym podzbiorem funkcji ciagłych ˛ z D do E. Pokażemy, że funkcja g : D → E zdefiniowana jako: g(x) := _ f (x) f ∈F jest funkcja˛ ciagł ˛ a˛ (oczywiście g jest supremum F ). Metody matematyczne w semantyce jezyków ˛ programowania – p. 34/6 Własności - eksponent Niech A ⊆ D bedzie ˛ skierowany. Mamy: _ g( A) = _ f ∈F _ f( A) Metody matematyczne w semantyce jezyków ˛ programowania – p. 35/6 Własności - eksponent Niech A ⊆ D bedzie ˛ skierowany. Mamy: _ g( A) = = _ f ∈F _ _ _ f( A) f (a) f ∈F a∈A Metody matematyczne w semantyce jezyków ˛ programowania – p. 35/6 Własności - eksponent Niech A ⊆ D bedzie ˛ skierowany. Mamy: _ g( A) = = _ f ∈F _ f( _ _ f (a) _ _ f (a) A) f ∈F a∈A = a∈A f ∈F Metody matematyczne w semantyce jezyków ˛ programowania – p. 35/6 Własności - eksponent Niech A ⊆ D bedzie ˛ skierowany. Mamy: _ g( A) = _ _ f( f ∈F = _ _ f (a) _ _ f (a) A) f ∈F a∈A = a∈A f ∈F = _ g(a). a∈A Metody matematyczne w semantyce jezyków ˛ programowania – p. 35/6 Ewaluacja funkcja˛ ciagł ˛ a˛ Dla ev(f, x) := f (x) wystarczy pokazać ciagłość ˛ oddzielnie ze wzgledu ˛ na pierwszy i na drugi argument. Metody matematyczne w semantyce jezyków ˛ programowania – p. 36/6 Ewaluacja funkcja˛ ciagł ˛ a˛ Dla ev(f, x) := f (x) wystarczy pokazać ciagłość ˛ oddzielnie ze wzgledu ˛ na pierwszy i na drugi argument. Jeśli G ⊆ [D → E] i x ∈ D, mamy: Metody matematyczne w semantyce jezyków ˛ programowania – p. 36/6 Ewaluacja funkcja˛ ciagł ˛ a˛ Dla ev(f, x) := f (x) wystarczy pokazać ciagłość ˛ oddzielnie ze wzgledu ˛ na pierwszy i na drugi argument. Jeśli G ⊆ [D → E] i x ∈ D, mamy: ev( G, x) = ( G)(x) = W W W g∈G g(x) = W g∈G ev(g, x). Metody matematyczne w semantyce jezyków ˛ programowania – p. 36/6 Ewaluacja funkcja˛ ciagł ˛ a˛ Dla ev(f, x) := f (x) wystarczy pokazać ciagłość ˛ oddzielnie ze wzgledu ˛ na pierwszy i na drugi argument. Jeśli G ⊆ [D → E] i x ∈ D, mamy: ev( G, x) = ( G)(x) = W W W g∈G g(x) = W g∈G ev(g, x). Jeśli A ⊆ D oraz f ∈ [D → E] mamy: Metody matematyczne w semantyce jezyków ˛ programowania – p. 36/6 Ewaluacja funkcja˛ ciagł ˛ a˛ Dla ev(f, x) := f (x) wystarczy pokazać ciagłość ˛ oddzielnie ze wzgledu ˛ na pierwszy i na drugi argument. Jeśli G ⊆ [D → E] i x ∈ D, mamy: ev( G, x) = ( G)(x) = W W W g∈G g(x) = W g∈G ev(g, x). Jeśli A ⊆ D oraz f ∈ [D → E] mamy: ev(f, A) = f ( A) = a∈A f (a) = kończy dowód twierdzenia. W W W W a∈A ev(f, a). To Metody matematyczne w semantyce jezyków ˛ programowania – p. 36/6 Ewaluacja funkcja˛ ciagł ˛ a˛ Dla ev(f, x) := f (x) wystarczy pokazać ciagłość ˛ oddzielnie ze wzgledu ˛ na pierwszy i na drugi argument. Jeśli G ⊆ [D → E] i x ∈ D, mamy: ev( G, x) = ( G)(x) = W W W g∈G g(x) = W g∈G ev(g, x). Jeśli A ⊆ D oraz f ∈ [D → E] mamy: ev(f, A) = f ( A) = a∈A f (a) = kończy dowód twierdzenia. W W W W a∈A ev(f, a). To Oczywiście elementem najmniejszym każdego eksponentu jest funkcja stała o wartości ⊥. Metody matematyczne w semantyce jezyków ˛ programowania – p. 36/6 Ewaluacja funkcja˛ ciagł ˛ a˛ Dla ev(f, x) := f (x) wystarczy pokazać ciagłość ˛ oddzielnie ze wzgledu ˛ na pierwszy i na drugi argument. Jeśli G ⊆ [D → E] i x ∈ D, mamy: ev( G, x) = ( G)(x) = W W W g∈G g(x) = W g∈G ev(g, x). Jeśli A ⊆ D oraz f ∈ [D → E] mamy: ev(f, A) = f ( A) = a∈A f (a) = kończy dowód twierdzenia. W W W W a∈A ev(f, a). To Oczywiście elementem najmniejszym każdego eksponentu jest funkcja stała o wartości ⊥. Produkt i eksponent posiadaja˛ własności uniwersalne. Metody matematyczne w semantyce jezyków ˛ programowania – p. 36/6 Ewaluacja funkcja˛ ciagł ˛ a˛ Dla ev(f, x) := f (x) wystarczy pokazać ciagłość ˛ oddzielnie ze wzgledu ˛ na pierwszy i na drugi argument. Jeśli G ⊆ [D → E] i x ∈ D, mamy: ev( G, x) = ( G)(x) = W W W g∈G g(x) = W g∈G ev(g, x). Jeśli A ⊆ D oraz f ∈ [D → E] mamy: ev(f, A) = f ( A) = a∈A f (a) = kończy dowód twierdzenia. W W W W a∈A ev(f, a). To Oczywiście elementem najmniejszym każdego eksponentu jest funkcja stała o wartości ⊥. Produkt i eksponent posiadaja˛ własności uniwersalne. TWIERDZENIE. Kategoria Dcpo jest kartezjańsko zamknieta. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 36/6 Inne potrzeby semantyki denotacyjnej Nietypowany rachunek λ: M ::= x | λx.M | (M M ) Metody matematyczne w semantyce jezyków ˛ programowania – p. 37/6 Inne potrzeby semantyki denotacyjnej Nietypowany rachunek λ: M ::= x | λx.M | (M M ) Semantyka: rozważamy obiekty D, E, ... takie, że: termy λ-rachunku sa˛ interpretowane jako elementy D aplikacja funkcji do argumentu jest rozumiana jako aplikacja strzałki f : D → E do argumentu typu D Metody matematyczne w semantyce jezyków ˛ programowania – p. 37/6 Inne potrzeby semantyki denotacyjnej Nietypowany rachunek λ: M ::= x | λx.M | (M M ) Semantyka: rozważamy obiekty D, E, ... takie, że: termy λ-rachunku sa˛ interpretowane jako elementy D aplikacja funkcji do argumentu jest rozumiana jako aplikacja strzałki f : D → E do argumentu typu D Dla termu λx.xx pierwsze wolne wystapienie ˛ x musi być typu [D, D], zaś drugie typu D Metody matematyczne w semantyce jezyków ˛ programowania – p. 37/6 Inne potrzeby semantyki denotacyjnej Nietypowany rachunek λ: M ::= x | λx.M | (M M ) Semantyka: rozważamy obiekty D, E, ... takie, że: termy λ-rachunku sa˛ interpretowane jako elementy D aplikacja funkcji do argumentu jest rozumiana jako aplikacja strzałki f : D → E do argumentu typu D Dla termu λx.xx pierwsze wolne wystapienie ˛ x musi być typu [D, D], zaś drugie typu D Wniosek: Musimy wymagać, by D ∼ = [D, D]... Metody matematyczne w semantyce jezyków ˛ programowania – p. 37/6 Definicja kategorii DEFINICJA: Kategoria C składa sie˛ z nastepuj ˛ acych ˛ danych: obiektów: A, B, C, ..., Metody matematyczne w semantyce jezyków ˛ programowania – p. 38/6 Definicja kategorii DEFINICJA: Kategoria C składa sie˛ z nastepuj ˛ acych ˛ danych: obiektów: A, B, C, ..., morfizmów: f, g, h, ..., Metody matematyczne w semantyce jezyków ˛ programowania – p. 38/6 Definicja kategorii DEFINICJA: Kategoria C składa sie˛ z nastepuj ˛ acych ˛ danych: obiektów: A, B, C, ..., morfizmów: f, g, h, ..., dwóch operacji dom, cod przypisujacej ˛ każdemu morfizmowi f obiekty dom(f ) i cod(f ), Metody matematyczne w semantyce jezyków ˛ programowania – p. 38/6 Definicja kategorii DEFINICJA: Kategoria C składa sie˛ z nastepuj ˛ acych ˛ danych: obiektów: A, B, C, ..., morfizmów: f, g, h, ..., dwóch operacji dom, cod przypisujacej ˛ każdemu morfizmowi f obiekty dom(f ) i cod(f ), operacji 1 przypisujacej ˛ każdemu obiektowi A morfizm 1A nazywany identycznościa, ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 38/6 Definicja kategorii DEFINICJA: Kategoria C składa sie˛ z nastepuj ˛ acych ˛ danych: obiektów: A, B, C, ..., morfizmów: f, g, h, ..., dwóch operacji dom, cod przypisujacej ˛ każdemu morfizmowi f obiekty dom(f ) i cod(f ), operacji 1 przypisujacej ˛ każdemu obiektowi A morfizm 1A nazywany identycznościa, ˛ operacji ◦ przypisujacej ˛ każdej parze morfizmów f, g takich, że cod(g) = dom(f ) morfizm f ◦ g nazywany złożeniem, Metody matematyczne w semantyce jezyków ˛ programowania – p. 38/6 Definicja kategorii spełniajacych ˛ nastepuj ˛ ace ˛ aksjomaty: dom(1A ) = A = cod(1A ); dom(f ◦ g) = dom(g); cod(f ◦ g) = cod(f ), Metody matematyczne w semantyce jezyków ˛ programowania – p. 39/6 Definicja kategorii spełniajacych ˛ nastepuj ˛ ace ˛ aksjomaty: dom(1A ) = A = cod(1A ); dom(f ◦ g) = dom(g); cod(f ◦ g) = cod(f ), f ◦ 1A = f = 1B ◦ f , gdzie A = dom(f ) oraz B = cod(f ), Metody matematyczne w semantyce jezyków ˛ programowania – p. 39/6 Definicja kategorii spełniajacych ˛ nastepuj ˛ ace ˛ aksjomaty: dom(1A ) = A = cod(1A ); dom(f ◦ g) = dom(g); cod(f ◦ g) = cod(f ), f ◦ 1A = f = 1B ◦ f , gdzie A = dom(f ) oraz B = cod(f ), jeśli f, g sa˛ składalne oraz g, h sa˛ składalne, to (f ◦ g) ◦ h = f ◦ (g ◦ h). Metody matematyczne w semantyce jezyków ˛ programowania – p. 39/6 Przykłady kategorii Set: zbiory i funkcje Metody matematyczne w semantyce jezyków ˛ programowania – p. 40/6 Przykłady kategorii Set: zbiory i funkcje Dcpo: cz˛eściowe porzadki ˛ i funkcje ciagłe ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 40/6 Przykłady kategorii Set: zbiory i funkcje Dcpo: cz˛eściowe porzadki ˛ i funkcje ciagłe ˛ obiekty: elementy posetu P ; morfizmy: a ¬ b Metody matematyczne w semantyce jezyków ˛ programowania – p. 40/6 Przykłady kategorii Set: zbiory i funkcje Dcpo: cz˛eściowe porzadki ˛ i funkcje ciagłe ˛ obiekty: elementy posetu P ; morfizmy: a ¬ b monoid Metody matematyczne w semantyce jezyków ˛ programowania – p. 40/6 Przykłady kategorii Set: zbiory i funkcje Dcpo: cz˛eściowe porzadki ˛ i funkcje ciagłe ˛ obiekty: elementy posetu P ; morfizmy: a ¬ b monoid itd... Metody matematyczne w semantyce jezyków ˛ programowania – p. 40/6 Funktory Funktor F : C → D z kategorii C do kategorii D jest dany poprzez: operacje˛ przypisujac ˛ a˛ jednoznacznie każdemu obiektowi X z C obiekt F (X) w D Metody matematyczne w semantyce jezyków ˛ programowania – p. 41/6 Funktory Funktor F : C → D z kategorii C do kategorii D jest dany poprzez: operacje˛ przypisujac ˛ a˛ jednoznacznie każdemu obiektowi X z C obiekt F (X) w D operacje˛ przypisujac ˛ a˛ jednoznacznie każdemu morfizmowi f z C morfizm F (f ) w D Metody matematyczne w semantyce jezyków ˛ programowania – p. 41/6 Funktory Funktor F : C → D z kategorii C do kategorii D jest dany poprzez: operacje˛ przypisujac ˛ a˛ jednoznacznie każdemu obiektowi X z C obiekt F (X) w D operacje˛ przypisujac ˛ a˛ jednoznacznie każdemu morfizmowi f z C morfizm F (f ) w D w ten sposób, że: jeśli f : X → Y w C, to F (f ) : F (X) → F (Y ) w D F (1X ) = 1F (X) F (f ◦ g) = F (f ) ◦ F (g) Metody matematyczne w semantyce jezyków ˛ programowania – p. 41/6 Przykłady funktorów Produkt (− × −) jest funktorem: A, B 7→ A × B f, g 7→ f × g Metody matematyczne w semantyce jezyków ˛ programowania – p. 42/6 Przykłady funktorów Produkt (− × −) jest funktorem: A, B 7→ A × B f, g 7→ f × g Eksponent [−, −] jest funktorem: A, B 7→ [A, B] f, g 7→ [f, g] := curry(g ◦ ev ◦ (1 × f )), gdzie curry(h : X × Y → Z) := λx.h(x) : X → (Y → Z). Metody matematyczne w semantyce jezyków ˛ programowania – p. 42/6 Przykłady funktorów Produkt (− × −) jest funktorem: A, B 7→ A × B f, g 7→ f × g Eksponent [−, −] jest funktorem: A, B 7→ [A, B] f, g 7→ [f, g] := curry(g ◦ ev ◦ (1 × f )), gdzie curry(h : X × Y → Z) := λx.h(x) : X → (Y → Z). przekatna ˛ ∆; A 7→ (A, A), f 7→ (f, f ) jest funktorem. Metody matematyczne w semantyce jezyków ˛ programowania – p. 42/6 Przykłady funktorów Produkt (− × −) jest funktorem: A, B 7→ A × B f, g 7→ f × g Eksponent [−, −] jest funktorem: A, B 7→ [A, B] f, g 7→ [f, g] := curry(g ◦ ev ◦ (1 × f )), gdzie curry(h : X × Y → Z) := λx.h(x) : X → (Y → Z). przekatna ˛ ∆; A 7→ (A, A), f 7→ (f, f ) jest funktorem. złożenie funktorów jest funktorem. Metody matematyczne w semantyce jezyków ˛ programowania – p. 42/6 Inne potrzeby semantyki denotacyjnej Nietypowany rachunek λ: M ::= x | λx.M | (M M ) Semantyka: rozważamy obiekty D, E, ... takie, że: termy λ-rachunku sa˛ interpretowane jako elementy D aplikacja funkcji do argumentu jest rozumiana jako aplikacja strzałki f : D → E do argumentu typu D Dla termu λx.xx pierwsze wolne wystapienie ˛ x musi być typu [D, D], zaś drugie typu D Wniosek: Musimy wymagać, by D ∼ = [D, D]... Metody matematyczne w semantyce jezyków ˛ programowania – p. 43/6 Rekursywne równania na dziedzinach Zauważmy, że [D, D] = [−, −] ◦ ∆(D). Metody matematyczne w semantyce jezyków ˛ programowania – p. 44/6 Rekursywne równania na dziedzinach Zauważmy, że [D, D] = [−, −] ◦ ∆(D). A zatem rozwiazaniem ˛ równania D ∼ = [D, D] jest punkt stały funktora [−, −] ◦ ∆ : Dcpo → Dcpo. Metody matematyczne w semantyce jezyków ˛ programowania – p. 44/6 Rekursywne równania na dziedzinach Zauważmy, że [D, D] = [−, −] ◦ ∆(D). A zatem rozwiazaniem ˛ równania D ∼ = [D, D] jest punkt stały funktora [−, −] ◦ ∆ : Dcpo → Dcpo. Dana Scott pokazał, że nietrywialne rozwiazania ˛ istnieja˛ w kategorii Dcpo. Metody matematyczne w semantyce jezyków ˛ programowania – p. 44/6 Rekursywne równania na dziedzinach Zauważmy, że [D, D] = [−, −] ◦ ∆(D). A zatem rozwiazaniem ˛ równania D ∼ = [D, D] jest punkt stały funktora [−, −] ◦ ∆ : Dcpo → Dcpo. Dana Scott pokazał, że nietrywialne rozwiazania ˛ istnieja˛ w kategorii Dcpo. To znaczy, że istnieje poset zupełny nieskończony izomorficzny z posetem swoich endofunkcji ciagłych!!! ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 44/6 Rekursywne równania na dziedzinach Zauważmy, że [D, D] = [−, −] ◦ ∆(D). A zatem rozwiazaniem ˛ równania D ∼ = [D, D] jest punkt stały funktora [−, −] ◦ ∆ : Dcpo → Dcpo. Dana Scott pokazał, że nietrywialne rozwiazania ˛ istnieja˛ w kategorii Dcpo. To znaczy, że istnieje poset zupełny nieskończony izomorficzny z posetem swoich endofunkcji ciagłych!!! ˛ Przykłady: P(ω) ∼ = [P(ω), P(ω)]. Metody matematyczne w semantyce jezyków ˛ programowania – p. 44/6 Rekursywne równania na dziedzinach Zauważmy, że [D, D] = [−, −] ◦ ∆(D). A zatem rozwiazaniem ˛ równania D ∼ = [D, D] jest punkt stały funktora [−, −] ◦ ∆ : Dcpo → Dcpo. Dana Scott pokazał, że nietrywialne rozwiazania ˛ istnieja˛ w kategorii Dcpo. To znaczy, że istnieje poset zupełny nieskończony izomorficzny z posetem swoich endofunkcji ciagłych!!! ˛ Przykłady: P(ω) ∼ = [P(ω), P(ω)]. Idea Scotta opiera sie˛ na odpowiednim uogólnieniu twierdzenia o istnieniu punktu stałego endofunkcji ciagłej ˛ f : P → P na posecie zupełnym P na twierdzenie o istnieniu punktu stałego endofunktora ciagłego ˛ F : Dcpo → Dcpo na kategorii posetów zupełnych. Metody matematyczne w semantyce jezyków ˛ programowania – p. 44/6 Kogranice ω-diagramów w Dcpo DEFINICJA: Kogranica˛ ω-diagramu f0 f1 f2 f3 f4 D0 → D1 → D2 → D3 → D4 → ... nazywamy poset zupełny D∞ i funkcje ciagłe ˛ ιi : D i → D ∞ tak, że: ιi+i ◦ fi = ιi oraz dla dowolnego E wraz z kolekcja˛ g : Di → E z gi+i ◦ fi = gi istnieje dokładnie jedna funkcja ciagła ˛ h : D∞ → E z gi = h ◦ ιi . Metody matematyczne w semantyce jezyków ˛ programowania – p. 45/6 Granice ω-diagramów w Dcpo DEFINICJA: Granica˛ ω-diagramu f0 f1 f2 f3 f4 D0 ← D1 ← D2 ← D3 ← D4 ← ... nazywamy poset zupełny D∞ i funkcje ciagłe ˛ πi : D∞ → Di tak, że: fi ◦ πi+i = πi oraz dla dowolnego E wraz z kolekcja˛ g : E → Di z fi ◦ gi+i = gi istnieje dokładnie jedna funkcja ciagła ˛ h : E → D∞ z gi = πi ◦ h. Metody matematyczne w semantyce jezyków ˛ programowania – p. 46/6 (Ko)granice ω-diagramów w Dcpo TWIERDZENIE: Granica dowolnego ω-diagramu f0 f1 f2 f3 f4 D0 ← D1 ← D2 ← D3 ← D4 ← ... istnieje i jest dana przez: D∞ = {(x0 , x1 , ...) | (∀n ∈ ω)(fn (xn+1 ) = xn )} wraz z projekcjami πi : D∞ → Di , πi (x0 , x1 , ...) := xi . TWIERDZENIE: Kogranica dowolnego ω-diagramu f0 f1 f2 f3 f4 D0 → D1 → D2 → D3 → D4 → ... istnieje. Metody matematyczne w semantyce jezyków ˛ programowania – p. 47/6 Fuktory ciagłe ˛ DEFINICJA: Funktor F nazywamy ciagłym, ˛ jeśli zachowuje kogranice tj.: jeśli D∞ jest kogranica˛ diagramu f0 f1 f2 f4 f3 D0 → D1 → D2 → D3 → D4 → ..., to F (D∞ ) jest kogranica˛ diagramu: F f0 F f1 F f2 F f3 F f4 F D0 → F D1 → F D2 → F D3 → F D4 → ..., Metody matematyczne w semantyce jezyków ˛ programowania – p. 48/6 Fuktory ciagłe ˛ DEFINICJA: Funktor F nazywamy ciagłym, ˛ jeśli zachowuje kogranice tj.: jeśli D∞ jest kogranica˛ diagramu f0 f1 f2 f4 f3 D0 → D1 → D2 → D3 → D4 → ..., to F (D∞ ) jest kogranica˛ diagramu: F f0 F f1 F f2 F f3 F f4 F D0 → F D1 → F D2 → F D3 → F D4 → ..., Funktor [−, −] ◦ ∆ : Dcpo → Dcpo jest ciagły. ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 48/6 Własność funktorów ciagłych ˛ LEMAT. Niech F : Dcpo → Dcpo bedzie ˛ funktorem ciagłym ˛ i niech f : D → F (D) bedzie ˛ funkcja˛ ciagł ˛ a˛ oraz niech diagram f F (f ) F 2 (f ) F 3 (f ) F 4 (f ) D → F (D) → F 2 (D) → F 3 (D) → F 4 (D) → ..., posiada kogranice˛ D∞ . Wówczas D∞ ∼ = F (D∞ ). Metody matematyczne w semantyce jezyków ˛ programowania – p. 49/6 Pary e-p DEFINICJA: Para˛ e-p nazywamy pare˛ funkcji ciagłych ˛ miedzy ˛ posetami zupełnymi e: D ⇆ E : p takie, że: p ◦ e = 1D oraz e ◦ p ⊑ 1E . Metody matematyczne w semantyce jezyków ˛ programowania – p. 50/6 Pary e-p DEFINICJA: Para˛ e-p nazywamy pare˛ funkcji ciagłych ˛ miedzy ˛ posetami zupełnymi e: D ⇆ E : p takie, że: p ◦ e = 1D oraz e ◦ p ⊑ 1E . PRZYKŁAD: Dla dowolnego posetu zupełnego (P, ⊑) zanurzamy go w poset zupełny ideałów (I(P ), ⊆), e(x) := ↓x = {y ∈ P | y ⊑ x}. Projekcje definiujemy W przypisujac ˛ ideałowi jego supremum: p(I) := I. Metody matematyczne w semantyce jezyków ˛ programowania – p. 50/6 Pary e-p DEFINICJA: Para˛ e-p nazywamy pare˛ funkcji ciagłych ˛ miedzy ˛ posetami zupełnymi e: D ⇆ E : p takie, że: p ◦ e = 1D oraz e ◦ p ⊑ 1E . PRZYKŁAD: Dla dowolnego posetu zupełnego (P, ⊑) zanurzamy go w poset zupełny ideałów (I(P ), ⊆), e(x) := ↓x = {y ∈ P | y ⊑ x}. Projekcje definiujemy W przypisujac ˛ ideałowi jego supremum: p(I) := I. Dla pary e-p zupełność D wynika z zupełności E. Metody matematyczne w semantyce jezyków ˛ programowania – p. 50/6 Pary e-p DEFINICJA: Para˛ e-p nazywamy pare˛ funkcji ciagłych ˛ miedzy ˛ posetami zupełnymi e: D ⇆ E : p takie, że: p ◦ e = 1D oraz e ◦ p ⊑ 1E . PRZYKŁAD: Dla dowolnego posetu zupełnego (P, ⊑) zanurzamy go w poset zupełny ideałów (I(P ), ⊆), e(x) := ↓x = {y ∈ P | y ⊑ x}. Projekcje definiujemy W przypisujac ˛ ideałowi jego supremum: p(I) := I. Dla pary e-p zupełność D wynika z zupełności E. PRZYKŁAD: Jako e : P → [P, P ] bierzemy λy.λx.y, zaś jako p : [P, P ] → P funkcje˛ λf.f (⊥). Metody matematyczne w semantyce jezyków ˛ programowania – p. 50/6 Twierdzenie Scotta Niech P bedzie ˛ posetem zupełnym z ⊥. Rozważmy: D0 = P, D1 = [P, P ], ..., Dn+1 = [Dn , Dn ], e0 : P → [P, P ] jest funkcja˛ λy.λx.y. p0 : [P, P ] → P jest funkcja˛ λf.f (⊥). en+1 : [Dn , Dn ] = Dn+1 → [Dn+1 , Dn+1 ] jest funkcja˛ λf.en ◦ f ◦ pn . pn+1 : [Dn+1 , Dn+1 ] → [Dn , Dn ] jest funkcja˛ λg.pn ◦ g ◦ en . p0 p1 Niech D∞ bedzie ˛ granica˛ diagramu D0 ← D1 ← D2 ← ... Wówczas D∞ ∼ = [D∞ , D∞ ]. Metody matematyczne w semantyce jezyków ˛ programowania – p. 51/6 Rekursywne równania na dziedzinach Przykład: Punkt stały funktora F : Dcpo⊥ → Dcpo⊥ , który dodaje element najmniejszy: dla obiektu D, F (D) := D⊥ . Dla morfizmu f : P → Q, F (f ) := f⊥ : P⊥ → Q⊥ , f⊥ (p ∈ P ) := p, f⊥ (⊥) := ⊥. Metody matematyczne w semantyce jezyków ˛ programowania – p. 52/6 Rekursywne równania na dziedzinach Przykład: Punkt stały funktora F : Dcpo⊥ → Dcpo⊥ , który dodaje element najmniejszy: dla obiektu D, F (D) := D⊥ . Dla morfizmu f : P → Q, F (f ) := f⊥ : P⊥ → Q⊥ , f⊥ (p ∈ P ) := p, f⊥ (⊥) := ⊥. Zaczynajac ˛ od posetu jednoelementowego 1, mamy 1⊥ = 2, itd. Metody matematyczne w semantyce jezyków ˛ programowania – p. 52/6 Rekursywne równania na dziedzinach Metody matematyczne w semantyce jezyków ˛ programowania – p. 53/6 Rekursywne równania na dziedzinach PRZYKŁAD: Szukamy rozwiazania ˛ równania X = 1⊥ + X, gdzie + jest koproduktem w kategorii Dcpo⊥ . Koproduktem jest suma rozłaczna, ˛ w którym dwa elementy najmniejsze identyfikujemy ze soba: ˛ Metody matematyczne w semantyce jezyków ˛ programowania – p. 54/6 Rekursywne równania na dziedzinach Rozwiazaniem ˛ równania X = 1⊥ + X, sa˛ płaskie liczby naturalne N⊥ . Metody matematyczne w semantyce jezyków ˛ programowania – p. 55/6 Rekursywne równania na dziedzinach PRZYKŁAD: Szukamy rozwiazanie ˛ równania X∼ = X ⊕ X, gdzie F (P, Q) := P ⊕ Q jest suma˛ rozłaczna ˛ P i Q, do której dodany jest nowy element najmniejszy. Metody matematyczne w semantyce jezyków ˛ programowania – p. 56/6 Rekursywne równania na dziedzinach Rozwiazaniem ˛ równania X∼ = X ⊕X jest nieskończone drzewo binarne (model zbioru Cantora). Metody matematyczne w semantyce jezyków ˛ programowania – p. 57/6 Rekursywne równania na dziedzinach Poszukujemy rozwiazania ˛ równania X∼ = 1⊥ + (N⊥ ⊗ X) gdzie: N⊥ to płaskie liczby naturalne, zaś F (P, Q) := P ⊗ Q jest funktorem przypisujacym ˛ posetom zupełnym P ,Q ich produkt zredukowany. Metody matematyczne w semantyce jezyków ˛ programowania – p. 58/6 Rekursywne równania na dziedzinach Poszukujemy rozwiazania ˛ równania X∼ = 1⊥ + (N⊥ ⊗ X) gdzie: N⊥ to płaskie liczby naturalne, zaś F (P, Q) := P ⊗ Q jest funktorem przypisujacym ˛ posetom zupełnym P ,Q ich produkt zredukowany. Produkt zredukowany jest ilorazem produktu P × Q przez relacje˛ równoważności ≡, która identyfikuje ze soba˛ wszystkie elementy produktu, w których na choćby jednej współrz˛ednej znajduje sie˛ ⊥. Metody matematyczne w semantyce jezyków ˛ programowania – p. 58/6 Rekursywne równania na dziedzinach Poszukujemy rozwiazania ˛ równania X∼ = 1⊥ + (N⊥ ⊗ X) gdzie: N⊥ to płaskie liczby naturalne, zaś F (P, Q) := P ⊗ Q jest funktorem przypisujacym ˛ posetom zupełnym P ,Q ich produkt zredukowany. Produkt zredukowany jest ilorazem produktu P × Q przez relacje˛ równoważności ≡, która identyfikuje ze soba˛ wszystkie elementy produktu, w których na choćby jednej współrz˛ednej znajduje sie˛ ⊥. Rozwiazaniem ˛ tego równania jest dziedzina skończonych i nieskończonych listy liczb naturalnych. Metody matematyczne w semantyce jezyków ˛ programowania – p. 58/6 Podsumowanie Omówiliśmy semantyk˛e petli ˛ while prostego jezyka ˛ IMP oraz wyprowadziliśmy podstawowe wymagania dla dziedzin semantycznych. Metody matematyczne w semantyce jezyków ˛ programowania – p. 59/6 Podsumowanie Omówiliśmy semantyk˛e petli ˛ while prostego jezyka ˛ IMP oraz wyprowadziliśmy podstawowe wymagania dla dziedzin semantycznych. Udowodniliśmy twierdzenie Scotta o punkcie stałym endofunkcji ciagłych ˛ na cz˛eściowych porzadkach ˛ zupełnych. Metody matematyczne w semantyce jezyków ˛ programowania – p. 59/6 Podsumowanie Omówiliśmy semantyk˛e petli ˛ while prostego jezyka ˛ IMP oraz wyprowadziliśmy podstawowe wymagania dla dziedzin semantycznych. Udowodniliśmy twierdzenie Scotta o punkcie stałym endofunkcji ciagłych ˛ na cz˛eściowych porzadkach ˛ zupełnych. Udowodniliśmy, że kategoria Dcpo jest kartezjańsko zamknieta ˛ i zupełna. Metody matematyczne w semantyce jezyków ˛ programowania – p. 59/6 Podsumowanie Omówiliśmy semantyk˛e petli ˛ while prostego jezyka ˛ IMP oraz wyprowadziliśmy podstawowe wymagania dla dziedzin semantycznych. Udowodniliśmy twierdzenie Scotta o punkcie stałym endofunkcji ciagłych ˛ na cz˛eściowych porzadkach ˛ zupełnych. Udowodniliśmy, że kategoria Dcpo jest kartezjańsko zamknieta ˛ i zupełna. Naszkicowaliśmy dowód twierdzenia Scotta o istnieniu nietrywialnych rozwiaza ˛ ń równania D ∼ = [D, D] w kategorii Dcpo. Metody matematyczne w semantyce jezyków ˛ programowania – p. 59/6 Podsumowanie Omówiliśmy semantyk˛e petli ˛ while prostego jezyka ˛ IMP oraz wyprowadziliśmy podstawowe wymagania dla dziedzin semantycznych. Udowodniliśmy twierdzenie Scotta o punkcie stałym endofunkcji ciagłych ˛ na cz˛eściowych porzadkach ˛ zupełnych. Udowodniliśmy, że kategoria Dcpo jest kartezjańsko zamknieta ˛ i zupełna. Naszkicowaliśmy dowód twierdzenia Scotta o istnieniu nietrywialnych rozwiaza ˛ ń równania D ∼ = [D, D] w kategorii Dcpo. Pokazaliśmy przykłady rozwiaza ˛ ń innych równań rekursywncyh na dziedzinach typu D ∼ = F (D). Metody matematyczne w semantyce jezyków ˛ programowania – p. 59/6 Literatura Abramsky, S., Jung, A., (1994) Domain Theory. Chapter 3 of Handbook of Logic in Computer Science, pp. 1–168, Oxford University Press. Metody matematyczne w semantyce jezyków ˛ programowania – p. 60/6 Literatura Abramsky, S., Jung, A., (1994) Domain Theory. Chapter 3 of Handbook of Logic in Computer Science, pp. 1–168, Oxford University Press. Gierz, G., Hofmann, J.H., Keimel, K., Lawson, J.D., Mislove, M. and Scott, D.S. (2003) Continuous Lattices and Domains, Vol. 93 of Encyclopedia of Mathematics and Its Applications, Cambridge University Press. Metody matematyczne w semantyce jezyków ˛ programowania – p. 60/6 Literatura Abramsky, S., Jung, A., (1994) Domain Theory. Chapter 3 of Handbook of Logic in Computer Science, pp. 1–168, Oxford University Press. Gierz, G., Hofmann, J.H., Keimel, K., Lawson, J.D., Mislove, M. and Scott, D.S. (2003) Continuous Lattices and Domains, Vol. 93 of Encyclopedia of Mathematics and Its Applications, Cambridge University Press. skrypty on-line: Steve Awodey, Andy Pitts, Gordon Plotkin, Thomas Streicher, etc. Metody matematyczne w semantyce jezyków ˛ programowania – p. 60/6