Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Δεύτερο Φύλλο Ασκήσεων

Σχετικά έγγραφα
Πολυμορφισμός και Υπερφόρτωση

Αλγεβρικοί Τύποι. Γιάννης Κασσιός. 1 Εισαγωγή στους Αλγεβρικούς Τύπους

n true false if t then t else t u t t b t emptylist cons t t t t λx.t u ::= head tail isempty

Αφαίρεση στον FP. Πολυμορφισμός Συναρτήσεις υψηλότερης τάξης Οκνηρός και Άπληστος Υπολογισμός

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ

Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations) f : A B σημαίνει:

Η γλώσσα ML σε βάθος. Γλώσσες Προγραμματισμού Ι. Διδάσκοντες: Νικόλαος Παπασπύρου, Κωστής Σαγώνας

ΗΥ-150. Προγραμματισμός

Εισαγωγή στον Προγραμματισμό

Η γλώσσα ML σε βάθος. Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations)

ΗΥ-150. Προγραμματισμός

Αφηρημένοι Τύποι Δεδομένων

Εισαγωγή στον Προγραμματισμό

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Τι σηµαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγµα επισηµειώσεων τύπων στην ML. Επισηµειώσεις τύπων (type annotations) Σύνταξη ταιριάσµατος

Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Πρώτο Φύλλο Ασκήσεων

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

Προγραμματισμός Ι (ΗΥ120)

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής

Προγραμματισμός Ι (HY120)

Η γλώσσα ML σε βάθος. Joan Miró, El Carnaval del Arlequín, Κωστής Σαγώνας Νίκος Παπασπύρου

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ ΤΕΛΟΣ 1ΗΣ ΑΠΟ 6 ΣΕΛΙ ΕΣ

ΚΕΦΑΛΑΙΟ 10 ΕΝΤΟΛΕΣ ΕΠΙΛΟΓΗΣ (ή εντολές Ελέγχου και Επιλογής ή εντολές Επιλογής και Απόφασης)

Είδη εντολών. Απλές εντολές. Εντολές ελέγχου. Εκτελούν κάποια ενέργεια. Ορίζουν τον τρόπο με τον οποίο εκτελούνται άλλες εντολές

ΣΤΗΛΗ Β ΑΠΟΤΕΛΕΣΜΑ 1. float(10) α pow(2,3) β abs(-10) γ int(5.6) δ. 10 ε. 5.6 Μονάδες 8 ΣΤΗΛΗ Α ΣΥΝΑΡΤΗΣΗ

Ορισμός Συναρτήσεων στην ΜL

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Δομή Επιλογής. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Η γλώσσα Fortress. Γιώργος Κορφιάτης. Ερευνητικά Θέματα Υλοποίησης Γλωσσών Προγραμματισμού, Εργαστήριο Λογισμικού, ΕΜΠ ...

Προγραμματισμός Ι (ΗΥ120)

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Αντικειμενοστρεφής Προγραμματισμός -Python. Κ.Π. Γιαλούρης

οµές Επιλογής Εντολές if και switch

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΕΠΛ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

HY-252 Αντικειμενοστραφής Προγραμματισμός. Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης. Ημερομηνία Παράδοσης: 16/11/2012

Λογισµικό (Software SW) Γλώσσες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Haskell: Βασικές Δομές Δεδομένων και Απόκρυψη Ονομάτων

A2. Να γράψετε για κάθε περίπτωση τον αριθμό της πρότασης και δίπλα το γράμμα που δίνει τη σωστή επιλογή.

ιαφάνειες παρουσίασης #2

ΚΥΡΙΑ ΜΟΝΤΕΛΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Pascal, απλοί τύποι, τελεστές και εκφράσεις

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

Προγραμματισμός PASCAL

Γραφικά υπολογιστών Εργαστήριο 1 Εισαγωγή στην Python

Διαδικασιακός Προγραμματισμός

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Σημειωματάριο Δευτέρας 9 Οκτ. 2017

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Ι (HY120)

