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

Σχετικά έγγραφα
Οκνηρή Αποτίμηση και Αποδείξεις Ορθότητας

ΣΥΝΑΡΤΗΣΕΙΣ. Η σύνταξη μιας συνάρτησης σ ένα κελί έχει την γενική μορφή: =όνομα_συνάρτησης(όρισμα1; όρισμα2;.)

Υπολογισμός αθροισμάτων

Εργαστήριο 9 Συναρτήσεις στη PASCAL. Η έννοια του κατακερματισμού. Συναρτήσεις. Σκοπός

Δηλαδή η ρητή συνάρτηση είναι πηλίκο δύο ακέραιων πολυωνύμων. Επομένως, το ζητούμενο ολοκλήρωμα είναι της μορφής

Αριθμητική Ανάλυση & Εφαρμογές

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι είναι ; Συναρτήσεις. Παράδειγμα #1. double convert ( double cm ) { double inch;

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τι χρειάζεται η εντολή DO ; ΕΠΑΝΑΛΗΨΕΙΣ ΕΝΤΟΛΗ DO. Όταν απαιτείται να εκτελεστεί πολλές φορές το ίδιο τμήμα ενός προγράμματος.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 1 ΛΥΣΕΙΣ Ανάλυση Πολυπλοκότητας

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 1 ΛΥΣΕΙΣ Ανάλυση Πολυπλοκότητας

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

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

Σημειωματάριο Δευτέρας 13 Νοε. 2017

ΚΕΦΑΛΑΙΟ 2: ΟΡΙΖΟΥΣΕΣ

με Τέλος πάντων, έστω ότι ξεκινάει ένα άλλο υποθετικό σενάριο που απλά δεν διευκρινίζεται. Για το i) θα έχουμε , 2

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Συναρτήσεις I Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

