© Ευάγγελος Κουράκος Μαυρομιχάλης, 2006
Προηγούμενο | Περιεχόμενα | Επόμενο
 

Διαφορές μεταξύ Prolog και άλλων γλωσσών προγραμματισμού.

Υπάρχουν πολλές διαφορές μεταξύ της Prolog και άλλων γλωσσών προγραμματισμού. Στην ενότητα αυτή παραθέτουμε τις δύο κύριες διαφορές που αφορούν το λογικό προγραμματισμό σε σχέση με τον διαδικασιακό προγραμματισμό.

Δηλωτική και διαδικαστική σημασία του λογικού προγραμματισμού.

Μία από τις βασικές διαφορές της Prolog από άλλες γλώσσες προγραμματισμού όπως η C, Java, Basic, Fortran κτλ. είναι ότι όταν γράφουμε ένα πρόγραμμα σε Prolog, δηλώνουμε όχι τη σειρά των πεπερασμένων βημάτων που πρέπει να ακολουθήσουμε για να εκτελέστει επιτυχώς το πρόγραμμα, αλλά τους στόχους που θέλουμε να πετύχουμε καθώς και τη γνώση που έχουμε σχετικά με την επίτευξη των στόχων αυτών. Όπως θα δούμε στις επόμενες ενότητες, η Prolog έχει την δυνατότητα μέσω του μηχανισμού ελέγχου που διαθέτει, να βρίσκει τον τρόπο επίτευξης των στόχων αυτών κάνοντας χρήση της γνώσης που έχουμε εισάγει.

Πιο συγκεκριμένα, στις διαδικασιακές γλώσσες προγραμματισμού (όπως η C, Java, Basic, Fortran κτλ.) μας ενδιαφέρει το ΠΩΣ θα πετύχουμε μία διαδικασία ή μία συνάρτηση (δηλαδή τα λογικά βήματα που πρέπει να ακολουθήσουμε). Για το λόγο αυτό προγραμματίζουμε προσπαθώντας ν' απαντήσουμε σε ερωτήσεις του τύπου "ΠΩΣ θα επιτύχω το Α" ή "ΠΩΣ θα τρέξει το Β".

Αντιθέτως, στις δηλωτικές γλώσσες προγραμματισμού όπως η Prolog μας ενδιαφέρει το ΤΙ θέλουμε να πετύχουμε, δηλαδή ποιους στόχους (Goal Directed programming). Αφού έχουμε δηλώσει το τι ισχύει (δηλαδή ποια γεγονότα και κανόνες είναι αληθή) στο πλαίσιο (context) του προβλήματός μας, καθώς και ένα σύνολο κανόνων (της μορφής Horn), η Prolog έχει την ικανότητα ν' αποκρίνεται στις ερωτήσεις που θέτουμε, απαντώντας είτε καταφατικά αν η ερώτηση-στόχος είναι εφικτός είτε αρνητικά αν η ερώτηση είναι ψευδής (δηλαδή ο στόχος δεν μπορεί να επιτευχθεί).

Επιπλέον, η δηλωτική γλώσσα προγραμματισμού Prolog μπορεί να χρησιμοποιηθεί και ως διαδικασική. Στη Prolog ένα πρόγραμμα μπορεί να διαβαστεί με δύο τρόπους: είτε δηλωτικά είτε διαδικασιακά.

Έτσι ένα πρόγραμμα Prolog όπως το παρακάτω:

in(X, usa):- in(X, florida).

μπορεί να διαβαστεί είτε δηλωτικά ως "για ν' αποδείξεις ότι ο Χ είναι στις ΗΠΑ, απέδειξε πρώτα ότι ο Χ είναι στη Φλόριντα" είτε να διαβαστεί διαδικασιακά ως "ο Χ είναι στις ΗΠΑ αν ο Χ είναι στη Φλόριντα" .

Ο πρώτος τρόπος απαντάει στο ερώτημα "ΤΙ θέλουμε να πετύχουμε", ενώ ο δεύτερος απαντάει στο ερώτημα "ΠΩΣ θα πετύχουμε κάτι".

Το παρακάτω παράδειγμα, το οποίο τυπώνει τον μεγαλύτερο από δύο αριθμούς, βασίζεται στην ίδια ακριβώς λογική. Προσέξτε ότι στο πρόγραμμα σε C η εκτέλεση αρχίζει από πάνω προς τα κάτω ζητώντας πρώτα από τον χρήστη να εισάγει δύο αριθμούς, ενώ ο έλεγχος του προγράμματος καθορίζεται από την IF ... ELSE συνθήκη.