5. Επερώτηση XML Εγγράφων: Εισαγωγή στη Γλώσσα XQuery

Σειρά Προβλημάτων 5 Λύσεις

Α3. Ποια είναι τα πλεονεκτήματα του Δομημένου προγραμματισμού; (Μονάδες 10)

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / Γ ΕΠΑΛ ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ: 27/01/2013

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Ευφυής Προγραμματισμός

Υπολογιστικά Συστήματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Στοιχειώδης προγραμματισμός σε C++

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

Προγραμματισμός Υπολογιστών Τάξη Γ Αθανασιάδης Χρήστος ΠΕ19 ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 8 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Ανάπτυξη και Σχεδίαση Λογισμικού

Βασικά στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Κεφάλαιο 11 Εκφραστικές δυνατότητες της Haskell

a = 10; a = k; int a,b,c; a = b = c = 10;

Runtime Checking (1/3) Runtime Checking (2/3) Runtime Checking (3/3) ΗΥ 340 Γλώσσες και Μεταφραστές Φροντιστήριο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Στόχοι και αντικείμενο ενότητας. Βασικές κατασκευές ΓΠ. Έλεγχος ροής προγράμματος. #4.. Εντολές Επιλογής

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Εντολές επιλογής Επαναλήψεις (if, switch, while)

HY340, 2009 Α. Σαββίδης Slide 2 / 143. HY340, 2009 Α. Σαββίδης Slide 3 / 143. HY340, 2009 Α. Σαββίδης Slide 4 / 143

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Δομές Δεδομένων. Ενότητα 1: Εισαγωγή-Υλοποίηση του ΑΤΔ Σύνολο με Πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Ενότητα 7 Ουρές Προτεραιότητας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΚΑΛΟΥΠΩΜΑΤΑ & ΜΕΤΑΤΡΟΠΕΣ

Βασικά Στοιχεία της Java

Προγραμματισμός Υπολογιστών & Εφαρμογές Python. Κ.Π. Γιαλούρης

Transcript:

Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Δεύτερο Φύλλο Ασκήσεων 1. Στις Σημ. 4, είδαμε τη δημιουργία της κλάσης Condition που μας επιτρέπει να χρησιμοποιούμε αριθμούς, λίστες και ζεύγη ως αληθοτιμές στη συνάρτηση cond που αποτελεί γενίκευση της if then else. Θα θέλαμε να επεκτείνουμε την κλάση αυτή, έτσι ώστε να μπορούμε να χειριστούμε μία λίστα αληθοτιμών στην cond είτε ως σύζευξη είτε ως διάζευξη των στοιχείων της. Για παράδειγμα, η λίστα [2::Int,False] θα πρέπει να λειτουργεί σαν True στην περίπτωση που τη βλέπουμε σα διάζευξη (το 2::Int λειτουργεί σαν True), ενώ θα πρέπει να λειτουργεί σα False στην περίπτωση που τη βλέπουμε σα σύζευξη. Το πρόβλημα είναι ότι οι λίστες από μόνες τους δε μπορούν να μας πουν αν τις βλέπουμε σα σύζευξη ή σα διάζευξη. Επιπλέον, οι λίστες έχουν ήδη ένα χειρισμό στην Condition: μία λίστα συμπεριφέρεται σαν True αν και μόνον αν δεν είναι κενή. Χρησιμοποιώντας αλγεβρικούς τύπους, λύστε αυτό το πρόβλημα και επεκτείνετε την κλάση Condition ώστε να διατηρήσει τη λειτουργικότητα που έχει τώρα, αλλά να υποστηρίζει και σύζευξη / διάζευξη στοιχείων μίας λίστας. Θα βρείτε τον κώδικα ορισμού της κλάσης Condition όπως είναι τώρα στο αρχείο http://cgi.di.uoa.gr/ kassios/courses/fp/exercises/condition.hs x Προσθέτουμε στο αρχείο Condition.hs τα εξής: data CondList a = And [a] Or [a] instance ConvBool a => ConvBool (CondList a) where tobool (And l) = foldl (&&) True (map tobool l) tobool (Or l) = foldl ( ) False (map tobool l) instance ConvBool a => Condition (CondList a) 1

