Objektorienterad modellering och diskreta strukturer 12. Relationer och funktioner Sven Gestegård Robertz Datavetenskap, LTH 2014
Laboration 4 Syntaxanalys Grammatik för (vår delmängd av) satslogiska uttryck e x p r : : = p r i m a r y (' >' p r i m a r y )? p r i m a r y : : = term ( ' ' term ) term : : = f a c t o r ( '& ' f a c t o r ) f a c t o r : : = ID '! ' f a c t o r ' ( ' e x p r ' ) ' Laboration 4 Syntaxanalys 12. Relationer och funktioner 2/40
Laboration 4 Klasser Givet Scanner.java färdig Parser.java skelett ParserException.java färdig ParserTest.java färdig SimpleParserTest.java färdig Förberedelse: Kapitel 7 i Diskreta strukturer Börja implementera! Laboration 4 Syntaxanalys 12. Relationer och funktioner 3/40
Scanner.java p u b l i c c l a s s S c a n n e r { p u b l i c s t a t i c f i n a l i n t EOF = 1, VARIABLE = 2, IMPLIES = 3; p u b l i c S c a n n e r ( S t r i n g s t r i n g ) p u b l i c i n t nexttoken ( ) p u b l i c S t r i n g t o k e n ( ) nexttoken() returnerar ASCII-koden (>= 0) för symboler (tokens) som består av ett tecken. För övriga returneras en av konstanterna EOF, VARIABLE, IMPLIES. token() returnerar ett String-objekt som innehåller strängen som representerar en symbol med typ enligt nexttoken() Laboration 4 Syntaxanalys 12. Relationer och funktioner 4/40
Parser.java p u b l i c c l a s s P a r s e r { p r i v a t e S c a n n e r s c a n n e r ; p r i v a t e i n t t o k e n ; p r i v a t e Expr e x p r ( ) { // e x p r : : = p r i m a r y (' >' p r i m a r y )?... p r i v a t e Expr p r i m a r y ( ) {// p r i m a r y : : = term ( ' ' term )...... Struktur: klassen har en metod för varje produktion i grammatiken token är ett attribut i Parser För varje produktion gäller konventionen att när metoden returnerar ska token innehålla nästa symbol Laboration 4 Syntaxanalys 12. Relationer och funktioner 5/40
Parser.java p u b l i c Expr b u i l d ( S t r i n g i n p u t ) { r e t u r n b u i l d ( new S t r i n g R e a d e r ( i n p u t ) ) ; p r i v a t e Expr e x p r ( ) { Expr r e s u l t ; r e s u l t = p r i m a r y ( ) ; r e t u r n r e s u l t ; p r i v a t e Expr p r i m a r y ( ) { Expr r e s u l t ; r e s u l t = term ( ) ; r e t u r n r e s u l t ; Laboration 4 Syntaxanalys 12. Relationer och funktioner 6/40
Parser.java p r i v a t e Expr term ( ) { Expr r e s u l t ; r e s u l t = f a c t o r ( ) ; r e t u r n r e s u l t ; p r i v a t e Expr f a c t o r ( ) { s w i t c h ( t o k e n ) { d e f a u l t : throw new P a r s e r E x c e p t i o n ( " Unexpected " + s c a n n e r. t o k e n ( ) ) ; Laboration 4 Syntaxanalys 12. Relationer och funktioner 7/40
Lab4, sammanfattning Givet: Scanner och skelett till Parser Notera skillnaden mellan Scanner.token() och Scanner.nextToken(). Implementera Parser NB! efter varje metod (produktion) ska attributet token innehålla nästa symbol build(string s) ska kasta ett Exception om s inte genereras av grammatiken. Använd din kod från lab2 Studera den givna koden och testfallen Börja implementera Parser nerifrån, med factor(). Överkurs: >j a v a P r i n t T r u t h T a b l e "p & \! q < > \! ( p > q )" q p ( ( p &&! q ) < >! ( p > q ) ) f a l s e f a l s e t r u e f a l s e t r u e t r u e t r u e f a l s e t r u e t r u e t r u e t r u e Laboration 4 Syntaxanalys 12. Relationer och funktioner 8/40
Rekaputilation Vi har talat om satslogik och härledning predikatlogik och substitution mängder och språk reguljära uttryck och grammatiker Vi kommer att tala om relationer funktioner Laboration 4 Syntaxanalys 12. Relationer och funktioner 9/40
Exempel på relationer 1 3 P (x, y) friend(per, erik) Per Erik 3 {1, 3, 5 expr '+' expr INT '+' expr {p, p q q Relationer 12. Relationer och funktioner 10/40
Relation En binär relation har två operander. Om den första operanden tillhör mängden A och den andra mängden B så är det en relation från A till B eller mellan A och B (ordningen är signikant). Mängden av relationer mellan A och B betecknas (i kursen) A B. Om A = B så säger vi att det är en relation på A. Relationer 12. Relationer och funktioner 11/40
Aktivitet När vi diskuterar naturliga tal och skriver 3 {1, 3, 5 och 5 {1, 5 så är en relation mellan två mängder; Vilka? N P(N) Relationer 12. Relationer och funktioner 12/40
Relationen friend Exempel Om vi har en mängd av fyra personer {per, erik, anna, eva så kan det gälla att friend = {(erik, anna), (anna, erik), (per, anna), (per, erik). Relationer 12. Relationer och funktioner 13/40
Denition En binär relation från mängden A till mängden B är en delmängd av A B. Relationer 12. Relationer och funktioner 14/40
Java-modell p u b l i c c l a s s R e l a t i o n <A, B> { p r i v a t e Set<P a i r <A, B>> r e l a t i o n = new HashSet<P a i r <A, B> >(); p u b l i c v o i d add (A a, B b ) { s e t. add ( new P a i r <A, B>(a, b ) ) ; p u b l i c b o o l e a n r e l a t e d (A a, B b ) { r e t u r n r e l a t i o n. c o n t a i n s ( new P a i r <A, B>(a, b ) ) ; En skiss av Pair nns i F10. Relationer 12. Relationer och funktioner 15/40
Det normala skrivsättet för en relation Denition x ρ y = (x, y) ρ I kompendiet används ibland (ρ) för att markera att det är mängden och inte operatorn som avses. Relationer 12. Relationer och funktioner 16/40
Likhetsrelationen (=) = {(x, x) x A = A = {(x, x) x A Relationer 12. Relationer och funktioner 17/40
Aktivitet Vad är det för fel på < = {(x, y) N N x < y Vi kan inte använda < för att deniera < Denition < = {(x, y) N N z N. x + z + 1 = y Relationer 12. Relationer och funktioner 18/40
Mängdoperationer på relationer Eftersom relationer är mängder så kan vi använda relationer tillsammans med mängdoperationerna. ( ) = (<) (=) (<) = ( ) (=) Relationer 12. Relationer och funktioner 19/40
Domän och kodomän Denition Låt ρ vara en relation mellan A och B. dom (ρ) = {x A y. (x, y) ρ ran (ρ) = {y B x. (x, y) ρ Exempel Med friend = {(erik, anna), (anna, erik), (per, anna) så är dom (friend) = {per, erik, anna ran (friend) = {erik, anna Relationer 12. Relationer och funktioner 20/40
Bild och argumentmängd Ibland denierar man bilden av x under relationen ρ, x ρ, samt argumentmängden till y under ρ, ρ y Denition Låt ρ vara en relation mellan A och B med x A och y B. x ρ = {y B x ρ y ρ y = {x A x ρ y Exempel (Relationen friend) Med x y = {(erik, anna), (anna, erik), (per, anna) så är bilden erik = {anna argumentmängden anna = {erik, per Relationer 12. Relationer och funktioner 21/40
Aktivitet Finns det något enkelt sätt att beskriva mängden av alla relationer mellan A och B med hjälp av våra mängdoperationer? A B = P(A B) Relationer 12. Relationer och funktioner 22/40
Egenskaper Denition Låt ρ vara en binär relation på A. ρ är reexiv om x ρ x för alla x A ρ är symmetrisk om x ρ y y ρ x för alla x, y A ρ är transitiv om x ρ y y ρ z x ρ z för alla x, y, z A ρ är antisymmetrisk om x ρ y y ρ x x = y för alla x, y A Om ρ är reexiv, symmetrisk och transitiv så är det en ekvivalens-relation. Exempel: är antisymmetrisk = är både symmetrisk och antisymmetrisk Relationer 12. Relationer och funktioner 23/40
Om equals i Object The equals method implements an equivalence relation on non-null object references: It is reexive: for any non-null reference value x, x.equals(x) should return true. It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true. It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true. It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modied. For any non-null reference value x, x.equals(null) should return false. Relationer 12. Relationer och funktioner 24/40
Variable.java från lab 2 p u b l i c c l a s s V a r i a b l e e x t e n d s Expr { p r i v a t e S t r i n g name ; p u b l i c b o o l e a n e q u a l s ( O b j e c t o b j e c t ) { i f (! ( o b j e c t i n s t a n c e o f V a r i a b l e ) ) r e t u r n f a l s e ; V a r i a b l e o t h e r = ( V a r i a b l e ) o b j e c t ; r e t u r n name. e q u a l s ( o t h e r. name ) ; p u b l i c i n t hashcode ( ) { r e t u r n name. hashcode ( ) ; equals() är inte symmetrisk. Relationer 12. Relationer och funktioner 25/40
FinalVariable.java p u b l i c c l a s s F i n a l V a r i a b l e e x t e n d s V a r i a b l e { p u b l i c b o o l e a n e q u a l s ( O b j e c t o b j e c t ) { i f (! ( o b j e c t i n s t a n c e o f F i n a l V a r i a b l e ) ) r e t u r n f a l s e ; r e t u r n s u p e r. e q u a l s ( o b j e c t ) ; V a r i a b l e a1 = new V a r i a b l e (" a " ) ; V a r i a b l e a2 = new F i n a l V a r i a b l e (" a " ) ; a1. e q u a l s ( a2 ) > a2. e q u a l s ( a1 ) > t r u e f a l s e Relationer 12. Relationer och funktioner 26/40
Variable.java med Eclipse: Generate equals and hashcode p u b l i c b o o l e a n e q u a l s ( O b j e c t o b j ) { i f ( t h i s == o b j ) r e t u r n t r u e ; i f ( o b j == n u l l ) r e t u r n f a l s e ; i f ( g e t C l a s s ( )!= o b j. g e t C l a s s ( ) ) r e t u r n f a l s e ; V a r i a b l e o t h e r = ( V a r i a b l e ) o b j ; i f ( name == n u l l ) { i f ( o t h e r. name!= n u l l ) r e t u r n f a l s e ; e l s e i f (! name. e q u a l s ( o t h e r. name ) ) r e t u r n f a l s e ; r e t u r n t r u e ; Relationer 12. Relationer och funktioner 27/40
== i Java är inte transitiv Finns det x, y och z så att x==y -> true y==z -> true x==z -> false int x = Integer.MAX_VALUE; float y = Integer.MAX_VALUE; int z = Integer.MAX_VALUE - 1; Relationer 12. Relationer och funktioner 28/40
Sammansättning Denition Låt ρ 1 vara en relation mellan A och B och ρ 2 en relation mellan B och C. Sammansättningen av ρ 1 och ρ 2 är ρ 1 ; ρ 2 = {(x, z) A C y B. x ρ1 y y ρ 2 z Relationer 12. Relationer och funktioner 29/40
Sammansättning c a b d e f g h i {(b, d), (b, e), (c, d) ; {(d, h), (e, h), (f, h), (f, g) = {(b, h), (c, h) Relationer 12. Relationer och funktioner 30/40
Aktivitet Denition Låt ρ 1 vara en relation mellan A och B och ρ 2 en relation mellan B och C. Sammansättningen av ρ 1 och ρ 2 är ρ 1 ; ρ 2 = {(x, z) A C y B. x ρ1 y y ρ 2 z Vad betyder < ; < på mängden {0, 1, 2? Mindre än med minst 2 Låt cousin(x, Y ) betyda att X är kusin till Y. Betyder cousin; cousin samma sak som nästkusin (tremänning)? nej Relationer 12. Relationer och funktioner 31/40
Invers och motsats Denition Låt ρ vara en relation mellan A och B. Inversen till ρ är ρ 1 = {(y, x) B A x ρ y Denition Låt ρ vara en relation mellan A och B. Motsatsen till ρ är ρ = A B ρ Motsatsen kan även kallas Komplement. Jfr mängdoperationerna. Relationer 12. Relationer och funktioner 32/40
Funktioner Exempel f(x) = x + 1 sqr(y) = y 2 { abs(x) = x, om x 0 x, om x < 0 Funktioner 12. Relationer och funktioner 33/40
En funktion är en mängd not(b) = { F, om b = T T, om b = F not = {(F, T), (T, F) Funktioner 12. Relationer och funktioner 34/40
En funktion är en mängd Denition f är en funktion från A till B om f A B och (a 1, b 1 ), (a 1, b 2 ) f (b 1 = b 2 ) f : A B = {f A B (a 1, b 1 ), (a 1, b 2 ) f (b 1 = b 2 ) Funktioner 12. Relationer och funktioner 35/40
Domän, kodomän och sammansättning dom och ran denieras som för relationer Sammansättning denieras (f g)(x) = f(g(x)). Sammansättningen av två funktioner är en funktion. Unionen av två funktioner är oftast inte en funktion. Varför? Eftersom första elementet i ett par måste vara unikt, enligt (a 1, b 1 ), (a 1, b 2 ) f (b 1 = b 2 ) Funktioner 12. Relationer och funktioner 36/40
Sammansfattning Relationer är mängder Funktioner är mängder Notera ordningen på sammansättning Funktioner 12. Relationer och funktioner 37/40
Funktioner i Scala Programmet v a l add1 = ( x : I n t ) => x + 1 v a l add100 = ( x : I n t ) => x + 100 v a l sq = ( x : I n t ) => x x v a l add1sq = sq compose add1 // e l l e r : add1 andthen sq v a l l i s t = 1 t o 5 p r i n t l n ( add1 ( 1 ) ) p r i n t l n ( l i s t. map( add1sq andthen add100 ) Ger utskriften 2 V e c t o r ( 1 0 4, 109, 116, 125, 136)... och det nns en funktion för att sätta samman en lista av funktioner: v a l f l i s t = L i s t ( add1, sq, ( x : I n t ) => x + 100) v a l f c = F u n c t i o n. c h a i n ( f l i s t ) // f c = en f u n k t i o n I n t > I n t Funktioner 12. Relationer och funktioner 38/40
java.util.function i Java8 Lambda-notation, är (i Java8 ) kortform för att skapa en anonym klass som implementerar ett interface. ( SomeClass o ) > o. getx ( ) > 0 ; o > o. getx ( ) > 0 ; En mängd interface: Function (ettställig funktion från T till R): T R Consumer (ettställig funktion från T till void) T Predicate (ettställig funktion från T till boolean) T B Supplier (nollställig funktion till R). R BiFunction (tvåställig funktion från T och U till R). T U R Notera att ovanstående Function m specicerar metoder men inte nödvändigtvis funktioner enligt vår denition, då de kan ha sidoeekter, och två anrop av en metod med samma parameter kan ge olika resultat. Funktioner 12. Relationer och funktioner 39/40
i m p o r t j a v a. u t i l. f u n c t i o n. P r e d i c a t e ;... i n t e r f a c e P e r s o n { p u b l i c enum Sex { MALE, FEMALE p u b l i c i n t getage ( ) ; p u b l i c Sex g e t G e n d e r ( ) ; p u b l i c v o i d p r i n t P e r s o n ( ) ; p u b l i c c l a s s LambdaExample { p u b l i c v o i d p r i n t P e r s o n s ( L i s t <Person> p e r s o n s, P r e d i c a t e <Person> i n c l u d e ) { f o r ( P e r s o n p : p e r s o n s ) { i f ( i n c l u d e. t e s t ( p ) ) { p. p r i n t P e r s o n ( ) ; p u b l i c v o i d example ( L i s t <Person> p l i s t ) { p r i n t P e r s o n s ( p l i s t, p >t r u e ) ; // a l l p e r s o n s p r i n t P e r s o n s ( p l i s t, ( P e r s o n p ) > ( p. g e t G e n d e r ( ) == P e r s o n. Sex.MALE && p. getage ( ) >= 18) // a d u l t m a l e s ) ; Funktioner 12. Relationer och funktioner 40/40