Λογικά λάθη και λάθη κατά την εκτέλεση

Ξεκίνησε από Wizard, 10 Μαρ 2006, 05:38:45 ΜΜ

« προηγούμενο - επόμενο »

alkisg

Χμ... συνήθως με τις ερμηνείες τέτοιων ορισμών δεν τα πάω καλά, ειδικά αν δεν μου αρέσουν! Ο Knuth είχε πει "Definiteness: Each step of the algorithm must be precisely defined..."
Για μένα, το 1/0 στη ΓΛΩΣΣΑ είναι μια χαρά ορισμένο, προκαλεί λάθος χρόνου εκτέλεσης :). Εντάξει, ο αλγόριθμος που κάνει κάτι τέτοιο έχει bug, όχι όμως ότι δεν είναι αλγόριθμος. Σε άλλες γλώσσες αν θέλει κάποιος "πιάνει" αυτό το λάθος με exception handling (όπως αναφέρεται και στο βιβλίο) και συνεχίζει κανονικά την εκτέλεση του προγράμματος. Στη Javascript είναι καλύτερα ορισμένο, επιστρέφει την τιμή infinite (άπειρο).

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

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

Για μένα, άλλο το "θα πρέπει να ικανοποιεί το κριτήριο της καθοριστικότητας" και άλλο το "αν δεν το ικανοποιεί τότε δεν είναι αλγόριθμος". Αν δεν το ικανοποιεί, απλά έχει bugs.

gpapargi

Αυτές οι κουβέντες έχουν ένα πλεονέκτημα σε σχέση με τις κουβέντες σχετικά με το τι ισχύει στη ΓΛΩΣΣΑ. Εδώ μπορούμε να καταφύγουμε στη βιβλιογραφία για να λύσουμε απορίες καθώς τα πράγματα είναι γραμμένα και αλλού. Αντίθετα στη ΓΛΩΣΣΑ τα πράγματα θα μπορούσαν να είναι με τον ένα ή τον άλλο τρόπο και συνήθως το ερώτημα ανάγεται στο τι εννοούν οι συγγραφείς.

Έριξα μια ματιά στον Knuth καθώς και στο δίκτυο και είδα τα εξής:

Κάθε βήμα του αλγορίθμου πρέπει να είναι καθορισμένο με ακρίβεια. Οι πράξεις που πρέπει να εκτελεστούν θα πρέπει να είναι αυστηρά καθορισμένες και απόλυτα σαφείς σε κάθε περίπτωση.

Αν φτάσει σε κάποιο σημείο αυτός που εκτελεί τον αλγόριθμο και πει «τώρα τι κάνουμε;» αυτό σημαίνει ότι παραβιάζεται το κριτήριο της καθοριστικότητας. Πχ το «βάλε λίγο αλάτι» σε μια μαγειρική συνταγή παραβιάζει το κριτήριο της καθοριστικότητας γιατί το «λίγο» είναι σαφές. Η διαίρεση με το 0 επίσης παραβιάζει το κριτήριο της καθοριστικότητας γιατί λέμε σε αυτόν που εκτελεί τον αλγόριθμο να κάνει κάτι που δε γίνεται και φυσικά δεν ξέρει πώς να το κάνει. Η διαίρεση με 0 αναφέρεται σχεδόν παντού σαν παράδειγμα παραβίασης της καθοριστικότητας και νομίζω πως πρέπει να το δεχτούμε.

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

Το να εισάγεις κάποιο χαρακτήρα και να τον βάλεις σα διαιρέτη σε διαίρεση (όπως στο παράδειγμα του Βαγγέλη) είναι περίεργη περίπτωση. Το θέμα είναι αν καταλαβαίνει τι πρέπει να κάνει αυτός που εκτελεί. Εμείς οι άνθρωποι μέσω τις ψευδογλώσσας δεν καταλαβαίνουμε τι πρέπει να κάνουμε. Επίσης η Pascal δεν καταλαβαίνει τι πρέπει να κάνει. Η C όμως καταλαβαίνει. Βέβαια αυτό που καταλαβαίνει δεν έχει καμία σχέση με αυτό που θα θέλαμε εμείς να καταλάβει. Τι να κάνουμε; Άλλος εκτελεί τον αλγόριθμο κάθε φορά. Στη C έχουμε λογικό λάθος.
Τα runtime errors για μένα είναι επίσης λογικά λάθη γιατί τελικά δε γίνεται αυτό που θέλουμε να γίνει.

