Vad är Boolesk algebra Lite förenklat kan man säga att Boolesk algebra är räkneregler konstruerade av den engelske matematikern Gerge Boole för att kunna räkna med logiska uttryck. I den booleska algebran finns som i normal algebra möjligheten att räkna med variabler. Det som skiljer en boolesk variabel från en normal variabel är att den bara kan anta värdena 0 eller 1. Värdet 0 brukar vi säga betyder falskt och 1 brukar tolkas som sant. Precis som i vanlig algebra finns även inom den booleska algebran ett antal räkneoperationer som man kan utföra på variablerna. I vanlig algebra finns operationerna +, -, *, / o.s.v. inom boolesk algebra finns bara operationerna +, * och. + brukar man kalla eller, * kallar vi och och brukar vi benämna icke (eng. or, and, not). Räknereglerna för dessa operationer skiljer sig från vanlig algebra. Följande regler gäller för eller : 0+0=0 0+1=1 1+0=1 1+1=1 Följande regler gäller för och : 0*0=0 0*1=0 1*0=0 1*1=1 För icke gäller följande regler: 1 =0 0 =1 Booleska variabler och översättning mellan programuttryck och booleska variabler Ett uttryck med booleska variabler och booleska operationer brukar man kalla ett booleskt uttryck t.ex. är p+q ett booleskt uttryck om p och q är booleska variabler. De booleska variablerna kan tilldelas värden precis som vanliga variabler med den skillnaden att det värde de tilldelas måste vara sant eller falskt. p=(x=3) är en giltig tilldelning där p blir sann (d.v.s. 1) om x=3 annars blir p falsk (d.v.s. 0) däremot är p=x+3 inte en giltig tilldelning, eftersom vi inte kan avgöra om x+3 är sant eller falskt. Ofta brukar vi skriva pq i stallet för p*q. I boolesk algebra utvärderas alltid icke först därefter och och sist utvärderas eller. I vissa fall kan man vilja ha en annan utvärderingsordning (presendensordning) i dessa fall använder man parenteser. Uttryck inom parenteser utvärderas alltid först. För att översätta en logisk programrad till en boolesk satts kan man gå till väga enligt följande:
Antag att vi har programraden x=3 or y=4 Ta först alla enkla uttryck som du kan svara sant eller falsk på och tilldela dessa till en variabel. I exemplet ovan skulle vi ha gjort följande tilldelningar: p=(x=3) q=(y=4) Ersätt sedan dessa uttryck med variablerna d.v.s. uttrycket ovan blir p or q Nästa steg blir att ersätta operatorerna or, and och not med motsvarande booleska operatorer d.vs or blir +,and blir * och not blir. Uttrycket ovan skulle alltså bli p+q. För mer komplicerade uttryck gör man likadant, men där kan antalet variabler bli många om man har otur. Ytterligare ett exempel: Antag programraden (x<3 or x=y+3 and x<3) or not z=x Låt p=x<3 q=(x=y+3) r=(z=x) alltså (p or q and p)or not r blir efter ersättning av operatorer (p+qp)+r (Kom ihåg regeln att q*p kan skrivas qp). Sanningstabeller I bland kan ett booleskt uttryck vara komplicerat och därför svår att få en överskådlig bild över. I dessa lägen brukar man använda sanningstabeller för att kunna avgöra i vilka lägen ett uttryck är sant eller falskt. I en sådan tabell brukar man börja med de enskilda variablerna för att sedan sätta i hop dessa till mer och mer komplicerade uttryck tills man når det uttryck man hade från början. Exempel : Gör en sanningstabell för p+q p q p+q 0 0 0 0 1 1 1 0 1 1 1 1 Detta exempel är mycket elementärt och nyttan av sanningstabeller framgår inte tydligt eftersom det går lätt att utvärdera uttrycket i huvudet. Om vi i stället tar ett mer komplicerat uttryck kommer nyttan att framgå tydligare.
Exempel: Gör en sanningtabell för (p*q+p) +(p ) p q p*q p*q+p p (p*q+p) (p ) (p*q+p) + (p ) 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 Som framgår av tabellen ovan är uttrycket sant för samtliga värdekombinationer av p och q om detta hade varit ett villkor i en program loop hade vi antingen hoppat över loopblocket helt eller snurrat för alltid i loopen men det hade varit svårt att se detta bara genom att titta på uttrycket. Bevis med hjälp av sanningstabeller Ett annat användningsområde för sanningstabeller är att vi kan använda dem för att bevisa att två olika booleska uttryck ger samma resultat. Exempel: Visa att (pq) =p +q p q p q pq (pq) p +q 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 1 1 Som framgår av tabellen ovan ger (pq) samma resultat som p +q för samtliga tänkbara värden av p och q. Vi har alltså visat att (pq) =p +q. Detta bevissätt kan vara bra att kunna bland annat för att kontrollera att de reduceringar man gjort av ursprungliga uttryck verkligen är rätt.( se. Förenkling av booleska uttryck)
Förenkling av booleska uttryck I bland kan man råka ut för att ett uttryck är mer komplicerat än det behöver vara t.ex. kan man ha kommit fram till ett uttryck i sitt program genom att bara lägga till fler och fler uttryck till ett loop- eller vilkorsuttryck. Uttryck som konstruerats på detta sätt kan ofta förenklas. Boolesk algebra innehåller en hel del regler om hur man får förenkla dessa regler kan du se i bilaga 1 (Lägg särskiljt märke till reglerna 17 och 18. De kallas för de Morgans lagar och används ofta i tekniska sammanhang). Tabellen kan se lite begränsad ut men det är så att varje variabel kan bytas ut mot ett mer sammansatt uttryck. Som du kommer i håg från den vanliga algebran så kan man utveckla uttryck t.ex. om vi har uttrycket z=y+1 och y=x^2+x+1 så kan vi skriva z=x^2+x+1+1. På samma sätt är det med boolesk algebra t.ex. antag uttrycket p+1 och p= q+rq så kan vi skriva (q+rq)+1 och fortfarande få samma uttryck. Därför är förenklingsreglerna kraftfullare än man först tror. Hur går man då till väga? Låt oss börja med ett exempel och försöka att förenkla uttrycket (p*q+p) +(p ) ( Det är samma uttryck som vi använde för att konstruera en av sanningstabellerna ovan). Låt oss börja. (p*q+p) +(p ) = (p*q+p) +p = (1) ((p+p)*(p+q)) +p = (7) ((p+p) +(p+q) )+p = (17) (p +(p+q) )+p = (8) (p +p q )+p = (18) ((p +p )*(p +q ))+p = (7) (p *(p +q ))+p = (17) (p+p )*(p+(p +q ) = (7) 1*(p+(p +q ) = (14) p+(p +q ) = (11) (p+p ) + q = (4) 1+q = (14) 1 (13)
Resultatet är samma som vi kom fram till tidigare d.v.s. uttrycket är sant för samtliga värden som p och q kan anta. Värdena inom parenteser är de regler som används vid förenklingen. Man kan alltid kontrollera om en förenkling är riktig genom att konstruera en sanningstabell för det ursprungliga uttrycket och en sanningstabell för det den förenkling man kommit fram till och sedan jämföra resultaten av dessa tabeller om resultaten för uttrycken i de bägge tabellerna är lika är uttrycken det också och vi har kommit fram till ett korrekt resultat vid förenklingen. Metoden ovan garanterar inte att vi når ett minimalt uttryck men vi kommer åtminstone fram till ett mindre komplext uttryck och ju enklare ett uttryck är desto mindre är chanserna för att vi gör något fel när vi skall realisera det i ett programspråk. Vad som nu återstår för att behärska detta är övning och åter övning. Nedan finns ett antal övningsuppgifter som du kan börja med. För den som är intresserad av hur man når fram till ett minimalt uttryck hänvisar vi till litteratur om karnaugh-diagram, men detta är utanför denna kurs område. Övningar: Rita sanningstabell för följande booleska uttryck: a) (p+q)*r b) pqr c) ((p+q) *r ) + pq d) ((p+q)(p+r)) e) (p *q ) +(pq) Visa med hjälp av sanningstabell följande likheter. a) p+qr = (p+q)(p+r) b) p(q+r) = pq+pr c) (p+q) = p q Förenkla följande uttryck a) p( q +r)+q b) (pq)(p+q) c) ((p+q)(p+r)) d) (p *q ) +(pq) e) p qr + pq r + pqr + pqr Översätt och förenkla följande uttryck med hjälp av boolesk algebra. Efter förenkling översätt dem tillbaka till ursprungsspråket. a) x=1 and y=3 or x=1 and y=4 b) Minpost = i or Minpost = x and Minpost = i c) x<2 or y=3 and x<2 or y>3 d) not(not x=y or not (x=y and z<i or z<i)) or z<i