Inleiding Programmeren + R

Logica

» Start

Logica


Logica gebruiken we in algoritmen als niet alle opdrachten altijd uitgevoerd moeten worden (zoals bij opeenvolging wel altijd het geval is). We willen bepaalde opdrachten bijvoorbeeld alleen uit laten voeren als een bepaalde bewering waar of niet waar is. 


De beweringen die wij gaan gebruiken in voorwaardelijke opdrachten zijn over het algemeen vergelijkingen (bv. T=1, A<B etc.). In de logica wordt vaak gebruik gemaakt van meer dan één vergelijking. Bij twee vergelijkingen wordt dan bijvoorbeeld de eis gesteld dat ze allebei waar moeten zijn. Men gebruikt hiervoor de EN, ook wel genoteerd als (het conjunctie teken), en in R als & . Dus de volgende expressie is altijd waar:


3=3 4=(3+1)


terwijl deze nooit waar is:


3=3 4=(2+1)


We bekijken bij dergelijke uitspraken altijd eerst wat de vergelijkingen apart zouden opleveren, en gaan daarna de twee combineren. In het laatste voorbeeld geeft dit de volgende stappen:


3=3 is waar, 4=2+1 is niet waar en dus is het totaal niet waar (waar én niet waar kan niet kloppen).


Zo hebben we ook nog de OF, aangeduid met het teken (het disjunctie teken), en in R met |. De OF is lastig, omdat we onderscheid moeten maken tussen de exclusieve en de inclusieve OF. In ons standaard taalgebruik hanteren we vaak de exclusieve OF, in de vorm … of … of, dus óf de ene óf de andere bewering is het geval (of je neemt een voorgerecht, of een toetje, maar niet beide !). In al onze programmeervoorbeelden, echter, hanteren we de inclusieve OF. Dat wil dus zeggen dat overal waar de OF staat we voor de totale expresssie de conclusie ‘true’ trekken als alle deel-uitspraken waar zijn, of tenminste één van deeluitspraken waar is ! 


Een andere veel gebruikte operatie is de NIET (ook wel ~), deze geeft niet-waar als A waar is en waar als A niet waar is.

Een ware bewering wordt in de informatica meestal TRUE genoemd, niet waar wordt dan FALSE. Men kan dit ook met een 1 en een 0 aangeven.


We kunnen voor het gebruik van de bovengenoemde tekens (zg logische connectieven of logische operatoren) een tabel maken, een zg waarheidstafel :

A

B

A en B

A of B

niet B

A xof B

TRUE

TRUE

TRUE

TRUE

FALSE

FALSE

TRUE

FALSE

FALSE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

TRUE

FALSE

TRUE

FALSE

FALSE

FALSE

FALSE

TRUE

FALSE

Volgens de regels der logica is een zin als: 


Wil je koffie of thee?


altijd met ja te beantwoorden (als je één van de twee wilt hebben). Welke van de twee je wilt hebben maakt dan niet uit (In welke betekenis wordt de OF hier gebruikt ?).


Nog enkele voorbeelden:


2==2 geeft TRUE

3==2 geeft FALSE

3>4 geeft FALSE

7>(5+1) geeft TRUE


Samenvattend kennen we de volgende logische operatoren:

        

        >       groter dan

        <       kleiner dan

        >=    groter of gelijk dan

        <=    kleiner of gelijk dan

        ==    is gelijk aan

        !=     is ongelijk aan

        &      logische EN

        &&   logische EN; reduceert eventuele vector in antwoord tot 1 element

        |       logische OF

        | |    logische OF; reduceert eventuele vector in antwoord tot 1 element

        !        ontkenning (niet ...)

        

en daarnaast nog de functie xor (= exclusive or).


TRUE en FALSE heten boolse of booleaanse variabelen. In R kan je zowel TRUE en FALSE of 1 en 0 gebruiken, het effect is hetzelfde. We geven overigens de voorkeur aan TRUE en FALSE, om verwarring met de numerieke 0 en 1 te voorkomen, zoals in het volgende voorbeeld duidelijk wordt gemaakt.


If Printer_On = 1           # Initialiseer de printer indien aangesloten

If Report_Selected = 1 # Print het rapport indien het het eerste is


In het bovenste geval had om redenen van duidelijkheid beter TRUE gebruikt kunnen worden i.p.v. 1. Dat blijkt uit het onderscheid met het tweede geval waar echt om nummer 1 gevraagd wordt. Als we daar hadden willen vragen of het rapport ja/nee geselecteerd was, had er moeten staan:


# Pak het rapport uit aangeboden stapel indien het geselecteerd is


    If Report_Selected = TRUE


Om de volgorde van de opdrachten aan te geven kunnen we haakjes gebruiken. 

Bijvoorbeeld de opdracht: 


> 5 == 7 - 2 


geeft dus TRUE (1) als antwoord. Met haakjes kunnen we de volgorde veranderen bijvoorbeeld: 


> (5 == 7) - 2 


geeft dus als antwoord -2 (want eerst wordt '5 == 7' berekend en van dat resultaat wordt 2 afgetrokken).


Net als de bekende rekenkundige operatoren (+ - * ** ^ /) kunnen ook de logische operatoren op vectoren werken:

    

    > c(TRUE, TRUE) & c(FALSE, TRUE)

    [1] FALSE   TRUE

    

    > c(FALSE, FALSE) | c(FALSE, TRUE)

    [1] FALSE   TRUE

    

We krijgen dus als antwoord ook een vector terug, net als bij een rekenkundige bewerking:

    

    > c(1,2,3) + c(4,5,6) 

    [1] 5 7 9

    

Maar in tegenstelling tot rekenkundige operaties kunnen we bij logische operaties wel de vector reduceren tot 1 enkel element. Dat doen we door gebruik te maken van de operatoren && of ||

    

    > c(TRUE, TRUE) && c(FALSE, TRUE)

    [1] FALSE 

    

    > c(FALSE, FALSE) || c(FALSE, TRUE)

    [1] TRUE

    

De vector die aanvankelijk resulteert als antwoord op de eerste & of |  bewerking wordt dus nogmaals een keer aan die bewerking onderworpen, met als resultaat dat er 1 enkele TRUE of FALSE resulteert. Dit kan wel eens van pas komen bij opdrachten waarvan de uitvoering afhankelijk is van een samengestelde voorwaarde.


R kent nog een aantal handige functies die werken op boolse vectoren, zoals any, all, en which.

    

    x <- c(2,9,3,1,6) # zo maar een vector

    enige <- x > 4

    alle <- x > 0

    

    > enige

    [1] FALSE  TRUE FALSE FALSE  TRUE

    

    > alle

    [1] TRUE TRUE TRUE TRUE TRUE

    

    any(enige) # is er in de vector enige tenminste 1 element TRUE ?

    [1] TRUE

    

    > any(alle) # is er in de vector alle tenminste 1 element TRUE ?

    [1] TRUE

    

    > any(!alle) # is er bij ontkenning van alle tenminste 1 element TRUE?

    [1] FALSE

    

    > all(enige) # zijn alle elementen in enige TRUE?

    [1] FALSE

    

    > all(alle) # zijn alle elementen in alle TRUE?

    [1] TRUE

    

    > which(enige) # op welke plaatsen is enige TRUE?

    [1] 2 5

    


>> Voorwaardelijke opdrachten