Το ερώτημα για μένα είναι αν όταν παραβιάζεται κάποιο αλγοριθμικό κριτήριο υφίσταται αλγόριθμος ή όχι. Η λέξη «κριτήριο» είναι βαριά. Σημαίνει ότι καθορίζει (κρίνει) αν ισχύει κάτι ή όχι. Πχ στα κριτήρια ισότητας τριγώνων, αν πληρούνται τα τρίγωνα είναι ίσα, ενώ αν δεν πληρούνται τότε δεν είναι ίσα. Το βιβλίο δείχνει να στρέφεται σε αυτή την κατεύθυνση.

Το έχουμε ξαναθίξει το θέμα. Τόσα προγράμματα στην πράξη δεν τερματίζουν ποτέ αλλά τρέχουν σα deamons στο background (ftp servers, mail servers). Μου φαίνεται χοντρό το να μην αποκαλούμαι αυτά αλγορίθμους επειδή παραβιάζουν την περατότητα. Εγώ θα χρησιμοποιούσα μια λιγότερο βαριά λέξη. Θα τα έλεγα «χαρακτηριστικά αλγορίθμων» ας πούμε. Ακόμα και στις πανελλήνιες το 2005 (θέμα 1Α2) ρωτάει πιο κριτήριο δεν ικανοποιεί ο παρακάτω αλγόριθμος. Και δίνει ένα ατέρμονα  βρόχο. Σύμφωνα με το σκεπτικό αυτό θα έπρεπε να μην το αποκαλεί αλγόριθμο. Δεν ξέρω… μου φαίνεται χοντρό το να μην αποκαλείς αλγόριθμο κάτι που παραβιάζει κάποιο κριτήριο.

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

ΥΓ
Τώρα είδα ότι έστειλες και εσύ ʼλκη. Δε σε έχω διαβάσει ακόμα. Στέλνω και εγώ και τα ξαναλέμε.

evry

   Κατ'αρχήν όσον αφορά το μάθημα πιστεύουμε ότι λέει το βιβλίο και είμαστε όλοι ευτυχισμένοι (εκτός από τους μαθητές :-) ).
   Εγώ εκφράζω την καθοριστικότητα ενός αλγορίθμου με τα εξής λόγια στους μαθητές "Αν γνωρίζουμε για όλες τις δυνατές εισόδους του αλγορίθμου ποια θα είναι η έξοδος τότε ο αλγόριθμος πληρεί το κριτήριο της καθοριστικότητας"

   Γενικότερα τώρα τα κριτήρια του αλγορίθμου έχουν θεωρητική σημασία. Η επιστήμη της πληροφορικής δεν βασίζεται στο ρήτο "ότι δέχεται ο compiler είναι σωστό" ή "κάνουμε το σταυρό μας να τρέξει". Υπάρχουν σοβαρές θεωρητικές βάσεις τις οποίες οι περισσότεροι αγνοούν και νομίζουν ότι η πληροφορική είναι η επιστήμη του ποντικιού, του joystick και στην καλύτερη περίπτωση του Internet.
     Η θεωρία της πληροφορικής η οποία πήρε ουσιαστικά υπόσταση  από τον Turing όταν ο ίδιος απέδειξε ότι δεν μπορεί να κατασκευαστεί αλγόριθμος ο οποίος να αποφασίζει αν ένας άλλος αλγόριθμος τερματίζει ή όχι, διδάσκεται στα πανεπιστήμια ως θεωρία υπολογισμού.
     Τα κριτήρια ενός αλγορίθμου έχουν σημασία όταν μελετάμε τον αλγόριθμο από τη θεωρητική σκοπιά του, δηλαδή όταν θέλουμε να αποδείξουμε ότι έχει κάποιες συγκεκριμένες ιδιότητες.
     Για έναν προγραμματιστή αυτό δε σημαίνει τίποτα. Το μόνο που τον ενδιαφέρει είναι να δουλέψει το πρόγραμμά του. Υπάρχουν πολλοί καλοί προγραμματιστές οι οποίοι ούτε ξέρουν ούτε θέλουν να μάθουν τα αλγοριθμικά κριτήρια γιατί αυτό που έχουν φτιάξει δεν τους νοιάζει αν είναι αλγόριθμος. Είναι μια υπολογιστική διαδικασία κωδικοποιημένη σε κάποια γλώσσα προγραμματισμού όπως η παρακάτω :

      for (int i=1 ; ; i++)
  {
      cin >> a;
      if (!a)     
         break;
  }