2. Εμπλουτίστε τον αλγεβρικό τύπο Expr των Σημ. 5, Ενότ. 8.2 με μία δομή let που εκχωρεί τιμές σε μεταβλητές. Μετά κατασκευάστε πλήρη διερμηνέα eval για τις εκφράσεις αυτές. Ο διερμηνέας θα πρέπει να επιστρέφει τιμή τύπου Maybe Int, καθώς θα μπορούσαν να συμβούν λάθη κατά την αποτίμηση μίας έκφρασης, όπως διαίρεση με το μηδέν ή αποτίμηση μίας μεταβλητής στην οποία δεν έχει εκχωρηθεί τιμή. x data Expr = Constant Int Variable String UnaryExp UnOp Expr BinaryExp BinOp Expr Expr Let String Expr Expr data UnOp = UPlus UMinus data BinOp = Plus Minus Mult Div type Env = [(String,Int)] eval :: Env -> Expr -> Maybe Int eval _ (Constant n) = Just n eval env (Variable v) = find v env where find _ [] = Nothing find v1 ((v2,val):vs) = if v1 == v2 then Just val else find v1 vs eval env (UnaryExp uo exp) = uod uo (eval env exp) eval env (BinaryExp bo exp1 exp2) = bod bo (eval env exp1) (eval env exp2) eval env (Let v exp1 exp2) = case eval env exp1 of Nothing -> Nothing Just val -> eval ((v,val):env) exp2 uod :: UnOp -> Maybe Int -> Maybe Int uod _ Nothing = Nothing uod UPlus (Just x) = Just x uod UMinus (Just x) = Just (-x) bod :: BinOp -> Maybe Int -> Maybe Int -> Maybe Int bod _ Nothing _ = Nothing 2

bod Nothing = Nothing bod Plus (Just x) (Just y) = Just (x+y) bod Minus (Just x) (Just y) = Just (x-y) bod Mult (Just x) (Just y) = Just (x*y) bod Div (Just x) (Just y) = if y == 0 then Nothing else Just (x div y) 3. Ένα πολυσύνολο (multiset) είναι μία συλλογή δεδομένων στην οποία η σειρά δεν έχει σημασία, αλλά ο πληθυσμός έχει σημασία. Δηλαδή, ένα πολυσύνολο που περιέχει τα 1,2 είναι ίσο με ένα πολυσύνολο που περιέχει τα 2,1, αλλά όχι ίσο με αυτό που περιέχει τα 1,2,1. Υλοποιήστε έναν πολυμορφικό ΑΤΔ MultiSet για πολυσύνολα. Υποστηρίξτε την κατασκευή τουλάχιστον όλων των πεπερασμένων πολυσυνόλων και την εξαγωγή όλων των χρήσιμων πληροφοριών από ένα πολυσύνολο. Υποστηρίξτε πράξεις union (ένωση) και difference (διαφορά) φροντίζοντας να είναι άμεσες γενικεύσεις των αντίστοιχων πράξεων για σύνολα. Μπορείτε να φτιάξετε και ό,τι άλλη συνάρτηση νομίζετε ότι μπορεί να διευκολύνει τη χρήση πολυσυνόλων. Τέλος, δηλώστε τον τύπο σας ως στιγμιότυπο της κλάσης Eq. x Η υλοποίηση βασίζεται σε μία λίστα ζευγών. Το πρώτο στοιχείο ενός ζεύγους είναι ένα στοιχείο που βρίσκεται στο πολυσύνολο. Το δεύτερο στοιχείο είναι ο πληθυσμός του στοιχείου αυτού στο πολυσύνολο και πρέπει να είναι θετικός ακέραιος (όχι 0). Μία ακόμα αναλλόιωτη είναι ότι ένα στοιχείο που βρίσκεται μέσα στο πολυσύνολο βρίσκεται μόνο μία φορά μέσα στη λίστα. Υλοποιούμε τις συναρτήσεις emptyms (κενό πολυσύνολο), fromlist (διαβάζει ένα πολυσύνολο από μία λίστα), union (ένωση), difference (διαφορά), card (η γενίκευση του el των συνόλων: επιστρέφει τον πληθυσμό ενός στοιχείου στο πολυσύνολο) και isempty (έλεγχος αν το στοιχείο είναι άδειο). Επίσης, έχουμε χρησιμοποιήσει μία μη εξαγόμενη συνάρτηση insert που εισάγει ένα στοιχείο σε μία λίστα πολυσυνόλου διατηρώντας τις αναλλοίωτες των πολυσυνόλων. Ο έλεγχος ισότητας δεν είναι ο καλύτερος δυνατός (μπορεί να γίνει και με μία μόνο πράξη στα δύο πολυσύνολα), αλλά είναι η πιο εύκολη υλοποίηση με τις συναρτήσεις που έχουμε. module MultiSet (MultiSet,emptyms,fromList,union,difference,card,isempty) where data Eq a => MultiSet a = MS [(a,int)] 3