Αντιθέτως, στην υλοποίηση του ίδιου προγράμματος σε Prolog δεν υπάρχει κάποια (τέτοιου τύπου) συνθήκη που να ελέγχει το πρόγραμμα. Η εκτέλεση του προγράμματος εξαρτάτε από το τρέχοντα στόχο, ο οποίος είναι ο greater(X,Y, Z) και από τη γνώση που έχουμε για το πότε ένας αριθμός είναι μεγαλύτερος από έναν άλλον.

Πιο συγκεκριμένα, στο πρόγραμμα της Prolog το μόνο που μας ενδιαφέρει είναι το πότε ισχύει το γεγονός greater(X,Y, Z). Το γεγονός αυτό μας δηλώνει ότι ο Ζ είναι ο μεγαλύτερος των αριθμών Χ και Y. Αυτό το γεγονός (δηλαδή ο στόχος του προβληματός μας) ισχύει όταν:
είτε οι αριθμοί Χ και Υ είναι ίσοι μεταξύ τους (γεγονός p1) οπότε το Ζ θα είναι το ίδιο (δηλαδή ίσο) με το Χ,
είτε όταν το Χ είναι μικρότερο του Y (κανόνας p2) οπότε το Z είναι το ίδιο με το Y,
είτε όταν το Χ είναι μεγαλύτερο του Υ (κανόνας p3) οπότε το Ζ θα είναι το ίδιο με το Χ.

Πρόγραμμα C

#include <stdio.h>
int N1, N2, Max;

int main() {
printf("Enter the first number: ");
scanf("%d", &N1);
printf("Enter the second number: ");
scanf("%d", &N2);
if (N1>N2)
   Max=N1;
else
   Max=N2;
printf("\nThe Max number is: %d", Max);
return 0;
}

Πρόγραμμα Prolog

greater(X,X,X).
greater(X,Y,Y):- X<Y.
greater(X,Y,X):- X>Y.

?- greater(4,6,Ζ).
Z=6.

Χρήση της γνώσης ως πρόγραμμα

Όπως είδαμε στη προηγούμενη ενότητα, η Prolog αποτελείτε από μία βάση δεδομένων και έναν μηχανισμό ελέγχου (ο διερμηνέας) ο οποίος χειρίζεται τη γνώση αυτή προκειμένου να επιτευχθεί ένας στόχος.

Όταν γράφουμε ένα πρόγραμμα σε Prolog δεν κάνουμε τίποτα άλλο από το να εισάγουμε γεγονότα και κανόνες στη βάση δεδομένων, δηλαδή να εισάγουμε γνώση σχετική με το χώρο του προβλήματός μας. Δεδομένου της γνώσης αυτής, μπορούμε να ρωτήσουμε τη Prolog αν μία πρόταση είναι αληθής ή ψευδής. Πιο συγκεκριμένα, ο μηχανισμός ελέγχου της Prolog χρησιμοποιεί τη γνώση αυτή για να αποφανθεί αν η ερώτηση που κάνουμε είναι αληθής ή ψευδής.

Σε αντίθεση με άλλες γλώσσες προγραμματισμού όπου το πρόγραμμα γράφεται μία φορά και μετά μέσω ενός μεταφραστή (compiler) μετατρέπεται σε γλώσσα μηχανής όπου δεν μπορεί πλέον να αλλαχθεί, στη Prolog το πρόγραμμα (δηλαδή η γνώση που εισάγουμε στη βάση δεδομένων) μπορεί να ενημερωθεί ανά πάσα χρονική στιγμή είτε από το χρήστη είτε από το ίδιο το πρόγραμμα. Αυτό είναι πολύ χρήσιμο όταν δεν είναι εξ'αρχής πλήρως γνωστό το πρόβλημα που προσπαθούμε να επιλύσουμε.

Στα επόμενα κεφάλαια θα ασχοληθούμε με τα δύο κυριότερα μέρη της γλώσσας Prolog, δηλαδή με:

  • την αναπαράσταση γνώσης σε Prolog (δηλαδή, με τα δεδομένα, τις δομές και τη σημασιολογία αυτών σε ένα πρόγραμμα Prolog) και

  • τη λειτουργία του μηχανισμού ελέγχου της Prolog (δηλαδή, το πως η Prolog χρησιμοποιεί τα δεδομένα ενός προγράμματος για ν' αποφανθεί αν ισχύει ένα γεγονός ή όχι).


Τελευταία ενημέρωση σελίδας: 11/10/2010