Πάντως το παραπάνω είναι αλγόριθμος έτσι;

και μια και μιλάμε για το πρακτικό κομμάτι του προγραμματισμού τι θα λέγατε για την παρακάτω άσκηση; Έχει θέση στο μάθημα της ΑΕΠΠ;

Να γράψετε ένα πρόγραμμα το οποίο να τυπώνει τον εαυτό του
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

alkisg

@gpapargi: απ' ότι βλέπω συμφωνούμε σε όλα εκτός από το κομμάτι της διαίρεσης! Το παρακάτω κομμάτι σε javascript (=διαίρεση με το μηδέν) δεν παραβιάζει το κριτήριο της καθοριστικότητας, αλλά της περατότητας:
var N = 1/0; //Αυτό εκτελείται κανονικά και το Ν γίνεται άπειρο
for (var i = 0; i < N; i++) !Άπειρο loop
  document.write(i, N);


@evry: πώς είναι δυνατόν να λυθεί αυτή η άσκηση χωρίς αρχεία;

evry


@alkisg
Κατ'αρχήν όσον αφορά την javascript δεν πρόκειται για γλώσσα προγραμματισμού αλλα για script γλώσσα η οποία κατά τη γνώμη μου παραβιάζει όλα τα κριτήρια που πρέπει να πληρεί μια γλώσσα προγραμματισμού. Η γλώσσα αυτή είναι ένα καλό παράδειγμα για να δει κάποιος πόσο απέχει η θεωρία από την πράξη. Μια γλώσσα στην οποία όλα είναι φλου, είναι από τις πιο δημοφιλείς γλώσσες που χρησιμοποιούνται για τη δημιουργία δυναμικών ιστοσελίδων.

Τώρα όσον αφορά την άσκηση:
   Δεν χρειάζεται να χρησιμοποιήσεις αρχεία. Το πρόβλημα μπορεί να λυθεί αν ορίσεις ένα πίνακα από ΧΑΡΑΚΤΗΡΕΣ μέσα στον όποιο θα έχεις αρκετές από τις γραμμές κώδικα του προγράμματός σου. Στη συνέχεια θα χρησιμοποιήσεις επαναληπτική δομή για να εμφανίσεις τα περιεχόμενα του  πίνακα 2 ή 3 φορές. Με λίγο πειραματισμό βγαίνει.
  Δηλαδή η άσκηση μπορεί να γίνει κανονικά στη ΓΛΩΣΣΑ. Απλά ορίζεις ένα κατάλληλο πίνακα με χαρακτήρες.

Τώρα αν ψάξεις στο google για "self reproducing programs" θα βρεις διάφορα ενδιαφέροντα sites όπως είναι το
http://www.nyx.net/~gthompso/quine.htm
που έχει τέτοια προγράμματα σε όλες σχεδόν τις γλώσσες.

Επίσης μια καλή εργασία περί του θέματος υπάρχει στο
http://www.cgl.uwaterloo.ca/~csk/washington/paper/toc.html

Το συγκεκριμένο θέμα το συνάντησα πρώτη φορά όταν μου το έβαλε άσκηση κάποιος. Μετά από καιρό διάβασα την ομιλία του Ken Thomson για το βραβείο Turing (τα αντίστοιχα Nobel πληροφορικής) που πήρε. Μπορείς να βρεις την ομιλία του στο
http://cm.bell-labs.com/who/ken/trust.html η οποία μάλιστα αναφέρεται στο πως μπορείς να υποκλέψεις τα πάντα εμφυτεύοντας ένα δούρειο ίππο μέσα σε έναν μεταγλωττιστή.

Η υλοποίηση ενός τέτοιου προγράμματος δεν είναι κάτι δύσκολο, αλλά δεν είναι και κάτι απλό. Θα μπλεχτείς σίγουρα στην αρχή αλλά είναι πολύ καλή άσκηση για έναν πρωτοετή φοιτητή πληροφορικής.
Φυσικά ότι πρόγραμμα και να φτιάξεις βλέπεις στο διαδίκτυο κάτι λύσεις όπως η