emptyms :: Eq a => MultiSet a emptyms = MS [] fromlist :: Eq a => [a] -> MultiSet a fromlist = fromlistaux emptyms where fromlistaux m [] = m fromlistaux m (x:xs) = fromlistaux (insert (x,1) m) xs card x (MS []) = 0 card x (MS ((y,cy):xs)) = if x==y then cy else card x (MS xs) insert (x,cx) (MS []) = if cx > 0 then MS[(x,cx)] else MS[] insert (x,cx) (MS ((y,cy):ys)) = if x == y then (if sum > 0 then MS ((y,sum):ys) else (MS ys)) else MS ((y,cy):rest) where sum = cx + cy MS rest = insert (x,cx) (MS ys) union m (MS []) = m union m (MS ((x,cx):xs)) = (insert (x,cx) m) union (MS xs) difference m (MS []) = m difference m (MS ((x,cx):xs)) = (insert (x,-cx) m) difference (MS xs) isempty (MS []) = True isempty (MS _) = False instance Eq a => Eq (MultiSet a) where m1 == m2 = isempty (difference m1 m2) && isempty (difference m2 m1) 4. Χρησιμοποιήστε το τμήμα MultiSet που φτιάξατε για να ορίσετε μία συνάρτηση perm που να παίρνει δύο λίστες και να επιστρέφει True αν και μόνον αν η μία είναι αναμετάθεση της άλλης. 4

x import MultiSet perm l1 l2 = fromlist l1 == fromlist l2 5. Υλοποιήστε το τμήμα ResettableVariable με υπογραφή εξόδου: ResVar a (Πολυμορφικός ΑΤΔ) newrv :: ResVar value :: ResVar a -> a set :: ResVar a -> a -> ResVar reset :: ResVar a -> ResVar και με συμβόλαιο (για κάθε r::resvar a και v::a) value(set r v) = v && value(reset(set r v)) = value r && reset. reset = reset Αποδείξτε ότι το συμβόλαιο ικανοποιείται. x Μία υλοποίηση έχει ως εξής: module ResettableVariable(ResVar,newRV,value,set,reset) where data ResVar a = R (a,a) undef = undef newrv = R(undef,undef) value (R(n,_)) = n set (R(n,o)) x = R(x,n) reset (R(n,o)) = R(o,o) Αποδείξεις: value(set (R(n,o)) v) = value (R(v,n)) = v value(reset(set (R(n,o)) v)) = value(reset(r(v,n))) = value(r(n,n)) = n = value(r(n,o)) reset(reset(r(n,o))) = reset(r(o,o)) = R(o,o) = reset(r(n,o)) 5