ΤΕΧΝΗΤΗ ΝΟΗΜΟΣΥΝΗ 5 ο Εξάμηνο - Ενότητα 7 - Επεξεργασία Λιστών Δημοσθένης Σταμάτης Τμήμα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ
Για την PROLOG η λίστα είναι μία ειδική περίπτωση συναρτησιακού όρου (functional term) για τον οποίο παρέχεται ειδικός συμβολισμός Tα στοιχεία της λίστας χωρίζονται μεταξύ τους με κόμματα και περικλείονται σε τετράγωνες παρενθέσεις: [α 1, α 2,..., α η ] Οι Λίστες (Lists) στην PROLOG! [1, 2, 3, 4, 5] [john, mary, nick] [son,mon,tues,wen,thί,frί,sat] [1, α, b, 3, f(1,2)] [1, [4, 6], 3, [7, [8, 9], 5] ] ΠΑΡΑΔΕΙΓΜΑΤΑ:
Στη γενικότερη περίπτωση όταν τα στοιχεία της λίστας δεν είναι γνωστά αυτή αναπαριστάνεται ως εξής: [ ] για την περίπτωση που η λίστα είναι κενή [Η|Τ] για την περίπτωση που η λίστα έχει για κεφαλή το στοιχείο Η και ουρά της την Τ που είναι με τη σειρά της μία λίστα Οι Λίστες (Lists) στην PROLOG! (2/3) Το σύμβολο | θεωρείται ενθεματικό (infix) συναρτησιακό σύμβολο και εφαρμόζεται αναδρομικά με την έννοια ότι η ουρά της λίστας Τ μπορεί με τη σειρά της να έχει τη μορφή: Τ = [Η2|Τ2] (η T2 = [H3|T3] κ.ο.κ)
Οι Λίστες (Lists) στην PROLOG! (3/3) Με τη χρήση του | η λίστα [1,2,3,4,5] μπορεί να παρασταθεί εναλλακτικά: [ 1 | [ 2 | [ 3 | [ 4 | [ 5 | [ ] ] ] ] ] ] [ 1, 2 | [ 3 | [ 4 | [ 5 | [ ] ] ] ] ] [ 1, 2, 3 | [ 4 | [ 5 | [ ] ] ] ] [ 1, 2, 3, 4 | [ 5 | [ ] ] ] [ 1, 2, 3, 4, 5 | [ ] ] [ 1, 2, 3, 4, 5 ]
% member(Element, List) Ελέγχει εάν το στοιχείο Element είναι μέλος της λίστας List Το Κατηγόρημα member Το Κατηγόρημα member (1/2) member(Χ,[Χ|Τail]). member(Χ,[Head |Tail]) :- member(X,Tail).
?- member(b, [c, a, b, d, f, o]). yes Το Κατηγόρημα member Το Κατηγόρημα member (2/2) member(Χ,[Χ|Τail]). member(Χ,[Head |Tail]) :- member(X,Tail). ?- member(X, [c, a, b, d, f, o]). X = c ; X = a ; X = b ;... k.o.k.
% append(List1, List2, List3) Συνδέει τα στοιχεία της λίστας List2 πίσω από τα στοιχεία της λίστας List1 και τοποθετεί το αποτέλεσμα στη λίστα List3 Το Κατηγόρημα append Το Κατηγόρημα append (1/4) append([ ], List, List). append([Head|Tail],List,[Head|NewList) :- append(Tail,List,NewList).
?- append([a, k, b], [c, d, e, f], L). L = [a, k, b, c, d, e, f] Το Κατηγόρημα append Το Κατηγόρημα append (2/4) append([ ], List, List). append([Head|Tail],List,[Head|NewList) :- append(Tail,List,NewList). ?- append(L1, [c, d, e], [a, b, c, d, e]) L1 = [a, b]
Το Κατηγόρημα append Το Κατηγόρημα append (3/4) append([ ], List, List). append([Head|Tail],List,[Head|NewList) :- append(Tail,List,NewList). ?- append([a, b], L2, [a, b, c, d, e]). L2 = [c, d, e] ?- append([a, b], L2, [f, m, c, d, e]) no
Το Κατηγόρημα append Το Κατηγόρημα append (4/4) append([ ], List, List). append([Head|Tail],List,[Head|NewList) :- append(Tail,List,NewList). ?- append(L1, L2, [a, b, c]). L1 = [ ], L2 = [a, b, c] ; L1 = [a], L2 = [b, c] ; L1 = [a, b ], L2 = [c] ; L1 = [a, b, c ], L2 = [ ] ; no