h(x, y) = card ({ 1 i n : x i y i

1. Κατασκευάστε ένα διάνυσμα με στοιχεία τους ζυγούς αριθμούς μεταξύ του 31 και 75

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

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

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

A Τελική Εξέταση του μαθήματος «Αριθμητική Ανάλυση» Σχολή Θετικών Επιστημών, Τμήμα Μαθηματικών, Πανεπιστήμιο Αιγαίου

1 Αριθμητική κινητής υποδιαστολής και σφάλματα στρογγύλευσης

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

Επικοινωνία:


Εισαγωγή στη γλώσσα Haskell

τις αναδρομικές ακολουθίες (recursive sequences) στις οποίες ορίζαμε

Αριθμητική Ανάλυση και Εφαρμογές

1 ο ΦΥΛΛΑΔΙΟ ΑΣΚΗΣΕΩΝ - ΑΛΓΟΡΙΘΜΟΙ

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Προγραμματισμός Η/Υ (ΤΛ2007 )

Αντικείμενο του κεφαλαίου είναι: Ανάλυση συσχέτισης μεταξύ δύο μεταβλητών. Εξίσωση παλινδρόμησης. Πρόβλεψη εξέλιξης

Σημειωματάριο Τετάρτης 4 Οκτ. 2017

Φροντιστήριο #4 Λυμένες Ασκήσεις Μαθηματική Επαγωγή 13/3/2018

A A A B A ΦΥΛΛΑ ΙΟ ΘΕΜΑΤΩΝ 1/2. Μέϱος A. Πολλαπλές επιλογές (20%) Σειριακός αριθµός : 100 Πληροφορική Ι Εξέταση Φεβρουαρίου 2019

ΚΕΦΑΛΑΙΟ 3: Συνθήκες Αλυσίδων

Εισαγωγή στην Αριθμητική Ανάλυση

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΡΟΓΡΑΜΜΑ ΣΠΟΥ ΩΝ: ΠΛΗΡΟΦΟΡΙΚΗ ΘΕ: ΜΑΘΗΜΑΤΙΚΑ ΓΙΑ ΤΗΝ ΠΛΗΡΟΦΟΡΙΚΉ Ι (ΠΛΗ 12) ΛΥΣΕΙΣ ΕΡΓΑΣΙΑΣ 3

Φροντιστήρια Επίγνωση Προτεινόμενα Θέματα Πανελλαδικών ΑΕΠΠ 2015

Εισαγωγή στη Matlab Βασικές Συναρτήσεις

ΓΡΑΜΜΙΚΗ ΑΛΓΕΒΡΑ (Εξ. Ιουνίου - 02/07/08) ΕΠΙΛΕΓΜΕΝΕΣ ΑΠΑΝΤΗΣΕΙΣ

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Άσκηση 1: Λύση: Για το άθροισμα ισχύει: κι επειδή οι μέσες τιμές των Χ και Υ είναι 0: Έτσι η διασπορά της Ζ=Χ+Υ είναι:

Αριθμητική Ανάλυση και Εφαρμογές

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

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

Απειροστικός Λογισμός Ι Ασκήσεις

E(X(t)) = 1 k + k sin(2π) + k cos(2π) = 1 k + k 0 + k 1 = 1

Συναρτήσεις. Εισαγωγή

(ii) X P(X). (iii) X X. (iii) = (i):

Σχεδίαση και Ανάλυση Αλγορίθμων

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

Πληροφορική 2. Αλγόριθμοι

Μέθοδοι πολυδιάστατης ελαχιστοποίησης

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

HY118-Διακριτά Μαθηματικά

B = {x A : f(x) = 1}.

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

ΔΥΝΑΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΑΝΑΛΥΣΗ 1 ΕΙΚΟΣΤΟ ΠΡΩΤΟ ΜΑΘΗΜΑ, Μ. Παπαδημητράκης.

Πολυμορφισμός και Υπερφόρτωση

ΑΝΑΛΥΣΗ 1 ΤΕΤΑΡΤΟ ΜΑΘΗΜΑ, Μ. Παπαδημητράκης.

Σήματα και Συστήματα

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

> ln 1 + ln ln n = ln(1 2 3 n) = ln(n!).

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

Αριθμητική εύρεση ριζών μη γραμμικών εξισώσεων

Εφαρμοσμένα Μαθηματικά ΙΙ

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

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

ΝΟΕΡΟΙ ΥΠΟΛΟΓΙΣΜΟΙ- ΣΤΡΑΤΗΓΙΚΕΣ Ε.Κολέζα

8. Η δημιουργία του εκτελέσιμου προγράμματος γίνεται μόνο όταν το πηγαίο πρόγραμμα δεν περιέχει συντακτικά λάθη.

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

Εφαρμοσμένα Μαθηματικά ΙΙ

Μ Α Θ Η Μ Α Τ Α Γ Λ Υ Κ Ε Ι Ο Υ

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΕΝΟΤΗΤΑ 12 ΣΕΙΡΙΑΚΗ ΔΙΕΠΑΦΗ

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

Κεφάλαιο ΙV: Δείκτες και πίνακες. 4.1 Δείκτες.

Εαρινό εξάμηνο Χ. Χαραλάμπους ΑΠΘ

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

Κανόνας, για να λύσεις αυτό το μαθηματικό σταυρόλεξο. Μια πρακτική συμβουλή για τη λύση του σταυρόλεξου:

, ο αριθμός στον οποίο αντιστοιχεί ο 2 καλείται δεύτερος όρος της ακολουθίας και τον συμβολίζουμε συνήθως με

(a + b) + c = a + (b + c), (ab)c = a(bc) a + b = b + a, ab = ba. a(b + c) = ab + ac

Όταν δεν υπάρχει κίνδυνος σύγχυσης γράφουμε συνήθως ο τοπολογικός χώρος X και χρησιμοποιούμε την σύντμηση τ.χ. (= τοπολογικός χώρος).

2. Να γράψετε έναν αριθμό που είναι μεγαλύτερος από το 3,456 και μικρότερος από το 3,457.

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

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

Υπολογιστικά & Διακριτά Μαθηματικά

Μαθηματικά Γ Γυμνασίου

Πανεπιστήμιο Ιωαννίνων Τμήμα Πληροφορικής Δομές Δεδομένων [ΠΛΥ302] Χειμερινό Εξάμηνο 2012

Μαθηματικά: Αριθμητική και Άλγεβρα. Μάθημα 3 ο, Τμήμα Α. Τρόποι απόδειξης

ΕΛΛΗΝΙΚΗ ΗΜΟΚΡΑΤΙΑ ΕΛΛΗΝΙΚΟ ΑΝΟΙKΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

Transcript:

Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Πρώτο Φύλλο Ασκήσεων 1. Χρησιμοποιείστε λ-εκφράσεις και τη συνάρτηση sumf στις Σημ.1, Ενότ.3.5, για να εκφράσετε το P 10 i=1p i j=1 (i + j)2, χωρίς να ορίσετε καινούργιες συναρτήσεις όπως οι outer και inner. x sumf (\i->sumf (\j->(i+j)^2) i) 10 2. Χρησιμοποιώντας την sumf, φτιάξτε μία συνάρτηση τύπου [[Int]]->Int που να παίρνει μία λίστα με λίστες και να αθροίζει τα μεγέθη τους. x sumf (\i->length (l!!(i-1))) (length l) 3. Φτιάξτε μία συνάρτηση που να παίρνει μία λίστα ακεραίων και να απαλοίφει όλους τους ακέραιους που δεν εμφανίζονται για πρώτη φορά. Για παράδειγμα, η συνάρτησή σας παίρνει τη λίστα [1,1,0,3,4,3,1] και επιστρέφει [1,0,3,4]. x Για κάθε στοιχείο x που βρίσκουμε, χρειάζεται να φιλτράρουμε το υπόλοιπο της λίστας με τη συνθήκη x/=. Αυτό μας δίνει τον εξής κώδικα: unique :: [Int]->[Int] unique [] = [] unique (x:xs) = x:unique(filter (x/=) xs) 1

4. Μία μαθηματική σειρά που προσεγγίζει το συνημίτονο ενός αριθμού x δίνεται από: cos x = 1 - x2 x4 2! + - x6 4! 6! + ::: (όπου το x εκφράζεται σε ακτίνια). Φτιάξτε μία συνάρτηση cosapprox :: Float->[Float] που να παίρνει έναν πραγματικό αριθμό x και να επιστρέφει μία άπειρη λίστα προσεγγίσεων του cos x με βάση τον παραπάνω τύπο. Λόγω του σφάλματος που εισάγουν οι υπολογισμοί σε τιμές Float, δεν απαιτείται ο υπολογισμός με ακρίβεια μεγαλύτερη από 10-7, ενώ μπορείτε να θεωρήσετε ότι η είσοδος είναι ένας πραγματικός αριθμός μεταξύ -pi και pi. x Θα φτιάξουμε πρώτα την άπειρη σειρά των προσθετέων (-)x i /i! και θα την πούμε cosdiffapprox. Κάθε όρος της σειράς παράγεται εύκολα από τον προηγούμενο ως εξής: -prev*(x^2) / (i*(i+1)) όπου prev είναι ο προηγούμενος όρος και i+1 είναι ο αριθμός του οποίου το παραγοντικό μπαίνει στον τρέχοντα παρανομαστή. Επειδή είναι το x^2 και όχι το x που χρειαζόμαστε, θα το υπολογίσουμε μία φορά και θα το ονομάσουμε xx. Η παραπάνω έκφραση γίνεται: -prev*xx / (i*(i+1)) Προσέχουμε τώρα ότι το i είναι ακέραιος. Επίσης, για λόγους καλύτερης ακρίβειας, είναι καλύτερα να κάνουμε πολλαπλασιασμούς και διαιρέσεις εναλλάξ. Η έκφρασή μας γίνεται: -prev / fromintegral i * xx / fromintegral (i+1) Για να φτιάξουμε τη σειρά cosdiffapprox, χρησιμοποιούμε μία βοηθητική συνάρτηση diffapproxaux η οποία παίρνει σαν παραμέτρους αυτά ακριβώς που χρειαζόμαστε: το xx, το prev και το i, και δημιουργεί τη σειρά από το τρέχον σημείο και πέρα: diffapproxaux :: Float->Float->Int->[Float] diffapproxaux xx prev i = current : diffapproxaux xx current (i+2) current = -prev / fromintegral i * xx / fromintegral (i+1) 2

Προσέξτε πώς η diffapprox δεν υπολογίζει μόνο τον τρέχοντα όρο current, αλλά καλεί τον εαυτό της για τον επόμενο όρο, περνόντας τις κατάλληλες παραμέτρους: το xx, τον νέο όρο current και το i αυξημένο κατά 2. Ο όρος current ονομάζεται μέσα σε και για αναγνωσιμότητα και επειδή χρησιμοποιείται δύο φορές. Τώρα μπορούμε να ορίσουμε την cosdiffapprox ως εξής: παίρνουμε την παράμετρο x, την υψώνουμε στο τετράγωνο και, ξεκινώντας από 1.0, εφαρμόζουμε την diffapproxaux με τις κατάλληλες παραμέτρους: cosdiffapprox :: Float->[Float] cosdiffapprox x = 1.0:diffapproxaux (x^2) 1.0 1 diffapproxaux :: Float->Float->Int->[Float] diffapproxaux xx prev i = current : diffapproxaux xx current (i+2) current = -prev / fromintegral i * xx / fromintegral (i+1) Προσέχουμε τώρα ότι, κάθε στοιχείο j της cosapprox είναι το άθροισμα όλων των στοιχείων από 0 έως j της cosdiffapprox. Θα φτιάξουμε μία συνάρτηση sums που να παίρνει μία (άπειρη) λίστα d και να παράγει την (άπειρη) λίστα των αθροισμάτων των στοιχείων της d. Θα χρησιμοποιήσουμε μία βοηθητική συνάρτηση sumsaux που συσσωρεύει ένα άθροισμα s που θα το περνάει στον εαυτό της για τον υπολογισμό του επόμενου στοιχείου: sumsaux s (x:xs) = news : sumsaux news xs news = s+x Η πρώτη κλήση της συνάρτησης αυτής είναι φυσικά με συσσωρευτικό άθροισμα 0: sums :: [Float]->[Float] sums = sumsaux 0 sumsaux :: Float -> [Float] -> [Float] sumsaux s (x:xs) = news : sumsaux news xs news = s+x Τέλος, η cosapprox είναι απλά εφαρμογή της sums στο αποτέλεσμα της cosdiffapprox: 3

cosapprox :: Float->[Float] cosapprox = sums.cosdiffapprox 5. Φτιάξτε μία συνάρτηση που να παίρνει έναν ακέραιο n και έναν πραγματικό x και να επιστρέφει τη n-οστή προσέγγιση του cos x, χρησιμοποιώντας τη συνάρτηση cosapprox του προηγούμενου ερωτήματος. x cosapproxno :: Float->Int->Float cosapproxno x n = (cosapprox x)!!n 6. Φτιάξτε μία συνάρτηση που να παίρνει δύο πραγματικούς αριθμούς x και e και επιστρέφει μία προσέγγιση του cos x με ακρίβεια e, χρησιμοποιώντας τη συνάρτηση cosapprox του προηγούμενου ερωτήματος. x Θεωρούμε ότι το e είναι θετικός. Για να έχουμε ακρίβεια e, θα πρέπει το α- πόλυτο της διαφοράς μεταξύ δύο διαδοχικών προσεγγίσεων να είναι μικρότερο του e. Η άπειρη λίστα με τις διαφορές δύο διαδοχικών προσεγγίσεων του cos x είναι η cosdiffapprox x. Επομένως, κοιτάμε σε ποιον δείκτη το απόλυτο ενός στοιχείου αυτής της λίστας γίνεται μικρότερο του e. Η λύση που δίνουμε είναι: cosapproxwith :: Float->Float->Float cosapproxwith x e = cosapprox x!! (length (takewhile (>e) [abs d d<-cosdiffapprox x]) + 1) 7. Γενικεύστε τη dovetail3 ώστε να εφαρμόζει σε οποιονδήποτε αριθμό άπειρων λιστών. x Αφού πλέον το μέγεθος των παραγόμενων συνδυασμών δε μας είναι εκ των προτέρων γνωστό, θα τις παραστήσουμε με λίστες και όχι με πλειάδες. Επομένως η συνάρτησή μας θα είναι τύπου [[Int]]->[[Int]]. Αρχίζουμε αναπαριστώντας όλες τις λίστες φυσικών αριθμών κάποιου μεγέθους len των οποίων το άθροισμα είναι sum. Η συνάρτησή μας σε περίπτωση που το μέγεθος είναι 1 επιστρέφει μόνο μία λίστα, την προφανή: 4

alllists :: Int->Int->[[Int]] alllists sum 1 = [[sum]] Σε περίπτωση μεγαλύτερου μεγέθους, η alllists επιστρέφει όλες τις λίστες με κεφαλή h μεταξύ 0 και sum και ουρά τέτοια ώστε το συνολικό άθροισμα να είναι sum. Για να πάρουμε μία τέτοια ουρά, πρέπει να καλέσουμε αναδρομικά την alllists με άθροισμα sum-h και μέγεθος len-1: alllists sum len = [h:t h<-[0..sum], t<-alllists (sum-h) (len-1)] Η alllists θα μας επιστρέφει όλες τις λίστες δεικτών των οποίων το άθροισμα είναι ένας συγκεκριμένος αριθμός. Αν έχουμε μια τέτοια λίστα δεικτών ii, καθώς και μία λίστα άπειρων λιστών ll, στην οποία θέλουμε να κάνουμε dovetailing, ο τρόπος να "εφαρμόσουμε" όλους τους δείκτες της ii στις αντίστοιχες λίστες της ll είναι να χρησιμοποιήσουμε τη zipwith: zipwith (!!) ll ii Επομένως, αν θέλουμε όλους τους συνδυασμούς στοιχείων λιστών ll από το βήμα n του dovetailing και μετά, ορίζουμε: dovetailaux :: Int->[[Int]]->[[Int]] dovetailaux n ll = [zipwith (!!) ll ii ii<-alllists n (length ll)] ++ dovetailaux (n+1) ll δηλ. παίρνουμε τους δείκτες από την alllists n (length ll), και καλούμε τη zipwith (!!) ll για να συσχετίσουμε τους δείκτες αυτούς με τις λίστες ll. Επίσης, καλούμε τη dovetailaux αναδρομικά για n+1, ώστε να παραχθούν και τα επόμενα βήματα του dovetailing. Τέλος, η συνάρτησή μας dovetail ξεκινάει αυτή τη διαδικασία από το βήμα 0: dovetail :: [[Int]]->[[Int]] dovetail = dovetailaux 0 8. Αποδείξτε ότι για κάθε c και n<-[0..] ισχύει 8i<-[0..n-1]. (replicate n c)!!i == c Ο ορισμός του replicate είναι: 5

replicate 0 c = [] replicate n c = c : replicate(n-1)c x Απόδειξη με επαγωγή φυσικών στο n. Η βάση της επαγωγής είναι τετριμμένη, λόγω χρήσης καθολικού ποσοδείκτη πάνω σε κενό σύνολο. Το βήμα της επαγωγής αποδεικνύεται ως εξής. Έστω 8i<-[0..n-1]. (replicate n c)!!i == c (επαγωγική υπόθεση) και i<-[0..n]. Θα πρέπει να αποδείξουμε: (replicate(n+1)c)!!i == c Παίρνουμε δύο περιπτώσεις. Στην πρώτη έχουμε i==0 και η απόδειξη προχωράει ως εξής: (replicate(n+1)c)!!i = (c:replicate n c)!!0 = c Στη δεύτερη έχουμε i>0 και η απόδειξη είναι (replicate(n+1)c)!!i = (c:replicate n c)!!i = (replicate n c)!!(i-1) επαγ. υπόθ. και i-1 <- [0..n-1] = c 6