Se afișează postările cu eticheta matematică. Afișați toate postările
Se afișează postările cu eticheta matematică. Afișați toate postările

vineri, 16 noiembrie 2012

Noţiuni elementare de matematică pentru programatori (2) – Tipul logic

În matematică, nu e deloc simplu de definit conceptul de propoziţie. Putem spune că o propoziţie este o expresie verbală a unei judecăţi (adică un enunţ) despre care se poate spune dacă este adevărată sau falsă. Intrând puţin în metateorie, putem să ne întrebăm: bine, bine, dar ceea ce  „putem spune” e, oare, adevărat, sau fals? Şi, mai ales, are sens?

Dar, să lăsă, lucrurile acestea sterile şi să ne concentrăm asupra esenţialului. Iar acesta este că, în logica noastră clasică, de sorginte aristotelică, există doar două valori de adevăr, cele pe care le-am enunţat, şi orice enunţ – orice enunţ decidabil – este, fie adevărat, fie fals. Cale de mijloc nu există. Acceptăm, aşadar, următoarele două principii:

Principiul terţului exclus: O propoziţie este sau adevărată, sau falsă, altă variantă nu există.
Principiul noncontradicţiei: O propoziţie nu poate fi în acelaşi timp şi adevărată şi falsă.

Propoziţiile sunt de două feluri: simple (atomice, elementare), şi compuse. Propoziţiile simple sunt de forma subiect+predicat (de data asta, din punct de vedere lingvistic).

Exemple:
S: Soarele + P: străluceşte (acum).
S: 2 + P: e un număr natural.
S: Capitala României + P: este oraşul Bucureşti.
Propoziţiile compuse au în componenţa lor, cuvinte precum „şi”, „sau”, „deoarece”, „prin urmare”, „dacă”, şi aşa mai departe. Şi, obligatoriu, au mai multe predicate, şi mai multe subiecte (chiar dacă acest lucru nu este explicit).

Exemplu: „Toţi elevii (din clasa ...) au promovat” pare o propoziţie simplă (şi, uneori, poate fi tratată ca atare), dar, de fapt, este o formă condensată a propoziţiei compuse „Elevul 1 a promovat, şi elevul 2 a promovat, şi ...”.

În fapt, această distincţie nu este prea importantă în practică.Esenţial este faptul că putem combina două sau mai multe propoziţii pentru a obţine o altă propoziţie, şi facem acest lucru cu ajutorul operatorilor (conectorilor, functorilor) logici

Operatorul
Simbol (aici)
Numele operaţiei
    Non
⌐
Negaţia
      Şi
and
Conjuncţia
    Sau
or
Disjuncţia
Ori … ori
xor
Sau exclusiv
Dacă ... atunci
=>
Implicaţia
Dacă şi numai dacă
<=>
Echivalenţa

Dintre aceşti operatori numai primii patru sunt utilizaţi, în mod curent, în majoritatea limbajelor de programare.

Primul dintre cei şase operatori este unar (se aplică doar unei propoziţii), pe câtă vreme ceilalţi sunt binari (se aplică mai multor propoziţii). Modul cum funcţionează aceşti operatori este prezentat în tabelul de mai jos:

p
q
⌐p
p and q
p or q
p xor q
p => q
p<=>q
A
A
F
A
A
F
A
A
A
F
F
F
A
A
F
F
F
A
A
F
A
A
A
F
F
F
A
F
F
F
A
A

O propoziţie compusă adevărată tot timpul, indiferent de valoarea de adevăr a propoziţiilor componente, se numeşte tautologie. Un exemplu banal de tautologie este reprezentat de p or ⌐p (operatorul non are prioritate), care nu e altceva decât ilustrarea principiului terţului exclus !

 O inferenţă logică este o metodă de a obţine noi propoziţii adevărate din propoziţii despre care s-a stabilit deja că sunt adevărate. Orice tautologie conduce la o regulă de inferenţă.

