Δομές Δεδομένων στο Λ.Π.
Λίστες Λίστα είναι ένας όρος –Οι όροι αυτοί ορίζονται με τη βοήθεια μιας συνάρτησης: [ ] σταθερά για κενή λίστα – 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| X s ], L):- length (X s, 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| X s ], X, Y s ):- delete (X s, X, Y s ). delete ([X| X s ], Z, [X| Y s ]):- X ≠ Z, delete (X s, Z, Y s ). delete ([ ], X, [ ]). Τι θα γίνει αν αφαιρέσουμε τη συνθήκη «X ≠ Z»; (not all occurrences deleted!) ? delete ([a], b, [a]) –Yes
Προγράμματα διαχείρισης λιστών %new_delete new_delete (X, [X| X s ], X s ). new_delete (X, [Y| Y s ], [Y| Z s ]):- select (X, Y s, Z s ). % select select (X, [X| X s ], X s ) select (X, [Y| Y s ], [Y| Z s ]):- select (X, Y s, Z s ) Ποιά η διαφορά των δύο “delete”;
Ταξινόμηση sort (X, Y):- permutation (X, Y), ordered (Y). Παράδειγμα «generate-and-test» Naïve permutation sort % ordered ordered ([]) ordered ([X]) ordered ([X, Y| Y s ]):- X<= Y, ordered ([Y| Y s ]). % 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, L s ), quicksort (Bigs, B s ), append (L s, [X| B s ], Y s ). quicksort([], []) partition ([X| X s ], Y, [X| L s ], B s ):- X<=Y, partition (X s, Y, L s, B s ) partition ([X| X s ], Y, L s, [X| B s ]):- X>Y, partition (X s, Y, L s, B s ) 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