150 likes | 161 Views
Δομές Δεδομένων στο Λ.Π. Λίστες. Λίστα είναι ένας όρος Οι όροι αυτοί ορίζονται με τη βοήθεια μιας συνάρτησης: [ ] σταθερά για κενή λίστα – nil [t1| l] όπου t1 όρος και l λίστα η συνάρτηση έχει το σύμβολο [ | ] ( ↔ f ( , ) ) Παραδείγματα [8,6, cat] [8| [6| [cat| []]]]
E N D
Λίστες • Λίστα είναι ένας όρος • Οι όροι αυτοί ορίζονται με τη βοήθεια μιας συνάρτησης: • [ ] σταθερά για κενή λίστα – nil • [t1| l] όπου t1 όρος και l λίστα • η συνάρτηση έχει το σύμβολο [ | ] ( ↔f( , ) ) • Παραδείγματα • [8,6,cat] [8| [6| [cat| []]]] • [a] [a| []] • [a| X] • [a, b, 3| X]
Πρόγραμμα κωδικοποίησης λιστών • list ([]). list ([Χ| Χs]):- list (Χs). • ? list ([1, 3, 9]) • Yes • list ([a|[]]) • Yes • list ([a| X]) X = []; X = [A]; X = [A, B]
Προγράμματα διαχείρισης λιστών • member (Χ, [Χ| Χs]). member (Χ, [Υ| Υs]):- member (Χ, Υs). • ? member (b, [a, b, c]) • Yes • ? member (a, []) • No • ? member (b, Χ) X = [b| A]; X = [A, b| B] ….
Προγράμματα διαχείρισης λιστών • append ([], Χ, Χ). append ([Χ| Χ1], Υ, [Χ| Ζ]):- append (Χ1,Υ,Ζ). • ? append ([a, b], [c, d], X) X= [a, b, c, d] • ? append (X, [c, d], [a, c, d]) X= [a]
Προγράμματα διαχείρισης λιστών • reverse ([], []) reverse ([X| X1], Z):- reverse (X1, Y), append (Y, [X], Z). • ? reverse ([a, b, c], X) X = [c, b, a] • length ([], 0). length ([X| Xs], L):- length (Xs, N), L is N+1
Δένδρο υπολογισμού reverse ([a, b], X) • (2ον κανόνα) • reverse ([b], Y), append (Y, [a], X) • | (2ο κανόνα) • reverse ([], Y1), append (Y1, [b], Y), append (Y, [a], X) • | (1ο κανόνα) • append ([], [b], Y), append (Y, [a], X) • | (1ο κανόνα) • append ([b], [a], X) • | (2ο κανόνα) X=[b| z] • append ([], [a], Z)) • | Z= [a] • [] X= [b| Z], Z=[a] => X=[b|[a]]=[b,a] Yes, X=[b,a]
(Ground) Δένδρο • reverse ([a, b], [b, a]) • | • reverse ([b], [b]), append ([b], [a], [b, a]) • | • reverse ([], []), append ([], [b], [b], append ([b], [a], [b, a]) • | (γεγονός) • append ([], [b], [b], append ([b], [a], [b, a] • | (γεγονός) • append ([b], [a], [b, a] • | • append ([], [a], [a] • | (γεγονός) • []
Προγράμματα διαχείρισης λιστών • %delete(Αρχική Λίστα, Στοιχείο, Τελική Λίστα) • delete ([X| Xs], X, Ys):- delete (Xs, X, Ys). delete ([X| Xs], Z, [X| Ys]):- X ≠ Z, delete (Xs, Z, Ys). delete ([ ], X, [ ]). • Τι θα γίνει αν αφαιρέσουμε τη συνθήκη «X ≠ Z»; (not all occurrences deleted!) • ? delete ([a], b, [a]) • Yes
Προγράμματα διαχείρισης λιστών • %new_delete • new_delete (X, [X| Xs], Xs). new_delete (X, [Y| Ys], [Y| Zs]):- select (X, Ys, Zs). • % select • select (X, [X| Xs], Xs) • select (X, [Y| Ys], [Y| Zs]):- select (X, Ys, Zs) • Ποιά η διαφορά των δύο “delete”;
Ταξινόμηση • sort (X, Y):- permutation (X, Y), ordered (Y). Παράδειγμα«generate-and-test» Naïve permutation sort • % ordered ordered ([]) ordered ([X]) ordered ([X, Y| Ys]):- X<= Y, ordered ([Y| Ys]). • % permutation permutation (Χ, [Υ| Ζ]):- select (Υ, Χ,Υ1), permutation (Υ1, Ζ). permutation ([], []).
Insertion sort • sort ([Χ| Χs], Υs):- sort (Χs, Ζs), insert (Χ, Ζs,Υs) sort ([], []) • %insert insert (Χ, [], [Χ]) insert (Χ, [Υ| Υs], [Υ| Ζs]):- Χ > Υ, insert (Χ, Υs, Ζs) insert (Χ, [Υ| Υs], [Χ, Υ| Υs]):- Χ <= Υ.
Quicksort • quicksort ([Χ| Χs], Υs):- partition (Χs, Χ, Littles, Bigs), quicksort (Littles, Ls), quicksort (Bigs, Bs), append (Ls, [X| Bs], Ys). quicksort([], []) partition ([X| Xs], Y, [X| Ls], Bs):- X<=Y, partition (Xs, Y, Ls, Bs) partition ([X| Xs], Y, Ls, [X| Bs]):- X>Y, partition (Xs, Y, Ls, Bs) partition ([], Y, [], [])
Δένδρα • Δένδρο είναι όρος που ορίζεται με τη βοήθεια της συνάρτησης: • void • tree (Element, Left, Right) • %binary_tree (Tree) binary_tree (void). binary_tree (tree (Element, Left, Right)):- binary_tree (Left), binary_tree (Right). • tree_member (Element, Tree) tree_member (Χ, tree (Χ, L, R)) tree_member (Χ, tree (Y, L, R)):- tree_member (X, Left) tree_member (Χ, tree (Y, L, R)):- tree_member (X,Right)
Δένδρα (συνέχεια) • % substitute (X, Y, TreeX, TreeY) substitute (X, Y, void, void) substitute (X, Y, tree (N, L, R), tree (N1, L1, R1):- replace (X, Y, N, N1), substitute (X, Y, L, L1), substitute (X, Y, R, R1). replace (X, Y, X, Y) replace (X, Y, Z, Z):- X ≠ Z