Inferenţele sunt importante în informatică atunci când lucrăm cu sisteme expert, sisteme inteligente, când vizăm domenii de inteligenţă artificială precum demonstrarea automată a teoremelor etc.

Tipul logic (boolean)

Este un tip de date implementat, practic, în majoritatea limbajelor de programare. Datele de tip logic pot avea una din cele două valori: adevărat (true) sau fals (false). Sunt implementaţi de asemenea, şi operatorii mai sus-amintiţi (mai puţin ultimii doi).

Principalele probleme care pot apărea în legătură cu acest tip de date sunt reprezentate de conversia tipurilor. Sau, de întrebarea: ce este o dată de acest tip?

Sunt limbaje (de ex. C, C++, în specificaţiile originale) în care tipul logic nu era definit, altele (variantele moderne ale aceloraşi limbaje) în care întregii 0 şi 1 sunt trataţi ca fiind echivalenţi cu false şi true, fără niciun cast (conversie) explicit.   În altele (Java) acest lucru nu este permis, fiind necesară întodeauna o convertire explicită. În fine, în altele (PHP), practic, orice poate fi interpretat ca fiind de tip logic, fără niciun cast.

Observăm că, în unele cazuri, putem evalua o propoziţie compuse, fără a evalua ambele (în cazul în care sunt două) propoziţii componente. Bunăoară, propoziţia compusă p sau q, este adevărată dacă propoziţia p este adevărată, indiferent de valoarea propoziţiei q.

Cum în informatică, timpul de execuţie este, întotdeauna o resursă critică, numeroase limbaje de programare implementează câte doi operatori pentru operaţiile de sau şi şi, unul din ei – cel numit leneş (lazy) – realizând, dacă este cazul, evaluarea unei date logice compuse, fără a evalua ambii operanzi. Acest lucru poate fi benefic, dar poate genera şi unele efecte pe care nu le dorim, dacă avem nevoie de evaluarea şia celui de-al doilea operand, în toate situaţiile posibile. 

Ţinând cont de cele de mai sus, şi de faptul că reprezentarea internă a unei date de orice tip este, de fapt, o secvenţă de biţi, sau de 0 şi 1, unele limbaje implementează operatori logici pe biţi, care operează asupra reprezentărilor binare ale unor altor tipuri de date (de exemplu întregi) şi returnează un rezultat de acelaşi tip. Aceşti operatori pot crea numeroase confuzii în rândul programatorilor începători, şi de aceea, mulţi îi evită, dar, la fel de bine pot reprezenta un instrument puternic de lucru atunci când cunoaştem şi astfel de aspecte.
 
O altă problemă vizează instrucţiunile de decizie şi ciclare, care funcţionează pe baza evaluării unei date de tip logic. Dacă acea dată este, de fapt, o tautologie, atunci instrucţiunile respective se vor efectua, probabil, altfel decât am dorit, de exemplu se va intra într-un ciclu infinit, iar astfel de greşeli logice nu vor fi semnalate niciodată de compilator/interpretor. 

Sigur, există posibilitatea ca expresiile logice foarte complicate să poată fi analizate mai uşor prin transformarea lor în forme normale, dar, mult mai sigură şi uşoară este urmarea recomandării folosirii unor date logice cât mai simple, şi evitarea oricăror artificii periculoase.

joi, 15 noiembrie 2012

Testul lui Einstein

Testul care urmează a fost, se pare, construit de Einstein - deşi lucrurile nu sunt absolut sigure. Se pare că autorul său ar fi spus că 98% dintre oameni nu au capacitatea de a-l rezolva, ceea ce, sincer, mi se pare puţin credibil. Poate că e vorba de rezolvarea mentală a acestui test, fără creion, hârtie, sau altele asemenea. Altfel, testul mi se pare chiar uşor banal, rezolvarea sa necesitând doar puţină atenţie şi un pic de răbdare.

