Κεφάλαιο 1 Άσκηση 1.1 πολύτιµο_µέταλλο(χρυσάφι). αρέσει(γιώργος, ποδόσφαιρο). πρωτεύουσα(αθήνα, ελλάδα). χώρα(ελλάδα). χάρισε(µαρία,γιώργος,βιβλίο). αρέσουν(εκδροµές,χ). Άσκηση 1.2?πολύτιµο_µέταλλο(ασήµι).?πρωτεύουσα(Χ,ελλάδα).?χώρα(αφρική).?χάρισε(Χ,Υ,Ζ).?αρέσουν(εκδροµές,νίκος). Άσκηση 1.3?αγαπά(Χ,Χ).?αγαπά(Χ,Υ), αγαπά(υ,χ).?αγαπά(χ,ζ), αγαπά(υ,ζ).... Άσκηση 1.4 αγαπά(χ,χ). αγαπά(α,γ):-αγαπά(α,β), αγαπά(β,γ). αγαπά(χ,υ):-αγαπά(υ,χ). αγαπά(χ,υ):-αγαπά(χ,ζ), αγαπά(υ,ζ). Άσκηση 1.5 είναι_µητέρα(χ):-µητέρα(χ,υ). είναι_πατέρας(χ):-είναι_πατέρας(χ,υ). είναι_αδελφή(χ,υ):-γονιός(ζ,χ), γονιός(ζ,υ), γυναίκα(χ). είναι_αδελφός(χ,υ):-γονιός(ζ,χ), γονιός(ζ,υ), άνδρας(χ). είναι_παππούς(χ,υ):-πατέρας(χ,ζ), γονιός(ζ,υ). είναι_θείος(χ,υ):-είναι_αδελφός(χ,ζ), γονιός(ζ,υ). είναι_θείος(χ,υ):-είναι_αδελφή(χ,ζ), γονιός(ζ,υ). Άσκηση 1.6 πλήρες_γεύµα(ορεκτικό(µαρούλι), κύριο_πιάτο(σούπα), φρούτο(µήλο)). Άσκηση 1.7 Στο προηγούµενο πρόγραµµα προσθέτουµε τα γεγονότα: φρούτο_εποχής(καρπούζι). φρούτο_εποχής(σταφύλι). οπότε θα υποβάλουµε σύνθετες ερωτήσεις που θα διασφαλίζουν ότι το φρούτο του γεύµατος θα είναι εποχής. Άσκηση 1.8 γνωστός(ονοµατ(όνοµα(νίκος), επίθετο(νικολάου)), τηλέφωνο(234567)). γνωστός(ονοµατ(όνοµα(γιώργος), επίθετο(γεωργίου)), τηλέφωνο(456789)). γνωστός(ονοµατ(όνοµα(βασίλης), επίθετο(βασιλείου)), τηλέφωνο(345567)). Άσκηση 1.9 πόλη(α). πόλη(β). πόλη(γ). πόλη( ). πόλη(ε). πόλη(z). δρόµος(α,β). δρόµος(β,ε). δρόµος(β,ζ). δρόµος(γ, ). δρόµος(,α). δρόµος(ε,ζ). δρόµος(ζ,γ). Άσκηση 1.10 Το κατηγόρηµα «δρόµος» θα είχε ένα ακόµη όρισµα (θα ήταν δηλαδή κατηγόρηµα 3ης τάξης), και το επιπλέον όρισµα θα δήλωνε το µήκος του δρόµου. Για παράδειγµα: δρόµος(α,β,15). πλήρες_γεύµα(ορεκτικό(ντοµάτα), κύριο_πιάτο(κρέας), φρούτο(σταφύλι)). πλήρες_γεύµα(ορεκτικό(λάχανο), κύριο_πιάτο(ψάρι), φρούτο(καρπούζι)). - 1 -
Κεφάλαιο 2 Άσκηση 2.1 Θα πάρουµε την απάντηση Χ=φ(φ(φ(φ(φ(φ(φ(...))))))) Ο µηχανισµός ταυτοποίησης αρχικά θέτει Χ=Υ και στη συνέχεια θέτει φ(χ)=υ, όµως αφού Υ=Χ, προκύπτει φ(χ)=χ. Επιχειρείται δηλαδή µια µεταβλητή να εξισωθεί µε έναν σύνθετο όρο, ο οποίος όµως περιέχει την µεταβλητή. Αυτό έχει σαν αποτέλεσµα ο µηχανισµός ταυτοποίησης της Prolog να µπει σε έναν ατέρµονο βρόγχο, όπου από την σχέση Χ=φ(Χ), προσπαθεί να απαλείψει από το δεύτερο µέλος το Χ, αντικαθιστώντας το κάθε φορά µε φ(χ)... Άσκηση 2.2 Η ερώτηση που πρέπει να υποβάλουµε είναι η εξής:?- είναι_φίλος(μ1,μ2), διδάσκεται(αριθµητική,τάξη(τ)), µαθητής(μ1, τάξη(τ)). και θα µας επιστρέψει στην µεταβλητή Μ1 τους µαθητές που διδάσκονται αριθµητική και σττην µεταβλητή Μ2 τους φίλους τους. Τµήµα του δένδρου υπολογισµού φαίνεται στην επόµενη σελίδα. Από όλο το δένδρο υπολογισµού έχει σχεδιασθεί το αριστερότερο τµήµα του και παρουσιάζονται οι πρώτες 6 από τις 15 συνολικά λύσεις που βρίσκει η Prolog. Το σύνολο των λύσεων µε τη σειρά που τις βρίσκει η Prolog είναι το εξής: Μ1=γιώργος, Μ2=γιώργος, Τ=τάξη(2). Μ1=σοφία, Μ2=σοφία, Τ=τάξη(5). Μ1=σοφία, Μ2=νίκος, Τ=τάξη(5). Μ1=νίκος, Μ2=σοφία, Τ=τάξη(5). Μ1=νίκος, Μ2=νίκος, Τ=τάξη(1). Μ1=µαρία, Μ2=µαρία, Τ=τάξη(2). Μ1=µαρία, Μ2=γιώργος, Τ=τάξη(2). Μ1=µαρία, Μ2=σοφία, Τ=τάξη(2). Μ1=γιώργος, Μ2=µαρία, Τ=τάξη(2). Μ1=γιώργος, Μ2=γιώργος, Τ=τάξη(2). Μ1=γιώργος, Μ2=σοφία, Τ=τάξη(2). Μ1=σοφία, Μ2=µαρία, Τ=τάξη(5). Μ1=σοφία, Μ2=γιώργος, Τ=τάξη(5). Μ1=σοφία, Μ2=σοφία, Τ=τάξη(5). - 2 -
? είναι_φίλος(μ1,μ2), διδάσκεται(αριθµητική, Τ), µαθητής(μ1,τ).?αρέσει(γλώσσα, Μ2), διδάσκεται(αριθµητική,τ), µαθητής(γιώργος,τ). (14), Μαθ=γλώσσα, Μ1=γιώργος?αρέσει(αριθµητική, Μ2), διδάσκεται(αριθµητική,τ), µαθητής(σοφία,τ).?αρέσει(μαθ,μ1), αρέσει(μαθ, Μ2), διδάσκεται(αριθµητική,τ), µαθητής(μ1,τ). (15), Μαθ=αριθµητική, Μ1=σοφία (16), Μαθ=αριθµητική, Μ1=νίκος?αρέσει(αριθµητική, Μ2), διδάσκεται(αριθµητική,τ), µαθητής(νίκος,τ). (17), Μαθ=µουσική, Μ1=Χ?διδάσκεται (µουσική, τάξη(τ1)), µαθητής(μ1, τάξη(τ1)), αρέσει(µουσική, Μ2), διδάσκεται(αριθµητική,τ), µαθητής(μ1,τ). (14), Μ2=γιώργος?διδάσκεται(αριθµητική,Τ ), µαθητής(γιώργος,τ). (15), Μ2=σοφία?διδάσκεται(αριθµητική, Τ), µαθητής(σοφία,τ). (16), Μ2=νίκος?διδάσκεται(αριθµητική, Τ), µαθητής(σοφία,τ). (15), Μ2=σοφία?διδάσκεται(αριθµητική, Τ), µαθητής(νίκος,τ). (16), Μ2=νίκος?διδάσκεται(αριθµητική, Τ), µαθητής(νίκος,τ). (12), Τ1=2?µαθητής(Μ1, τάξη(2)), αρέσει(µουσική, Μ2), διδάσκεται(αριθµητική,τ), µαθητής(μ1,τ). (7), T=τάξη(1) (7), T=τάξη(1) (7), T=τάξη(1) (7), T=τάξη(1) (7), T=τάξη(1) (3), Μ1=µαρία?µαθητής(γιώργος,τάξη(1)?µαθητής(σοφία,τάξη(1)?µαθητής(σοφία,τάξη(1)?µαθητής(νίκος,τάξη(1)) ΝΑΙ?µαθητής(νίκος,τάξη(1)) ΝΑΙ?αρέσει(µουσική, Μ2), διδάσκεται(αριθµητική,τ),µαθητής(µαρία,τ). (8), T=τάξη(2) (8), T=τάξη(2) (8), T=τάξη(2) (8), T=τάξη(2) (8), T=τάξη(2) (17)?µαθητής(γιώργος,τάξη(2) ΝΑΙ?µαθητής(σοφία,τάξη(2)?µαθητής(σοφία,τάξη(2)?µαθητής(νίκος,τάξη(2))?µαθητής(νίκος,τάξη(2))?διδάσκεται(µουσική,τάξη(Τ2)),µαθητής(Μ2, τάξη(τ2)),διδάσκεται(αριθµητική,τ), µαθητής(µαρία,τ). (9), T=τάξη(5) (9), T=τάξη(5) (9), T=τάξη(5) (9), T=τάξη(5) (9), T=τάξη(5) (12) Τ2=2?µαθητής(γιώργος,τάξη(5)?µαθητής(σοφία,τάξη(5) ΝΑΙ?µαθητής(σοφία,τάξη(5) ΝΑΙ?µαθητής(νίκος,τάξη(5))?µαθητής(νίκος,τάξη(5))?µαθητής(Μ2,τάξη(2)),διδάσκεται(αριθµητικ ή,τ), µαθητής(µαρία,τ). (3) Μ2=µαρία?διδάσκεται(αριθµητική,Τ), µαθητής(µαρία,τ). - 3 - (7) Τ=τάξη(1)?µαθητής(µαρία,τάξη(1)). (8) Τ=τάξη(5)?µαθητής(µαρία,τάξη(5)). (8) Τ=τάξη(2)?µαθητής(µαρία,τάξη(2)). ΝΑΙ
Κεφάλαιο 3 Άσκηση 3.1 αρχικό_τµήµα([],λ). αρχικό_τµήµα([σ Λ1],[Σ Λ2]):-αρχικό_τµήµα(Λ1,Λ2). ή αλλιώς αρχικό_τµήµα(λ1,λ):-παράθεση(λ1,λ2,λ). Άσκηση 3.2 τελικό_τµήµα(λ,λ). τελικό_τµήµα(λ1,[χ Λ2]):-τελικό_τµήµα(Λ1,Λ2). Άσκηση 3.3 τελευταίο(χ,λ):-παράθεση(λ1,χ,λ). Άσκηση 3.4 υπολίστα([],λ). υπολίστα([],λ,0). υπολίστα([χ Λ1],[Χ Λ2]):-υπολίστα(Λ1,Λ2,0). υπολίστα(λ1,[χ Λ2]):-υπολίστα(Λ1,Λ2). υπολίστα([χ Λ1],[Χ Λ2],0):-υπολίστα(Λ1,Λ2,0). Προσοχή: η συγκεκριµένη σειρά των κατηγορηµάτων και των κανόνων οδηγεί στην πιο γρήγορη εύρεση αποτελέσµατος. ή αλλιώς υπολίστα(l1,l):-αρχικό_τµήµα(l1,l2), παράθεση(l3,l2,l). Άσκηση 3.5 διπλά([χ],[χ,χ]). διπλά([χ S1],[Χ,Χ S2]):-διπλά(S1,S2). Άσκηση 3.6 push(x,s,[x S]). pop(x,[x S]). Άσκηση 3.7 συµµετρική([x]). συµµετρική([x,χ]). συµµετρική(s):- παράθεση([χ S1],[X],S), συµµετρική(s1). Άσκηση 3.8 κιβώτια(χ,υ,ζ,[x S1],[Y S2],[Z S3]). κιβώτια(x,y,z,[a1 S1],[A2 S2],[A3 S3]):- κιβώτια(x,y,z,s1,s2,s3). - 4 -
Άσκηση 3.9 ανάστροφος_πίνακα(λ1,λ2):-ανάστροφος_πίνακα(λ1,λ2,[]). ανάστροφος_πίνακα([[η11 Τ11] Τ1],[[Η21 Τ21] Τ2],Λ3):- Η11=Η21, ανάστροφος_πίνακα([τ11 Τ1],Τ2,[Τ2 Λ3]). ανάστροφος_πίνακα([[] Τ1],[],Λ3):- ανάστροφη(λ3,αλ3), ανάστροφος_πίνακας(τ1,αλ3,[]). ανάστροφος_πίνακας([[]],[],_). Άσκηση 3.10 ίδιο_πλήθος([χ],[υ]). ίδιο_πλήθος([χ S1], [Y S2]):-ίδιο_πλήθος(S1,S2). Άσκηση 3.11 τοποθέτησε_στο_τέλος([σ],[],λ). τοποθέτησε_στο_τέλος([σ],[σ1 Λ1],[Σ2 Λ2]):-τοποθέτησε_στο_τέλος([Σ],Λ1,Λ2). Άσκηση 3.12 µοίρασε([],[],[]) µοίρασε([χ],[χ],[]). µοίρασε([χ,υ],[χ],[υ]). µοίρασε([χ,υ S1],[X S2],[Y S3]):-µοίρασε(S1,S2,S3). Άσκηση 3.13 ίδια_στοιχεία([]). ίδια_στοιχεία([χ]). ίδια_στοιχεία([χ,χ S]):-ίδια_στοιχεία(S). Άσκηση 3.14 επανάληψη(s,[]). επανάληψη(s,s). επανάληψη(s1,s2):-παράθεση(s1, S,S2), επανάληψη(s1,s). - 5 -
Κεφάλαιο 4 Άσκηση 4.1 τιµή_αληθείας(nand(x,y),1):-τιµή_αληθείας(not(and(x,y)),1). τιµή_αληθείας(nand(x,y),0):-τιµή_αληθείας(not(and(x,y)),0). τιµή_αληθείας(nor(x,y),1):-τιµή_αληθείας(not(or(x,y)),1). τιµή_αληθείας(nor(x,y),0):-τιµή_αληθείας(not(or(x,y)),0). Άσκηση 4.2 Θα χρησιµοποιήσω τον σύνθετο όρο σ(f,g) για να δηλώσω την σύνθετη συνάρτηση F(G(x)). παράγωγος(σ(f,g), X, *(σ(df,g), DG)):- παράγωγος(f, X, DF), παράγωγος(g, X, DF). Άσκηση 4.3 παραγοντικό(0,ε(0)). παραγοντικό(ε(χ),υ):- παραγοντικό(χ,υ1), γινόµενο(ε(χ), Υ1, Υ). Άσκηση 4.4 δύναµη(χ, 0, ε(0)):-είναι_φυσικός(χ). δύναµη(χ, ε(υ), Ζ):- δύναµη(χ, Υ, Ζ1), γινόµενο(χ, Ζ1, Ζ). Άσκηση 4.5 είναι_περιττός(ε(0)). είναι_περιττός(ε(ε(χ))):-είναι_περιττός(χ). Άσκηση 4.6 είναι_άρτιος(0). είναι_άρτιος(ε(ε(χ))):-είναι_άρτιος(χ). - 6 -
Κεφάλαιο 5 Άσκηση 5.1 τύπωσε_λίστα(λ):-τύπωσε_λίστα(λ,''). τύπωσε_λίστα(λ,α):- γράψε(α), γράψε('['), νέα_γραµµή, συνένωσε(α,' ',Β), τύπωσε_λίστα0(λ,β), γράψε(α), γράψε(']'), νέα_γραµµή. τύπωσε_λίστα0([],_). τύπωσε_λίστα0([[σ1 Λ1] Λ0],Α):- τύπωσε_λίστα([σ1 Λ1],Α), τύπωσε_λίστα0([λ0,α). τύπωσε_λίστα0([σ Λ1],Α):- γράψε(α), γράψε(σ), νέα_γραµµή, τύπωσε_λίστα0(λ1,α). Άσκηση 5.2 τύπωσε_λίστα(λ):-τύπωσε_λίστα(λ,''). τάξη(a). τάξη(b). τάξη(c). τάξη(d). επόµενη_τάξη(τάξη(a),τάξη(b)). επόµενη_τάξη(τάξη(b),τάξη(c)). επόµενη_τάξη(τάξη(c),τάξη(d)). τελευταία_τάξη(τάξη(d)). πρόγραµµα(τάξη(a),µάθηµα('maths '),καθηγητής('γεωργίου '),1,αίθουσα('αίθουσα_a ')). πρόγραµµα(τάξη(b),µάθηµα('physic '),καθηγητής('ιωάννου '),1,αίθουσα('αίθουσα_b ')). πρόγραµµα(τάξη(c),µάθηµα('computer '),καθηγητής(' ηµητρίου '),1,αίθουσα('αίθουσα_d ')). πρόγραµµα(τάξη(d),µάθηµα('chemie '),καθηγητής('νικολάου '),1,αίθουσα('αίθουσα_c ')). πρόγραµµα(τάξη(a),µάθηµα('chemie '),καθηγητής('νικολάου '),2,αίθουσα('αίθουσα_a ')). πρόγραµµα(τάξη(b),µάθηµα('maths '),καθηγητής('γεωργίου '),2,αίθουσα('αίθουσα_c ')). πρόγραµµα(τάξη(c),µάθηµα('computer '),καθηγητής(' ηµητρίου '),2,αίθουσα('αίθουσα_b ')). πρόγραµµα(τάξη(d),µάθηµα('physic '),καθηγητής('ιωάννου '),2,αίθουσα('αίθουσα_d ')). πρόγραµµα(τάξη(a),µάθηµα('physic '),καθηγητής('ιωάννου '),3,αίθουσα('αίθουσα_b ')). πρόγραµµα(τάξη(b),µάθηµα('computer '),καθηγητής(' ηµητρίου '),3,αίθουσα('αίθουσα_c ')). πρόγραµµα(τάξη(c),µάθηµα('chemie '),καθηγητής('νικολάου '),3,αίθουσα('αίθουσα_a ')). πρόγραµµα(τάξη(d),µάθηµα('maths '),καθηγητής('γεωργίου '),3,αίθουσα('αίθουσα_d ')). τύπωσε_πρόγραµµα:- νέα_γραµµή,νέα_γραµµή, γράψε('τάξηes: '),τύπωσε_τάξηes(τάξη(a)),νέα_γραµµή, γράψε(' ----------------------------------------------------------'),νέα_γραµµή, τύπωσε_πρόγραµµα0(1,τάξη(a)). τύπωσε_πρόγραµµα0(ώρα,τάξη):- γράψε(' '),τύπωσε_καθηγητήςs(ώρα,τάξη),νέα_γραµµή, γράψε('ώρα: '),γράψε(ώρα),γράψε(' '), τύπωσε_µάθηµαs(ώρα,τάξη),νέα_γραµµή, γράψε(' '),τύπωσε_αίθουσαs(ώρα,τάξη),νέα_γραµµή,νέα_γραµµή, αύξησε(ώρα,ώρα0),τύπωσε_πρόγραµµα0(ώρα0,τάξη). - 7 -
τύπωσε_τάξηes(τάξη):- Τάξη=τάξη(Τάξη0),γράψε(Τάξη0),γράψε(' επόµενη_τάξη(τάξη,επόµενη_τάξη), τύπωσε_τάξηes(επόµενη_τάξη). '), τύπωσε_τάξηes(τάξη):- τελευταία_τάξη(τάξη). τύπωσε_καθηγητήςs(ώρα,τάξη):- πρόγραµµα(τάξη,µάθηµα(μάθηµα),καθηγητής(καθηγητής),ώρα,αίθουσα(αίθουσα)), γράψε(καθηγητής),γράψε(' '), επόµενη_τάξη(τάξη,επόµενη_τάξη), τύπωσε_καθηγητήςs(ώρα,επόµενη_τάξη). τύπωσε_καθηγητήςs(_,τάξη):- τελευταία_τάξη(τάξη). τύπωσε_µάθηµαs(ώρα,τάξη):- πρόγραµµα(τάξη,µάθηµα(μάθηµα),καθηγητής(καθηγητής),ώρα,αίθουσα(αίθουσα)), γράψε(μάθηµα),γράψε(' '), επόµενη_τάξη(τάξη,επόµενη_τάξη), τύπωσε_µάθηµαs(ώρα,επόµενη_τάξη). τύπωσε_µάθηµαs(_,τάξη):- τελευταία_τάξη(τάξη). τύπωσε_αίθουσαs(ώρα,τάξη):- πρόγραµµα(τάξη,µάθηµα(μάθηµα),καθηγητής(καθηγητής),ώρα,αίθουσα(αίθουσα)), γράψε(αίθουσα),γράψε(' '), επόµενη_τάξη(τάξη,επόµενη_τάξη), τύπωσε_αίθουσαs(ώρα,επόµενη_τάξη). τύπωσε_αίθουσαs(_,τάξη):- τελευταία_τάξη(τάξη). Άσκηση 5.3 αντέγραψε(χ,υ):- δες(χ), πες(υ), εκτέλεσε_αντιγραφή, δες, πες. εκτέλεσε_αντιγραφή:- πάρε(χ), τοποθέτησε(χ), εκτέλεσε_αντιγραφή. εκτέλεσε_αντιγραφή. Άσκηση 5.4 µετέτρεψε(x,y):- όνοµα(x,lx), µετατροπή(lx,ly), όνοµα(y,ly). µετατροπή([],[]). - 8 -
HX>=152, HX=<175, HY is HX-24, HX=224, HY is 240, HX=225, HY is 234, HX=226, HY is 235, HX=227, HY is 236, HX=228, HY is 136, HX=229, HY is 237, HX=230, HY is 238, HX=231, HY is 239, HX=232, HY is 147, HX=233, HY is 240, Άσκηση 5.5 µετέτρεψε(x,y):- ονοµα(x,lx), µετατροπή(lx,ly), ονοµα(y,ly). µετατροπή([],[]). µετατροπή([151 LX],[142 LY]):- µετατροπή(lx,ly). µετατροπή([134 LX],[136 LY]):- - 9 -
µετατροπή(lx,ly). µετατροπή([147 LX],[136 LY]):- µετατροπή(lx,ly). µετατροπή([132,136 LX],[136 LY]):- µετατροπή(lx,ly). µετατροπή([142,136 LX],[136 LY]):- µετατροπή(lx,ly). µετατροπή([147,136 LX],[136 LY]):- µετατροπή(lx,ly). µετατροπή([128,136 LX],[132 LY]):- µετατροπή(lx,ly). µετατροπή([x LX],[X LY]):-µετατροπή(LX,LY). Άσκηση 5.6 διέγραψε(x,y,z):- όνοµα(x,lx),όνοµα(y,ly), εκτέλεσε_διαγραφή(lx,ly,lz), όνοµα(z,lz). εκτέλεσε_διαγραφή([],_,[]). εκτέλεσε_διαγραφή([h1 TX],[H1 TY],LZ):- εκτέλεσε2_διαγραφή(tx,ty,[h1 TY],LZ). εκτέλεσε_διαγραφή([h1 TX],[H2 TY],[H1 LZ]):- εκτέλεσε_διαγραφή(tx,[h2 TY],LZ). εκτέλεσε2_διαγραφή(lx,[],ly,lz):- εκτέλεσε_διαγραφή(lx,ly,lz). εκτέλεσε2_διαγραφή([h1 TX],[H1 TY],LY,LZ):- εκτέλεσε2_διαγραφή(tx,ty,ly,lz). εκτέλεσε2_διαγραφή(tx,ty,ly,lz):- εκτέλεσε_διαγραφή(tx,ly,lz). - 10 -
Κεφάλαιο 7 Άσκηση 7.1 δύναµη(x,y,z):-δύναµη0(x,y,z,0,1). δύναµη0(_,y,z,y,z). δύναµη0(x,y,z,a,b):- άθροισµα(a,1,a1), γινόµενο(b,x,b1), δύναµη0(x,y,z,a1,b1). Άσκηση 7.2 είναι_χώρα(ελλάδα,133000000,11000000). πυκνότητα_πληθυσµού(x,y):- είναι_χώρα(x,a,b), Y is B/A. Άσκηση 7.3 διαίρεσε_λίστα(l,0,[],l). διαίρεσε_λίστα([h T1],N,[H T2],L):- N1 is N - 1, διαίρεσε_λίστα(t1,n1,t2,l). Άσκηση 7.4 εκτύπωσε_λίστα(l):- προχώρα(l,1). προχώρα([],_). προχώρα([h T],N):- γράψε('item: '), γράψε(n), γράψε(' '), γράψε(h), νέα_γραµµή, N1 is N+1, προχώρα(t,n1). Άσκηση 7.5 διανυσµατικό_άθροισµα([],[],[]). διανυσµατικό_άθροισµα([h1 T1],[H2 T2],[H T]):- H is H1+H2, διανυσµατικό_άθροισµα(t1,t2,t). Άσκηση 7.6 γινόµενο_λίστας(l,x):-γινόµενο_λίστας0(l,x,1). γινόµενο_λίστας0([],x,x). γινόµενο_λίστας0([h T],X,N):- N1 is N * H, γινόµενο_λίστας0(t,x,n1). Άσκηση 7.7 πρόσθεσε_πίνακες([[]],[[]],[[]]). πρόσθεσε_πίνακες([[] T1],[[] T2],[[] T]):- πρόσθεσε_πίνακες(t1,t2,t). πρόσθεσε_πίνακες([[h11 T11] T1],[[H22 T22] T2],[[H0 T0] T]):- H0 is H11+H22, πρόσθεσε_πίνακες([t11 T1],[T22 T2],[T0 T]). πολλαπλασίασε_πίνακες(a1,a2,a3):- ανέστρεψε_πίνακα(α2,τα2), µέτρησε(a1,la1), µέτρησε(τa2,la2), πολλαπλασίασε_πίνακες(a1,τa2,a3,1,1,la1,la2). πολλαπλασίασε_πίνακες(a1,a2,[[h0 T0] T],X,Y,LA1,LA2):- πάρε_γράµµη(a1,x,a1x), - 11 -
πάρε_γράµµη(a2,y,a2y), υπολόγισε(a1x,a2y,h0), επόµενο_στοιχείο(a1,a2,[t0 T],X,Y,LA1,LA2). επόµενο_στοιχείο(a1,a2,[[h0 T0] T],X,Y,LA1,LA2):- X<LA1, X1 is X+1, πολλαπλασίασε_πίνακες(a1,a2,[[h0 T0] T],X1,Y,LA1,LA2). επόµενο_στοιχείο(a1,a2,[[] T],X,Y,LA1,LA2):- X=LA1, Y<LA2, Y1 is Y+1, X1 = 1, πολλαπλασίασε_πίνακες(a1,a2,t,x1,y1,la1,la2). επόµενο_στοιχείο(a1,a2,[[] []],X,Y,LA1,LA2):- X=LA1, Y=LA2. πάρε_γράµµη([l T0],1,L). πάρε_γράµµη([_ T0],X,AX):- X > 1, X1 is X-1, πάρε_γράµµη(t0,x1,ax). υπολόγισε(a1x,a2y,h0):- υπολόγισε(a1x,a2y,h0,0). υπολόγισε([],[],h0,h0). υπολόγισε([h1 T1],[H2 T2],H0,X):- X1 is X+(H1*H2), υπολόγισε(t1,t2,h0,x1). µέτρησε(a,l):- µέτρησε(a,l,0). µέτρησε([],l,l). µέτρησε([h T],L,X):- X1 is X+1, µέτρησε(t,l,x1). - 12 -
Κεφάλαιο 9 Άσκηση 9.1 διαφορά(l1,l2,l):- διαφορά(l1,l2,l,[]). διαφορά([],_,l,l). διαφορά([h1 T1],L2,L,X):- όχι(περιέχεται(h1,l2)), X1=[H1 X], διαφορά(t1,l2,l,x1). διαφορά([h1 T1],L2,L,X):- περιέχεται(h1,l2), διαφορά(t1,l2,l,x). περιέχεται(h,[]):- αποτυχία. περιέχεται(h,[h T]). περιέχεται(h0,[h T]):- περιέχεται(h0,t). Άσκηση 9.2 διαίρεσε([],[],[]). διαίρεσε([h T],[H T1],L2):- H>=0, διαίρεσε(t,t1,l2). διαίρεσε([h T],L1,[H T2]):- H<0, διαίρεσε(t,l1,t2). Άσκηση 9.3?π(Χ). Χ=α, Υ=β?π(Χ), π(υ). Χ=α, Υ=α Χ=α, Υ=β Χ=β, Υ=α Χ=β, Υ=β? π(χ), π(υ),!. Χ=α, Υ=α?π(Χ), π(υ). Χ=α, Υ=α. - 13 -
Χ=α, Υ=β. Άσκηση 9.4 switch_case(x,[x T1],[H2 T2],ELSE):- T2. switch_case(x,[h1 T1],[H2 T2],ELSE):- switch_case(x,t1,t2,else). switch_case(_,[],[],else):- ELSE. Άσκηση 9.5 Ναι, επιτρέπει. Μπορούµε να θέσουµε ερωτήσεις της µορφής: if_then_else(c,if_then_else(c1,a1,b1),if_then_else(c2,a2,b2)). οπότε ανάλογα µε το αν ισχύουν οι συνθήκες c, c1 και c2, θα εκτελεσθεί µια από τις «εντολές» a1, a2, b1 ή b2. Άσκηση 9.6 απαλοιφή(_,[],[]):-!. απαλοιφή(s,[h T1],[H T2]):- S=\=H, απαλοιφή(s,t1,t2). απαλοιφή(s,[s T1],[H T2]):- απαλοιφή(s,t1,[h T2]). Άσκηση 9.7 διαγραφή(_,[],[]). διαγραφή(s,[h T1],[H T2]):- S=\=H, διαγραφή(s,t1,t2). διαγραφή(s,[s T1],T1). Άσκηση 9.8 αντικατάσταση(_,_,[],[]). αντικατάσταση(x,y,[x T1],[Y T2]):- αντικατάσταση(x,y,t1,t2). αντικατάσταση(x,y,[h T1],[H T2]):- X=\=H, αντικατάσταση(x,y,t1,t2). - 14 -
Κεφάλαιο 10 Άσκηση 10.1 έλεγχος_όρου(x):- X=..[H L], έλεγχος_ορισµάτων(l). έλεγχος_ορισµάτων([]). έλεγχος_ορισµάτων([h T]):- όχι_µεταβλητή(h), έλεγχος_ορισµάτων(t). Άσκηση 10.2 επίπεδη_λίστα([],[]). επίπεδη_λίστα([h T1],[H T2]):- not(είναι_λίστα(h)), επίπεδη_λίστα(t1,t2). επίπεδη_λίστα([[] T],L2):- επίπεδη_λίστα(t,l2). επίπεδη_λίστα([[h1 T1] T],L2):- επίπεδη_λίστα([h1,t1 T],L2). είναι_λίστα([_ _]). είναι_λίστα([]). Άσκηση 10.3 υποόρος(x,x):-!. υποόρος(term1,term2):- TERM2=..L2, ψάξε_όρο(term1,l2). ψάξε_όρο(term1,[term1 _]):-!. ψάξε_όρο(term1,[h2 T2]):- συναρτησιακό_σύµβολο(h2,_,a), A>0, H2=..L, ψάξε_όρο(term1,l). ψάξε_όρο(term1,[h2 T2]):- ψάξε_όρο(term1,t2). Άσκηση 10.4 αντικατέστησε(y1,y2,o1,o2):- O1=..L1, αντικατάσταση(y1,y2,l1,l2), - 15 -
O2=..L2. αντικατάσταση(_,_,[],[]). αντικατάσταση(x,y,[x T1],[Y T2]):- αντικατάσταση(x,y,t1,t2). αντικατάσταση(x,y,[h1 T1],[H1 T2]):- σταθερά(h1), αντικατάσταση(x,y,t1,t2). αντικατάσταση(x,y,[h1 T1],[O2 L2]):- αντικατέστησε(x,y,h1,o2), αντικατάσταση(x,y,t1,l2). Άσκηση 10.5 απλοποίησε(l1,l2):- αφαίρεσε_ακεραίους(l1,[prefix,sum L3],L4), αφαίρεσε_όρους(l4,l3), L2=[PREFIX,SUM L3]. αφαίρεσε_όρους([],[]). αφαίρεσε_όρους([prefix,term TAIL],L3):- απλοποίησε_όρο([prefix,term TAIL],TERM,0,SUM0,TAIL0), SUM0=\=0, βρες_πρόσηµο(proshmo,syntel,sum0), L3=[PROSHMO,SYNTEL,*,TERM L30], αφαίρεσε_όρους(tail0,l30). αφαίρεσε_όρους([prefix,term TAIL],L3):- απλοποίησε_όρο([prefix,term TAIL],TERM,0,SUM0,TAIL0), αφαίρεσε_όρους(tail0,l3). αφαίρεσε_όρους([prefix,term TAIL],L3):- αφαίρεσε_όρους(tail,l3). απλοποίησε_όρο([],term,sum,sum,[]). απλοποίησε_όρο([+,term TAIL],TERM,SUM,SUM0,TAIL0):- SUM1 is SUM+1, απλοποίησε_όρο(tail,term,sum1,sum0,tail0). απλοποίησε_όρο([-,term TAIL],TERM,SUM,SUM0,TAIL0):- SUM1 is SUM-1, απλοποίησε_όρο(tail,term,sum1,sum0,tail0). απλοποίησε_όρο([prefix,term0 TAIL],TERM,SUM,SUM0,[PREFIX,TERM0 TAIL0]):- not(term0=term), - 16 -
απλοποίησε_όρο(tail,term,sum,sum0,tail0). αφαίρεσε_ακεραίους(l1,[prefix,sum _],L4):- πρόσθεσε_ακεραίους(l1,0,sum2,l4), SUM2=\=0, βρες_πρόσηµο(prefix,sum,sum2). αφαίρεσε_ακεραίους(l1,_,l1):- πρόσθεσε_ακεραίους(l1,0,sum2,_), SUM2=0. βρες_πρόσηµο(prefix,sum,sum2):- SUM2>0, SUM=SUM2, PREFIX='+'. βρες_πρόσηµο(prefix,sum,sum2):- SUM2<0, SUM is -SUM2, PREFIX='-'. πρόσθεσε_ακεραίους([+,h T],S,SUM,L4):- integer(h), S0 is S+H, πρόσθεσε_ακεραίους(t,s0,sum,l4). πρόσθεσε_ακεραίους([prefix,h T],S,SUM,[PREFIX,H L4]):- not(integer(h)), πρόσθεσε_ακεραίους(t,s,sum,l4). πρόσθεσε_ακεραίους([-,h T],S,SUM,L4):- integer(h), S0 is S-H, πρόσθεσε_ακεραίους(t,s0,sum,l4). πρόσθεσε_ακεραίους([],sum,sum,[]). Άσκηση 10.6 όρος(n,o,on):- O=..[H TAIL], πάρε_όνοµα(tail,n,on). πάρε_όνοµα([on _],1,ON). πάρε_όνοµα([_ TAIL],N,ON):- N>0, N1 is N-1, πάρε_όνοµα(tail,n1,on). συναρτησιακό_σύµβολο(o,ss,t):- O=..[SS TAIL], µέτρα(tail,0,t). µέτρα([],n,n). - 17 -
µέτρα([h T],N,N0):- N1 is N+1, µέτρα(t,n1,n0). Άσκηση 10.7 έχει_ιδιότητα([],_). έχει_ιδιότητα([h T],K):- O=..[K,H], O, έχει_ιδιότητα(t,k). - 18 -
Κεφάλαιο 11 Άσκηση 11.1 αντέγραψε(όρος1,όρος2):- ενσωµάτωσε_α(βοηθητικός_όρος(όρος1)), διέγραψε(βοηθητικός_όρος(όρος2)). Άσκηση 11.2 σύνολο_από(x,k,l):- βρες_λύσεις(x,k), φτιάξε_λίστα(x,l). βρες_λύσεις(x,k):- K, ενσωµάτωσε_α(λύση(x)), αποτυχία. βρες_λύσεις(_,_). φτιάξε_λίστα(x,[x T]):- διέγραψε(λύση(x)), διέγραψε_διπλές(x), φτιάξε_λίστα(x1,t). φτιάξε_λίστα(_,[]). διέγραψε_διπλές(x):- διέγραψε(λύση(x)), διέγραψε_διπλές(x). διέγραψε_διπλές(_). - 19 -
Κεφάλαιο 12 Άσκηση 12.1 Αν θέσουµε την ερώτηση: τελευταίο(1,[1,2,3,χ]). τότε η Prolog θα µας απαντήσει καταφατικά, δίνοντας στην µεταβλητή Χ την τιµή 1. Αν θέσουµε την ερώτηση: τελαυταίο(1,χ). τότε η Prolog θα µας απαντήσει επίσης καταφατικά, δίνοντας µας µια απειρία από λύσεις, όλες τις λίστες που έχουν τελευταίο στοιχείο το 1, αρχίζοντας από την λίστα µε ένα µόνο στοιχείο: Χ=[1] Χ=[Χ1,1] Χ=[Χ2,Χ1,1] Χ=[Χ3,Χ2,Χ1,1]... Αν αλλάξουµε την σειρά των δυο εντολών του προγράµµατος, τότε η τελευταία ερώτηση θα κάνει την Prolog να πέσει σε ατέρµονη ανακύκλωση, χωρίς να µας δώσει καµία λύση. - 20 -
Κεφάλαιο 13 Άσκηση 13.1 διαφορά_συνόλων([],b,[]). διαφορά_συνόλων([x TA],B,[X T]):- όχι(µέλος(x,b)), διαφορά_συνόλων(ta,b,t). διαφορά_συνόλων([x TA],B,T):- µέλος(x,b), διαφορά_συνόλων(ta,b,t). µέλος(x,[x L]):-!. µέλος(x,[_ L]):- µέλος(x,l). Άσκηση 13.2-21 -