Πίνακες αληθείας#
Μια δυαδική λογική συνάρτηση παίρνει δύο λογικές εισόδους και επιστρέφει μία λογική έξοδο. Υπάρχουν ακριβώς δεκαέξι τέτοιες συναρτήσεις — δηλαδή 2^(2^2): καθένας από τους τέσσερις συνδυασμούς εισόδου (0,0) (0,1) (1,0) (1,1) αντιστοιχίζεται ανεξάρτητα σε μία από δύο εξόδους, έτσι 2 × 2 × 2 × 2 = 16. Ούτε περισσότερες, ούτε λιγότερες.
Οι πέντε που έχουν δικό τους τελεστή Perl (&&, ||, xor, συν τις δύο τετριμμένες — πάντα-αληθές και πάντα-ψευδές) είναι αυτές που γνωρίζουν όλοι. Οι άλλες έντεκα είναι σιωπηλά κι αυτές εκεί, εκφρασμένες ως μικρές συνθέσεις. Αυτό το κεφάλαιο απαριθμεί και τις δεκαέξι, τις ονομάζει, και δείχνει πώς γράφεται η καθεμία στην Perl.
Η σύμβαση#
Κάθε συνάρτηση περιγράφεται πλήρως από την έξοδό της για τις τέσσερις γραμμές εισόδου, γραμμένες από πάνω προς τα κάτω με αυτή τη σειρά:
a b → output
0 0 → bit 1
0 1 → bit 2
1 0 → bit 3
1 1 → bit 4
Διαβάζοντας αυτά τα τέσσερα bit εξόδου ως αριθμό 4 bit, δίνεται στη συνάρτηση ο δείκτης της 0..15. Έτσι το AND είναι 0001 (μόνο η τελευταία γραμμή είναι αληθής), το OR είναι 0111, το XOR είναι 0110. Τα τρία τέταρτα του πίνακα είναι απλώς αναζήτηση της σωστής γραμμής.
Και οι δεκαέξι#
# | Αλήθεια | Όνομα | Σύμβολο | Perl απευθείας | Perl ιδιωματικά |
|---|---|---|---|---|---|
0 |
| ψευδές (αντίφαση) |
|
| — |
1 |
| AND |
|
|
|
2 |
| a AND NOT b |
| — |
|
3 |
| a (αριστερή προβολή) |
|
| — |
4 |
| NOT a AND b |
| — |
|
5 |
| b (δεξιά προβολή) |
|
| — |
6 |
| XOR |
|
|
|
7 |
| OR |
|
|
|
8 |
| NOR |
| — |
|
9 |
| XNOR / ισοδυναμία |
| — |
|
10 |
| NOT b |
|
|
|
11 |
| το b συνεπάγεται το a |
| — |
|
12 |
| NOT a |
|
|
|
13 |
| το a συνεπάγεται το b |
| — |
|
14 |
| NAND |
| — |
|
15 |
| αληθές (ταυτολογία) |
|
| — |
Πέντε γραμμές έχουν απευθείας τελεστή Perl (&&, ||, xor, !, συν τις δύο σταθερές). Οι άλλες έντεκα είναι σύντομες συνθέσεις αυτών. Δεν υπάρχει θεμελιώδης λόγος που η Perl γράφει κάποιες απευθείας και άλλες όχι — είναι ιστορικό, κληρονομημένο από τη C. Κάθε στήλη στα δεξιά είναι κάτι που μπορείτε να πληκτρολογήσετε σήμερα.
Αξίζει να ξεχωρίσουμε δύο πράγματα από τον πίνακα.
Συνεπαγωγή: →#
Η συνεπαγωγή είναι ο τελεστής που κανείς δεν νομίζει ότι χρησιμοποιεί, και όλοι χρησιμοποιούν συνεχώς. Το a → b διαβάζεται «το a συνεπάγεται το b» και είναι αληθές σε κάθε περίπτωση εκτός όταν το a είναι αληθές και το b είναι ψευδές. Αυτό είναι όλο.
a | b | a → b |
|---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
Η γραφή σε Perl είναι !$a || $b. Αυτή η ταυτότητα —
a → b≡¬a ∨ b
— είναι τόσο κοινή που αξίζει ένα όνομα· και το όνομα είναι υλική συνεπαγωγή. Αφού τη δείτε μία φορά, την εντοπίζετε παντού:
# "if the user is admin, the request must be authenticated"
# admin → authenticated
die unless !$user->is_admin || $req->is_authenticated;
# read aloud: "either not admin, or authenticated, or both"
Η μορφή unless ... !X || Y είναι άβολη. Το επόμενο κεφάλαιο για τους νόμους του De Morgan δείχνει πώς να την αναστρέψετε σε κάτι αναγνώσιμο.
Μια δεύτερη χρήσιμη ταυτότητα: η συνεπαγωγή είναι η άρνηση του XOR μόνο όταν γράφεται με έναν συγκεκριμένο τρόπο. Μην το αποστηθίζετε αυτό — αποστηθίστε αντ” αυτού τον παρακάτω, που είναι ο πραγματικός πίνακας αναζήτησης για την εναλλαγή μεταξύ κοινών μορφών:
Στόχος | Ένας τρόπος | Ισοδύναμος τρόπος |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Η τελευταία στήλη είναι μια προεπισκόπηση για το κεφάλαιο της λειτουργικής πληρότητας.
Η ισοδυναμία και το XOR είναι δυϊκά#
Το XOR είναι αληθές ακριβώς όταν τα a και b διαφέρουν. Η ισοδυναμία (XNOR) είναι αληθής ακριβώς όταν συμφωνούν. Είναι αρνήσεις μεταξύ τους, και αυτό ακριβώς λένε οι γραμμές του πίνακα αληθείας (η γραμμή 6 είναι 0 1 1 0, η γραμμή 9 είναι 1 0 0 1 — άρνηση κατά bit).
Στην Perl η πιο καθαρή γραφή και για τα δύο είναι να κανονικοποιηθεί κάθε τελεστέος σε 0 ή 1 πρώτα και στη συνέχεια να γίνει σύγκριση με == ή !=:
my $a01 = $a ? 1 : 0;
my $b01 = $b ? 1 : 0;
my $xor = $a01 != $b01; # true if they differ
my $xnor = $a01 == $b01; # true if they agree
Γιατί η κανονικοποίηση; Επειδή τα $a και $b μπορεί να είναι οποιεσδήποτε αληθείς τιμές — οι συμβολοσειρές "yes" και 5 είναι αμφότερες αληθείς αλλά όχι ίσες. Η απευθείας σύγκρισή τους με == ή eq απαντά σε διαφορετική ερώτηση. Το λογικό XOR ρωτά «έχουν την ίδια αλήθεια τιμής;», όχι «είναι ίσες;».
Μια σύντομη εναλλακτική χωρίς τις προσωρινές τιμές είναι !$a != !$b — κάθε ! επιστρέφει το κανονικό 1 ή "", και στη συνέχεια το != τις συγκρίνει. Δουλεύει, αλλά διαβάζεται πλάγια· η ρητή μορφή ? 1 : 0 είναι πιο αναγνώσιμη.
Διαβάζοντας τον πίνακα αντίστροφα#
Μερικές φορές θα γνωρίζετε το μοτίβο αληθείας που θέλετε και θα χρειαστεί να βρείτε τον τελεστή. Παράδειγμα: «Θέλω μια συνάρτηση που να είναι αληθής εκτός αν τα a και b είναι αμφότερα ψευδή.» Διαβάστε τις γραμμές: a=0,b=0 → 0, a=0,b=1 → 1, a=1,b=0 → 1, a=1,b=1 → 1. Αυτό είναι 0 1 1 1 — γραμμή 7 — OR.
Αυτό ακούγεται τετριμμένο εδώ, αλλά είναι ακριβώς πώς αποσφαλματώνετε μια μπερδεμένη συνθήκη: γράψτε τον πίνακα αληθείας της, διαβάστε τα τέσσερα bit, βρείτε τη γραμμή, και έχετε το κανονικό όνομα και την απλούστερη γραφή.
Τι πρέπει να θυμάστε από αυτό το κεφάλαιο#
Υπάρχουν ακριβώς δεκαέξι δυαδικές συναρτήσεις αληθείας· κάθε λογική έκφραση σε οποιαδήποτε γλώσσα υπολογίζει μία από αυτές.
Πέντε από τις δεκαέξι έχουν αποκλειστικό τελεστή Perl. Οι άλλες έντεκα είναι σύντομες συνθέσεις και ο παραπάνω πίνακας είναι η αναζήτηση.
Η συνεπαγωγή
a → bείναι¬a ∨ b. Εμφανίζεται συνεχώς κάτω από την επιφάνεια προτάσεωνunlessκαιif.Το XOR και το XNOR είναι αρνήσεις μεταξύ τους. Η πιο καθαρή γραφή σε Perl και για τα δύο ξεκινά με την κανονικοποίηση των τελεστέων σε
0ή1.