E vorba despre 5 case, fiecare de altă culoare, aliniate de la stânga la dreapta. În fiecare casă locuieşte o singură persoană, fiecare de altă naţionalitate. Fiecărui locatar al fiecărei case îi place o anumită băutură, fumează o anumită marcă de ţigări şi deţine un anumit animal de casă. Niciuna din cele 5 persoane nu bea aceeaşi băutură, nu fumează aceeaşi marcă de ţigări şi nu deţine acelaşi fel de animal de casă. Informaţiile de care dispunem sunt:

1.       Britanicul locuieşte în casa roşie.
2.       Suedezul are un câine.
3.       Danezul bea cu plăcere ceai.
4.       Casa verde se află în stânga casei albe.
5.       Locatarul casei verzi bea cafea.
6.       Persoana care fumează Pall Mall are o pasăre.
7.       Locatarul care locuieşte în casa din mijloc, bea lapte.
8.       Locatarul din casa galbenă fumeaza Dunhill.
9.       Norvegianul locuieşte în prima casă.
10.   Fumătorul de Marlboro locuieşte lângă cel care are o pisică.
11.   Locatarul care are un cal locuieşte lângă cel care fumează Dunhill.
12.   Fumătorul de Winfield bea cu plăcere bere.
13.   Norvegianul locuieşte lângă casa albastră.
14.   Germanul fumează Rothmans.
15.   Fumătorul de Marlboro are un vecin care bea apă.

Cine are un acvariu cu peşti?

Pentru început observăm urmatoarele:
  • Culorile caselor sunt: albă, albastră, galbenă, roşie, verde
  • Nationalităţile: britanic, danez, german, norvegian, suedez
  •  Băuturile: apă, bere, cafea, ceai, lapte
  • Ţigările: Dunhill, Marlboro, Pall Mall, Rothmans, Winfield
  • Animalele: cal, câine, pasăre, peşte, pisică.
Vom înscrie toate aceste informaţii într-o matrice cu 6 linii şi 7 coloane, din care:
  • În fiecare căsuţă a primei coloane vom descrie conţinutul liniei corespunzătoare (respectiv numărul casei, culoarea ei, naţionalitatea, băutura, ţigara şi snimalul preferat).
  • În ultima coloană vom înscrie, pentru început, toate variantele posibile, urmând ca, pe măsură ce facem identificările respective, să operăm modificările corespunzătoare.
Ceea ce obţinem arată aşa:
 
Nr. casei
1
2
3
4
5

Culoarea casei





albă, albastră, galbenă, roşie, verde
Naţionalitatea





britanic, danez, german, norvegian, suedez
Băutura





apă, bere, cafea, ceai, lapte
Ţigara





Dunhill, Marlboro, Pall Mall, Rothmans, Winfield
Animalul





cal, câine, pasăre, peşte, pisică

Acum, mutăm norvegianul în casa nr. 1 (9), lângă casa albastră (13). Observând şi că, în casa nr. 3 e un băutor de lapte, obţinem:
 
Nr. casei
1
2
3
4
5

Culoarea casei

albastră



albă, galbenă, roşie, verde
Naţionalitatea
norvegian




britanic, danez, german, suedez
Băutura


lapte


apă, bere, cafea, ceai
Ţigara





Dunhill, Marlboro, Pall Mall, Rothmans, Winfield
Animalul





cal, câine, pasăre, peşte, pisică

Casa norvegianului nu poate fi roşie (9), nici verde (4) şi nici albă (casa nr. 1 nu are „stânga”). Prin urmare, nu poate fi decât galbenă. Şi, imediat urmează că norvegianul fumează Dunhill (8). Cum lângă casa nr. 1 nu e decât casa nr. 2, rezultă că proprietarul acesteia are un cal (11).

Nr. casei
1
2
3
4
5

Culoarea casei
galbenă
albastră



albă, roşie, verde
Naţionalitatea
norvegian




britanic, danez, german, suedez
Băutura


lapte


apă, bere, cafea, ceai
Ţigara
Dunhill




Marlboro, Pall Mall, Rothmans, Winfield
Animalul

