Στην επιστήμη υπολογιστών, η **αναγωγή γράφου** (**graph reduction**) υλοποιεί μια αποδοτική έκδοση της μη-αυστηρής αποτίμησης, μιας στρατηγικής αποτίμησης στην οποία οι παράμετροι σε μια συνάρτηση δεν αποτιμώνται άμεσα. Η μορφή αυτή της μη-αυστηρής αποτίμησης είναι γνωστή και σαν οκνηρή αποτίμηση και χρησιμοποιείται στις γλώσσες συναρτησιακού προγραμματισμού. Η τεχνική χρησιμοποιήθηκε για πρώτη φορά από τον Chris Wadsworth το 1971.

Σκοπός
------

Ακολουθεί ένα απλό παράδειγμα αποτίμησης μια αριθμητικής έκφρασης:

{\displaystyle {\begin{aligned}&{}\qquad ((2+2)+(2+2))+(3+3)\\&{}=((2+2)+(2+2))+(6)\\&{}=((2+2)+4)+6\\&{}=(4+4)+6\\&{}=8+6\\&{}=14\end{aligned}}}
Η παραπάνω ακολουθία αναγωγών ακολουθεί μια στρατηγική γνωστή ως "αναγωγή του πιο εξωτερικού δένδρου" (outermost tree reduction). Η ίδια έκφραση μπορεί να αποτιμηθεί χρησιμοποιώντας "αναγωγή του πιο εσωτερικού δένδρου" (innermost tree reduction), με αποτέλεσμα της εξής ακολουθία αναγωγών:

{\displaystyle {\begin{aligned}&{}\qquad ((2+2)+(2+2))+(3+3)\\&{}=((2+2)+4)+(3+3)\\&{}=(4+4)+(3+3)\\&{}=(4+4)+6\\&{}=8+6\\&{}=14\end{aligned}}}
Όπως φαίνεται παραπάνω η σειρά αποτίμησης δίνεται ρητά από την προσθήκη παρενθέσεων. Η έκφραση αυτή θα μπορούσε επίσης να αποτιμηθεί απλά από τα δεξιά προς τα αριστερά, επειδή η πρόσθεση είναι προσεταιριστική πράξη.

Η παραπάνω έκφραση, αναπαρίσταται σαν δένδρο ως εξής:

Από αυτήν την απεικόνιση προκύπτει και ο όρος αναγωγή δένδρου (tree reduction). Όταν αναπαρίσταται σαν δένδρο, μπορούμε να θεωρούμε την πιο εσωτερική αναγωγή ξεκινώντας από τα κάτω προς τα πάνω, ενώ η εξωτερική δουλεύει από τα πάνω προς τα κάτω.

Η έκφραση μπορεί επίσης να αναπαρασταθεί σαν γράφος, επιτρέποντας κοινές υποεκφράσεις:

Όπως και στα δένδρα, οι εξωτερική και η εσωτερική αναγωγή εφαρμόζονται και στους γράφους, με αποτέλεσμα να έχουμε **αναγωγή γράφου**.

Σε αυτό το σημείο η αποτίμηση με την αναγωγή του πιο εξωτερικού γράφου συνεχίζει ως εξής:

Τώρα η αναγωγή χρειάζεται μόνο 4 βήματα. Η αναγωγή του πιο εξωτερικού γράφου ονομάζεται οκνηρή αποτίμηση (lazy evaluation) και η αναγωγή του πιο εσωτερικού γράφου ονομάζεται πρόθυμη αποτίμηση (eager evaluation).

Αναγωγή γράφου συνδυαστών (Combinator graph reduction)
------------------------------------------------------

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

Ιστορία
-------

Η ιδέα της αναγωγής γράφου που επιτρέπει σε τιμές που έχουν αποτιμηθεί να είναι κοινές ανάγεται στη διδακτορική διατριβή του Chris Wadsworth το 1971. Η διατριβή αυτή αναφέρθηκε από τους Peter Henderson και James H. Morris Jr. το 1976 στο "A lazy evaluator"  που εισήγαγε την ιδέα της οκνηρης αποτίμησης. Το 1976 ο David Turner ενσωμάτωσε την οκνηρή αποτίμηση στη γλώσσα SASL χρησιμοποιώντας συνδυαστές.
Η SASL ήταν μια πρώιμη γλώσσα συναρτησιακού προγραμματισμού που δημιουργήθηκε από τον Turner το 1972.

Πηγές
-----

* Simon Peyton Jones, *The Implementation of Functional Programming Languages*, Prentice Hall, 1987. Full text online.

Αναφορές
--------

1. ↑  Hudak, Paul, "Conception, evolution, and application of functional programming languages", ACM Computing Surveys, volume 21, issue 3, pages 359–411, September 1989,  Αρχειοθετήθηκε 2009-03-20 στο Wayback Machine. doi=10.1145/72551.72554
2. ↑  Hudak, Paul, "Hughes, John; Peyton Jones, Simon; Wadler, Philip, A History of Haskell",  Αρχειοθετήθηκε 2010-04-25 στο Wayback Machine. History of Programming Languages Conference 2007

Βιβλιογραφία
------------

* Bird, Richard (1998). *Introduction to Functional Programming using Haskell*. Prentice Hall. ISBN 0-13-484346-0.

Δείτε επίσης
------------

* Συναρτησιακός πρόγραμματισμός
* Haskell
* Miranda