char*f="char*f=%c%s%c;%cmain(){printf(f,34,f,34,10,10);}%c";
    main(){printf(f,34,f,34,10,10);}


και καταλαβαίνεις ότι   C RULES !!!

Πρόσεξε ότι στο άρθρο του ο Ken Thomson λέει πως η άσκηση δεν ήταν να φτιάξεις ένα τέτοιο πρόγραμμα, αυτό εννοείται. Το δύσκολο κατά αυτόν είναι να φτιάξεις το μικρότερο δυνατό πρόγραμμα!!!!

Και μετά καθόμαστε και ασχολούμαστε με τις ασάφειες του βιβλίου της ΑΕΠΠ
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

alkisg

//start offtopic
@evry: για την javascript δεν έχεις δίκιο... οι γλώσσες προγραμματισμού αναπτύσσονται ανάλογα με τις εκάστοτε ανάγκες και δεν είναι αναγκαίο να είναι όλες strongly typed... σε παραπέμπω στο reintroduction to javascript από έναν guru της γλώσσας, μεταφρασμένο στα ελληνικά από κάποιον φίλο μου (και πορωμένο javascript-άκια)! Ειδικά τα object prototypes είναι πολύ έξυπνη ιδέα, μακάρι να την είχαν και άλλες γλώσσες...

Για το self reproducing πρόγραμμα: δεν είχα καταλάβει την εκφώνηση! Οκ, θα βρω μια σύντομη εκδοχή σε ΓΛΩΣΣΑ και θα επανέλθω!
//end offtopic

evry

Κοίτα, δεν αφόρισα την javascript απλά πιστεύω ότι είναι υπερβολικά loosely typed με αποτέλεσμα να συμβαίνουν πιο εύκολα runtime errors. Σίγουρα για αυτό που φτιάχθηκε κάνει πολύ καλά τη δουλειά της και μερικές φορές νοιώθεις πραγματικά ότι σου λύνει τα χέρια όμως δεν τη θεωρώ καλό παράδειγμα όταν μιλάμε για προγραμματισμό.

   Όσον αφορά αυτό που είπες σχετικά με τα object prototypes, ναι είναι καλή ιδέα όσον αφορά τον προγραμματισμό και όχι όσον αφορά γενικότερα την τεχνολογία λογισμικού. Το συγκεκριμένο είδος προγραμματισμού (object-based ή prototype-based) είναι η αδυναμία μου. Μπορείς να κάνεις φοβερά πράγματα όπως η δυναμική κληρονομικότητα και άλλα. Έχει απίστευτη ευελιξία όμως είναι είδος προγραμματισμού το οποίο θέλει πολύ ικανούς προγραμματιστές σε αντίθεση με γλώσσες όπως η Java που σε παίρνει από το χεράκι. Είχα κάνει παλιά μια εργασία πάνω σε αυτές τις γλώσσες και συγκεκριμένα πάνω στη Self που είναι καθαρή object based γλώσσα (http://research.sun.com/self/), δεν ορίζεις κλάσεις αλλά μόνο αντικείμeνα. Δυστυχώς όμως η γλώσσα αυτή εγκαταλείφθηκε μια και το κεφάλι της ομάδας ο Chambers πήγε να δουλέψει σε άλλη ομάδα της SUN (μάλλον στη Java). Επίσης αν θυμάμαι καλά ο interpreter πoυ είχαν φτιάξει ήταν μόνο για unix.

Αυτά , πάω να διαβάσω το tutorial για javascript, καλό φαίνεται :-)

Παράθεση από: alkisg στις 14 Μαρ 2006, 09:57:53 ΜΜ
//start offtopic
@evry: για την javascript δεν έχεις δίκιο... οι γλώσσες προγραμματισμού αναπτύσσονται ανάλογα με τις εκάστοτε ανάγκες και δεν είναι αναγκαίο να είναι όλες strongly typed... σε παραπέμπω στο reintroduction to javascript από έναν guru της γλώσσας, μεταφρασμένο στα ελληνικά από κάποιον φίλο μου (και πορωμένο javascript-άκια)! Ειδικά τα object prototypes είναι πολύ έξυπνη ιδέα, μακάρι να την είχαν και άλλες γλώσσες...