cal



câine, pasăre, peşte, pisică

Cum casa verde este în stânga casei albe (4), rezultă că nu poate fi decât casa cu numărul 3 sau 4, dar locatarul casei verzi bea cafea (5), în timp ce locatarul casei din mijloc (nr. 3) bea lapte (7). Prin urmare, casa verde are numărul 4, casa din dreapta ei e albă, iar casa din mijloc nu poate fi decât roşie: 

Nr. casei
1
2
3
4
5

Culoarea casei
galbenă
albastră
roşie
verde
albă

Naţionalitatea
norvegian




britanic, danez, german, suedez
Băutura


lapte


apă, bere, cafea, ceai
Ţigara
Dunhill




Marlboro, Pall Mall, Rothmans, Winfield
Animalul

cal



câine, pasăre, peşte, pisică

Acum, mutăm britanicul în casa roşie (3), punem cafeaua în dreptul casei verzi (5). Cum norvegianul nu fumează Winfield, nu bea bere (12), şi nici ceai (3), prin urmare bea apă, şi, deci, fumătorul de Marlboro stă în casa nr. 2 (15). Până aici am obţinut următorul rezultat:
 
Nr. casei
1
2
3
4
5

Culoarea casei
galbenă
albastră
roşie
verde
albă

Naţionalitatea
norvegian

britanic


danez, german, suedez
Băutura
apă

lapte
cafea

bere, ceai
Ţigara
Dunhill
Marlboro



Pall Mall, Rothmans, Winfield
Animalul

cal



câine, pasăre, peşte, pisică

Fumătorul de Winfield nu poate sta în coloanele 1 sau 2, acelea fiind deja ocupate, şi deoarece cei din coloanele 3 si 4 beau lapte şi cafea, nu poate fi decât în coloana 5 (12), şi, fireşte, bea şi bere, astfel că domnului din coloana 2 nu-i rămâne decât ceaiul:
 
Nr. casei
1
2
3
4
5

Culoarea casei
galbenă
albastră
roşie
verde
albă

Naţionalitatea
norvegian

britanic


danez, german, suedez
Băutura
apă
ceai
lapte
cafea
bere

Ţigara
Dunhill
Marlboro


Winfield
Pall Mall, Rothmans,
Animalul

cal



câine, pasăre, peşte, pisică

Neamţul nu poate sta în coloana 1 sau 3 (acolo stau norvegianul şi britanicul), nici în coloana 2 sau, fiindcă fumează Rothmans (14), nu Marlboro sau Winfield. Rezultă, deci, că nu poate sta decât în coloana 4, iar cel din coloana 3, adică britanicul, nu mai poate fuma altceva decât Pall Mall. Şi, da, danezul bea ceai (3), deci stă în coloana 2, iar suedezul in singurul loc ce i-a mai rămas, adică în coloana 5.
 
Nr. casei
1
2
3
4
5

Culoarea casei
galbenă
albastră
roşie
verde
albă

Naţionalitatea
norvegian
danez
britanic
german
suedez

Băutura
apă
ceai
lapte
cafea
bere

Ţigara
Dunhill
Marlboro
Pall Mall
Rothmans
Winfield

Animalul

cal



câine, pasăre, peşte, pisică

Englezul este cel care fumează Pall Mall, deci are o pasăre (6), suedezul are un câine (2), fumătorul de Marlboro are, deja, în coloana 3, un vecin care are o pasăre, deci numai celălalt vecin, respectiv norvegianul, are o pisică. Ghici cine are un acvariu cu peşti?
 
Nr. casei
1
2
3
4
5

Culoarea casei
galbenă
albastră
roşie
verde
albă

Naţionalitatea
norvegian
danez
britanic
german
suedez

Băutura
apă
ceai
lapte
cafea
bere

Ţigara
Dunhill
Marlboro
Pall Mall
Rothmans
Winfield

Animalul
pisică
cal
pasăre

câine
peşte