Για το self reproducing πρόγραμμα: δεν είχα καταλάβει την εκφώνηση! Οκ, θα βρω μια σύντομη εκδοχή σε ΓΛΩΣΣΑ και θα επανέλθω!
//end offtopic
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

alkisg

#22
//start offtopic
Δυστυχώς η ΓΛΩΣΣΑ δεν επιτρέπει και πολλά κολπάκια... Ούτε καν newline δεν μπορεί να γραφεί χωρίς ξεχωριστή ΓΡΑΨΕ! :( 35 γραμμές λοιπόν:
[glossa]ΠΡΟΓΡΑΜΜΑ ΓράφωΤονΕαυτόΜου
ΜΕΤΑΒΛΗΤΕΣ
  ΧΑΡΑΚΤΗΡΕΣ: Χ[19]
  ΑΚΕΡΑΙΕΣ: ι
ΑΡΧΗ
  Χ[1] <- ''''
  Χ[2] <- '  Χ['
  Χ[3] <- '] <-'
  Χ[4] <- 'ΠΡΟΓΡΑΜΜΑ ΓράφωΤονΕαυτόΜου'
  Χ[5] <- 'ΜΕΤΑΒΛΗΤΕΣ'
  Χ[6] <- '  ΧΑΡΑΚΤΗΡΕΣ: Χ[19]'
  Χ[7] <- '  ΑΚΕΡΑΙΕΣ: ι'
  Χ[8] <- 'ΑΡΧΗ'
  Χ[9] <- '  ΓΙΑ ι ΑΠΟ 4 ΜΕΧΡΙ 8'
  Χ[10] <- '  ΓΡΑΨΕ Χ[ι]'
  Χ[11] <- '  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ'
  Χ[12] <- '  ΓΡΑΨΕ Χ[2], 1, Χ[3], Χ[1], Χ[1], Χ[1], Χ[1]'
  Χ[13] <- '  ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ 19'
  Χ[14] <- '  ΓΡΑΨΕ Χ[2], ι, Χ[3], Χ[1], Χ[ι], Χ[1]'
  Χ[15] <- '  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ'
  Χ[16] <- '  ΓΙΑ ι ΑΠΟ 9 ΜΕΧΡΙ 19'
  Χ[17] <- '  ΓΡΑΨΕ Χ[ι]'
  Χ[18] <- '  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ'
  Χ[19] <- 'ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ'
  ΓΙΑ ι ΑΠΟ 4 ΜΕΧΡΙ 8
    ΓΡΑΨΕ Χ[ι]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΡΑΨΕ Χ[2], 1, Χ[3], Χ[1], Χ[1], Χ[1], Χ[1]
  ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ 19
    ΓΡΑΨΕ Χ[2], ι, Χ[3], Χ[1], Χ[ι], Χ[1]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΙΑ ι ΑΠΟ 9 ΜΕΧΡΙ 19
    ΓΡΑΨΕ Χ[ι]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ[/glossa]
//end offtopic

gpapargi

Άλκη καθόλου δε διαφωνούμε στο θέμα της διαίρεσης. Απλά όταν έγραψα αυτά που έγραψα δεν ειχα στο νου μου μια γλωσσα που χειρίζεται από μόνη της τη διαίρεση αλλά τις γλώσσες που δεν τη χειρίζονται. Προφανώς η javascript καταλαβαίνει ότι γίνεται διαίρεση με 0 και γυρίζει άπειρο χωρίς να κάνει τη διαίρεση. Δηλαδή κάνει κάτι σαν αυτό που κάνουμε εμείς σε γλώσσες που δε διαιρούν με 0 διακρίνοντας περιπτώσεις. Η ουσία είναι νομίζω αυτό που έραψα:
«Το βασικό δηλαδή είναι αυτός που εκτελεί τον αλγόριθμο να ξέρει κάθε φορά τι πρέπει να κάνει.»

Η javascript  ξέρει τι πρέπει να κάνει ενώ άλλες γλώσσες όχι και πρέπει εμείς να χειριστούμε την κατάσταση. Προφανώς στην javascript η διαίρεση με 0 δεν παραβιάζει την καθοριστικότητα.

Εδώ βέβαια ίσως κάποιος μαθηματικός να θέσει μια ένσταση του στυλ «Η διαίρεση με 0 δεν κάνει άπειρο, απλά δεν ορίζεται, όπως δεν ορίζεται και η συνάρτηση 1/χ^2 στο 0.» Δηλαδή να σου πει ότι 1/0 δεν κάνει άπειρο αλλά δεν ορίζεται. Όπως και η 1/χ^2 στο 0 δεν παίρνει τιμή άπειρο αλλά δεν ορίζεται.

Γενικά υπάρχουν διαφωνίες μεταξύ μαθηματικών και άλλων επιστημών που έχουν άμεση σχέση με τα μαθηματικά. Πχ η συνάρτηση  dirac που στο 0 είναι άπειρο και παντού αλλού είναι 0, για τους μαθηματικούς δεν είναι και πολύ συνάρτηση. Οι φυσικοί όμως ορίζουν και το ολοκλήρωμά της.

Αλλά αυτό δεν αλλάζει τα όσα λέμε. Ότι κι αν συμφωνήσουμε ότι σημαίνει η διαίρεση με 0 μπορούμε να φτιάξουμε μια γλώσσα ώστε να κάνει αυτό ακριβώς. Το βασικό είναι αυτός που εκτελεί τον αλγόριθμο να μην αναρωτηθεί «τι πρέπει να κάνω τώρα;»

Evry είμαι από αυτούς που θέλουν η γνώση στην πληροφορική να έχει από κάτω της βαθύ θεωρητικό υπόβαθρο. Γι αυτό και όταν παράγω ένα τύπο (έστω και για την ΑΕΠΠ) τον συνοδεύω από απόδειξη. Εδώ όμως στα αλγοριθμικά κριτήρια υπάρχουν μπλεξίματα. Πχ το βιβλίο λέει στο κριτήριο της εισόδου ότι «Καμία, μία ή περισσότερες τιμές πρέπει να δίνονται ως είσοδοι στον αλγόριθμο».
Δηλαδή μπορεί στον αλγόριθμο να δίνεται ως είσοδος και «καμία» τιμή. Ποια η διαφορά του να πούμε «αυτός ο αλγόριθμος έχει για είσοδο καμία τιμή» με το να πούμε «αυτός ο αλγόριθμος δεν έχει είσοδο». Τι είδους κριτήριο είναι αυτό που πρέπει να ικανοποιείται απαραίτητα;

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

Επίσης για το θέμα του προγράμματος που εκτυπώνει τον εαυτό του θέλω να πω τα εξής:
Οι γριφώδης καταστάσεις ήταν ανέκαθεν το χόμπυ μου. Έχω πιάσει τον εαυτό μου να βελτιώνεται πολύ σε θέματα μαθηματικών αλλά και κατασκευής αλγορίθμων μέσα από αυτό το χόμπυ.
Πιστεύω ότι πρόκειται για μια πρώτης τάξεως γυμναστική μυαλού που μπορεί να βελτιώσει το μαθητή σε θέματα αυτοσχεδιασμού σε όλα τα μαθήματα (μαθηματικά, φυσική, ΑΕΠΠ). Έτσι ενθαρρύνω τους μαθητές να ασχολούνται με τέτοια. Το πρόβλημα είναι ότι, αν και θα το ήθελα, δεν μπορώ να θέσω ένα τέτοιο πρόβλημα ευθέως στα πλαίσια κάποιου μαθήματος. Καμιά φορά (εκτός μαθήματος) το κάνω με σκοπό να κεντρίσω το ενδιαφέρον τους και να ακονίσω το μυαλό τους. Αυτό αυξάνει και το ενδιαφέρον των μαθητών και δίνει χρώμα στο μάθημα.Σε όλους αρέσουν τα λεγόμενα «ψυχαγωγικά μαθηματικά» αλλά η ύλη του μαθήματος είναι περιοριστική. Νομίζω ότι το θέμα του προγράμματος που εκτυπώνει το εαυτό του, μπορεί να τεθεί με τη διευκρίνηση ότι πρόκειται για μια ενδιαφέρουσα σπαζοκεφαλιά, είναι εκτός των στενών πλαισίων της ΑΕΠΠ και έχει σκοπό να εξασκήσει την πρωτοτυπία των μαθητών.