Digitális számítógépek legfontosabb jellemzői
- univerzális: bármilyen adatfeldolgozást megvalósító algoritmus elvégzésére képes
- automatikus működésű: képes egy vagy több program utasításait önállóan, emberi beavatkozás nélkül végrehajtani
- utasításciklus: a program(ok) utasításainak ciklikus végrehajtása (a program által meghatározott sorrendben)
- megszakítási rendszer: a működés bármelyik ciklusban megszakítható (kivéve, ha nem: lefagyás, "kék halál")
- kívülről vezérelhető: működtető vagy operációs rendszerrel rendelkezik (pl. Microsoft Windows)
- szoftver: a számítógépes programok együttműködő rendszere
- műszakilag megvalósított rendszer: meghatározott hardver egységei vannak
A számítógép fekete doboz modellje⇒
- bemeneti adatok; input (amelyet a digitális számítógépek rendszerint bináris formára alakítanak át)
- az adatokon végrehajtandó utasítássorozat, algoritmus
- az utasítások végrehajtása során képződött részeredmények ("rövid távú memória")
- a számítógépben tárolt adatok, törzsadatok (pl. egy adatbázis; "hosszú távú memória")
- kimeneti adatok, eredmények; output (a működés során előállított bináris adatokat a digitális számítógépek rendszerint az emberi kommunikáció által megszokott formára alakítanak át)
Logikai függvények
A számítógép mint fekete doboz működését leegyszerűsítve a következőképpen tudjuk megfogalmazni:
- ha bemenetként (inputként) 'n' darab bináris értéket adunk meg, akkor
- a számítógép ezekhez az értékekhez a működés algoritmusa által meghatározott módon
- kimenetként (outputként) 'm' darab bináris értéket rendel hozzá.
Formálisan ezt az alábbi 'f' függvénnyel tudjuk leírni:
f(x1,x2,...,xn) : G1Χ G2Χ ...Χ Gn → H1Χ H2Χ ...Χ Hm
ahol
– Gi={0,1} (1≤i≤n) azokat a bináris értékeket tartalmazó halmazokat jelöli, amelyekből az input értékeket vesszük,
– Hj={0,1} (1≤j≤m) pedig azokat a bináris értékeket tartalmazó halmazokat jelöli, amelyekből a számítógép az output értékeket előállítja.A fenti 'f' függvény megadása ekvivalens az alábbi 'm' darab függvény megadásával:
f1(x1,x2,...,xn) : G1Χ G2Χ ...Χ Gn → H1
f2(x1,x2,...,xn) : G1Χ G2Χ ...Χ Gn → H2
...
fm(x1,x2,...,xn) : G1Χ G2Χ ...Χ Gn → Hm
ahol Gi={0,1} (1≤i≤n) és Hj={0,1} (1≤j≤m) az egyes fk (1≤k≤m) függvények értelmezési tartományát, ill. értékkészletét megadó kétértékű halmazok.Jegyezzük meg, hogy a számítógép működését leíró 'f' függvény értéke (azaz az 'f' függvényt megadó algoritmus kimenete) függhet azoktól az értékektől is, amelyeket a számítógép korábbi működése során előállított és/vagy eltárolt (például adatbázisokat használó alkalmazások esetében nyilvánvalóan ez a helyzet; de a számítógép korábbi állapotai is meghatározhatják a számítógép működését, pl. tanuló neurális hálózatok esetén). Erre a kérdésre később még visszatérünk, de egyelőre az egyszerűség kedvéért tételezzük fel, hogy az 'f' függvény független változói (azaz a számítógép bemenetei) teljes mértékben meghatározzák a függvény értékét. Ezt úgy is megfogalmazhatjuk, hogy nincsenek olyan "rejtett paraméterek", amelyek egyfajta formális "emlékezetként" befolyásolnák az 'f' függvény értékét (azaz a számítógép által szolgáltatott kimenetet).
Az, hogy a függvényekben a bemenetet és a kimenetet bináris értékek segítségével adtuk meg, nem jelent semmilyen korlátozást a számítógép működésére nézve. Korábban láttuk, hogy lényegében bármilyen típusú adat, például a számok,⇒ vagy a karakterek, ill. szöveges adatok⇒ ábrázolhatók bináris értékek meghatározott sorozatával.
A számítógép működésének leírásakor használt {0,1} bináris értékeket egyaránt tekinthetjük
– bináris számjegyeknek,
– logikai értékeknek (például 0↔'hamis', 1↔'igaz' értelemben), ill.
– egy digitális áramkör feszültségszintjeinek (például 0↔'alacsony feszültségszint', 1↔'magas feszültségszint' értelemben).Ha a {0,1} bináris értékeket logikai értékeknek tekintjük (0↔'hamis', 1↔'igaz' értelemben), akkor a számítógép működését 'n' változós
p1(x1,x2,...,xn):{0,1}Χ{0,1}Χ...Χ{0,1}→{0,1}
...
pk(x1,x2,...,xn):{0,1}Χ{0,1}Χ...Χ{0,1}→{0,1}
...
pm(x1,x2,...,xn):{0,1}Χ{0,1}Χ...Χ{0,1}→{0,1}
alakú logikai függvények segítségével írhatjuk le, ahol az xi argumentumok (1≤i≤n) kétértékű (vagyis 'igaz' vagy 'hamis' értékű) logikai változók (1≤k≤m, 'm' tetszőleges pozitív egész szám).Először azzal a kérdéssel foglalkozunk, hogyan tudunk ilyen logikai függvényeket előállítani, utána pedig azt vizsgáljuk meg, milyen eszközök állnak rendelkezésünkre, hogy ezeket a logikai függvényeket technikailag is megvalósítsuk, és egy működőképes (elektronikus) rendszert állítsunk elő.
A továbbiakban bevezetünk három logikai alapműveletet, amelyek segítségével bármilyen logikai függvény előállítható. A digitális számítógépek működésének alapja, hogy a logikai alapműveletek (és ezáltal a logikai függvények) technikailag megvalósíthatók digitális áramkörök, ún. kapuáramkörök segítségével.
A három logikai alapművelet a következő:
- negáció (tagadás, logikai "nem")
- konjunkció (logikai "és")
- diszjunkció (logikai "vagy")
A továbbiakban jelöljük a logikai változókat A, B, C, ...-vel. Jegyezzük meg, hogy a logikai változók csak két értéket vehetnek fel, a 0 ("hamis") vagy az 1 ("igaz") értékeket.
Egyes esetekben szükségünk lesz még két logikai konstansra is: azt a szimbólumot, amely mindig igaz, ⊤ módon (ún. "szabvány igaz"), azt a szimbólumot pedig, amely mindig hamis, ⊥ módon (ún. "szabvány hamis") fogjuk jelölni.
A logikai alapműveletek egyváltozós és kétváltozós logikai függvények. Ezért a logikai műveleteket legegyszerűbben ún. igazságtáblázatokkal tudjuk leírni, amelyben az értelmezési tartomány minden lehetséges értékéhez megadjuk az értékkészlet megfelelő elemét.
(1) negáció vagy tagadás ("nem A" vagy "NOT A"; jele ⌝A, de szokásos az A jelölés is)
A negáció ⌝A:{0,1}→{0,1} módon leírható egyváltozós logikai függvény. Igazságtáblázata a következő:
negáció A ( ⌝A ) 0 1 1 0 (2) konjunkció vagy logikai "és" ("A és B", "A AND B"; jele: A∧B, de szokásos egyszerűen az AB jelölés is)
A konjunkció A∧B:{0,1}Χ{0,1}→{0,1} módon leírható kétváltozós logikai függvény. Igazságtáblázata a következő:
konjunkció A B ( A ∧ B ) 0 0 0 0 1 0 1 0 0 1 1 1 (3) diszjunkció vagy logikai (megengedő) "vagy" ("A vagy B", "A OR B"; jele: A∨B, de szokásos az A+B jelölés is)
A diszjunkció A∨B:{0,1}Χ{0,1}→{0,1} módon leírható kétváltozós logikai függvény. Igazságtáblázata a következő:
diszjunkció A B ( A ∨ B ) 0 0 0 0 1 1 1 0 1 1 1 1 A három alapvető logikai művelet igazságtáblázatai alapján könnyen ellenőrizhetők a logikai alapműveletek alapvető tulajdonságait leíró alábbi logikai azonosságok, más néven logikai törvények:
A logikai alapműveletekkel kifejezhető legfontosabb azonosságok:
- kettős tagadás: ⌝(⌝A) = A
- a konjunkció idempotenciája: A∧A = A
- a konjunkció kommutativitása: A∧B = B∧A
- a konjunkció asszociativitása: (A∧B)∧C = A∧(B∧C)
- konjunkció szabványkijelentésekkel:
- A∧⊤ = A
- A∧⊥ = ⊥
- a diszjunkció idempotenciája: A∨A = A
- a diszjunkció kommutativitása: A∨B = B∨A
- a diszjunkció asszociativitása: (A∨B)∨C = A∨(B∨C)
- diszjunkció szabványkijelentésekkel:
- A∨⊤ = ⊤
- A∨⊥ = A
- disztributivitás:
- A∧(B∨C) = (A∧B)∨(A∧C)
- (A∨B)∧(C∨D) = (A∧C)∨(A∧D)∨(B∧C)∨(B∧D)
- A∨(B∧C) = (A∨B)∧(A∨C)
- (A∧B)∨(C∧D) = (A∨C)∧(A∨D)∧(B∨C)∧(B∨D)
- abszorpció (elnyelés; elimináció):
- A∧(A∨B) = A
- (A∨B)∧(A∨B∨C) = (A∨B)
- A∨(A∧B) = A
- (A∧B)∨(A∧B∧C) = (A∧B)
- (A∧C)∨(B∧⌝C)∨(A∧B) = (A∧C)∨(B∧⌝C)
- de Morgan-féle azonosságok:
- ⌝(A∧B) = ⌝A∨⌝B
- ⌝(A∨B) = ⌝A∧⌝B
- felbontás:
- A = (A∧B)∨(A∧⌝B)
Logikai alapelvek:
- az ellentmondás törvénye:
- (A∧⌝A) = ⊥
- a kizárt harmadik törvénye:
- (A∨⌝A) = ⊤
A fenti logikai azonosságokban (vagy tautológiákban) használt "kiemelt" egyenlőségjel ( = ) az általa összekapcsolt logikai kifejezések ekvivalenciáját fejezi ki: a logikai azonosságokban az egyenlőségjel bal- és jobboldalán szereplő logikai kifejezések a bennük szereplő logikai változók minden lehetséges értéke mellett azonos logikai értéket adnak. (A logikai kifejezések ekvivalenciájának jelölésére szokásos az A~B jelölés is.)
A logikai azonosságok bal- és jobboldalán ekvivalens logikai kifejezések szerepelnek. Ezért ha egy tetszőleges 'p' logikai kifejezést úgy alakítunk át, hogy egy benne szereplő 'a' logikai kifejezést az a~b logikai azonosság felhasználásával egy vele ekvivalens 'b' kifejezéssel helyettesítünk, a 'p' logikai kifejezéssel ekvivalens 'q' logikai kifejezést kapunk. Ilyenkor p~q miatt ekvivalens átalakításról vagy azonos átalakításról beszélünk.
A fenti logikai azonosságok bármelyike könnyen igazolható igazságtáblázatok létrehozásával. Például igazoljuk az abszorpció törvényét, azaz az
A∧(A∨B) = A
azonosságot egy igazságtáblázattal:
A táblázatból leolvasható, hogy az abszorpciót kifejező azonosság bal- és jobboldalán szereplő logikai kifejezések értékei az 'A' és 'B' kijelentésváltozók minden lehetséges értéke mellett megegyeznek, vagyis az azonosság teljesül. Vegyük észre, hogy ez megfelel annak, hogy az A∧(A∨B) ≡. A ekvivalencia az 'A' és 'B' kijelentésváltozók minden lehetséges értékére igaz, vagyis ⊨ A∧(A∨B) ≡. A logikai törvény (ill. tautológia).
Az igazságtáblázatokat könnyen és kényelmesen létrehozhatjuk JavaScript programok segítségével is.⇒
A JavasScript programok legegyszerűbben a már korábban használt online JavaScript interpreter⇒ segítségével futtathatók.Példa: írassuk ki a negáció (⌝A), a konjunkció (A∧B), és a diszjunkció (A∨B) igazságtáblázatát!
A negáció (⌝A) igazságtáblázata:
// negáció igazságtáblázata function neg(x) { var a=Boolean(x); var c=!a; return Number(c); } writeln("A"+" "+"⌝A"); writeln("-----"); for(i=0;i<=1;i++) { var k=neg(i); writeln(i+" "+k); } writeln("-----");A konjunkció (A∧B) igazságtáblázata:
// konjunkció igazságtáblázata (saját függvény létrehozásával) function kon(x,y) { var a=Boolean(x), b=Boolean(y); var c=a && b; return Number(c); } writeln("A"+" " +"B"+" "+"A∧B"); writeln("-------"); for(i=0;i<=1;i++) { for(j=0;j<=1;j++) { var k=kon(i,j); writeln(i+" " +j+" "+k); } } writeln("-------");A diszjunkció (A∨B) igazságtáblázata:
// diszjunkció igazságtáblázata function disz(x,y) { var a=Boolean(x), b=Boolean(y); var c=a || b; return Number(c); } writeln("A"+" " +"B"+" "+"A∨B"); writeln("-------"); for(i=0;i<=1;i++) { for(j=0;j<=1;j++) { var k=disz(i,j); writeln(i+" " +j+" "+k); } } writeln("-------");A logikai azonosságok felhasználásával lehetőségünk van arra, hogy különböző logikai kifejezéseken ekvivalens átalakításokat hajtsunk végre (például azért, hogy egyszerűbb alakra hozzuk őket). Próbáljuk meg egyszerűsíteni például a p(A,B,C) három változós logikai kifejezést, felhasználva a konjunkció disztributivitását, a harmadik kizárásának logikai törvényét és a konjunkció szabvány igaz kijelentés mellett érvényes azonosságát:
p(A,B,C) =
(⌝A∧B∧⌝C) ∨ (⌝A∧B∧C) =
(⌝A∧B) ∧ (⌝C∨C) =
(⌝A∧B) ∧ ⊤ =
(⌝A∧B)Általánosan megfogalmazva a fenti levezetés eredményét: azt mondhatjuk, hogy ha diszjunkcióval (∨) összekapcsolunk két olyan konjunktív (csak ∧ műveletet tartalmazó) kifejezést, amelyek azonos változókat (A, B és C) tartalmaznak, és csak egy változó ponált (C), illetve negált (⌝C) alakjában különböznek (vagyis A és B a konjunktív kifejezésekben azonos alakban szerepelnek), akkor a konjunktív kifejezéseket megkülönböztető változó (azaz C) egyszerűen elhagyható.
A logikai alapműveletek (∧, ∨ és ⌝) mellett három további logikai műveletet érdemes megismerni. Ezek a kizáró vagy, az implikáció és az ekvivalencia.
(4) kizáró vagy ("A XOR B", jele: A⨁B)
A kizáró vagy A⨁B:{0,1}Χ{0,1}→{0,1} módon leírható kétváltozós logikai függvény. Igazságtáblázata a következő:
kizáró vagy A B ( A ⨁ B ) 0 0 0 0 1 1 1 0 1 1 1 0 A kizáró vagy műveletet az
A⨁B = (A∨B)∧⌝(A∧B)
vagy az
A⨁B = (A∧⌝B)∨(⌝A∧B)
azonosságokkal vissza tudjuk vezetni a korábban megismert logikai alapműveletekre.(5) implikáció ("...-ból következik", jele: A⊃B, de előfordul az A⇒B jelölés is)
Az implikáció A⊃B:{0,1}Χ{0,1}→{0,1} módon leírható kétváltozós logikai függvény. Igazságtáblázata a következő:
implikáció A B ( A ⊃ B ) 0 0 1 0 1 1 1 0 0 1 1 1 Az implikációt az
A⊃B = ⌝A∨B
azonossággal vissza tudjuk vezetni a korábban megismert logikai alapműveletekre.(6) ekvivalencia ("ekvivalens", jele: A≡B, de előfordul az A⇔B jelölés is)
Az ekvivalencia A≡B:{0,1}Χ{0,1}→{0,1} módon leírható kétváltozós logikai függvény. Igazságtáblázata a következő:
ekvivalencia A B ( A ≡ B ) 0 0 1 0 1 0 1 0 0 1 1 1 Az ekvivalenciát az
A≡B = (A⊃B)∧(B⊃A)
az
A≡B = ⌝(A⨁B)
vagy az
A≡B = (A∧B)∨(⌝A∧⌝B)
azonosságokkal vissza tudjuk vezetni a korábban megismert logikai alapműveletekre.
Végezetül jegyezzük meg, hogy az igazságértékeket tartalmazó H={0,1} alaphalmaz a fenti tulajdonságokkal rendelkező három logikai alapművelettel ún. Boole-algebrát alkot. (A (H; ∧, ∨) disztributív háló zéruseleme a ⊥ szabvány-hamis elem, egységeleme a ⊤ szabvány-igaz elem; a 0 elem tagadása ("komplementuma") az 1 elem, az 1 elem tagadása pedig a 0 elem.)
Gyakorló feladatok
Igazolja értéktáblázattal és azonos átalakítások segítségével az alábbi logikai azonosságokat, ill. törvényeket! Írassa ki a logikai kifejezések értéktáblázatát JavaScript programok segítségével is!⇒
Jelölések:
(1) Ha egy 'p' formula "azonosan igaz", vagyis tautológia, ill. logikai törvény, ezt
⊨ p
módon jelöljük. Ha a 'p' formula logikai törvény, akkor
p = ⊤
teljesül.
(2) Ha egy művelet után a '.' (pont) operátor szerepel, akkor az adott kifejezésben a ponttal jelölt műveletet utoljára kell végrehajtani. A pont operátor mindig helyettesíthető a kijelölt művelet elé és után írt zárójelekkel. Ennek megfelelően például a
q∧r∨.p∧q
kifejezés ekvivalens a
(q∧r)∨(p∧q)
kifejezéssel.
(3) A kizáró vagy műveletét (A⨁B) helyettesíthetjük a vele ekvivalens
(A∧⌝B)∨(⌝A∧B)
kifejezéssel.⇒
(4) Az implikáció műveletét (A⊃B) helyettesíthetjük a vele ekvivalens
⌝A∨B
kifejezéssel.⇒
(4) Az ekvivalencia műveletét (A≡B) szintén helyettesíthetjük a vele ekvivalens
(A∧B)∨(⌝A∧⌝B)
kifejezéssel.⇒
(a) p∧(p⊃q) = p∧q
Induljunk ki a bizonyítandó azonosság bal oldalából. Célunk az, hogy a korábbi logikai azonosságokat⇒ felhasználva olyan azonos átalakításokat végezzünk, amelynek végén eljutunk a bizonyítandó azonosság jobb oldalán szereplő logikai kifejezéshez:
p∧(p⊃q) = (implikáció helyettesítése)
p∧(⌝p∨q) =
(p∧⌝p)∨(p∧q) =
⊥∨(p∧q) =
p∧q (q.e.d)
(b) ⌝p∨(p∧q) = p⊃q
(c) q⊃(p∧q) = q⊃p
(d) p∧(⌝p⊃q) = p
(e) p∨⌝(p⊃q) = p
(f) (p⊃q)⊃p = p
(g) ⊨ ⌝p⊃(p⊃q) (ennek a logikai törvénynek a jelentése az, hogy "az ellentmondásból bármi következik", vö. Dragálin-Buzási 1986: 88)
Induljunk ki a bizonyítandó logikai törvényből. Célunk az, hogy a korábbi logikai azonosságokat⇒ felhasználva olyan azonos átalakításokat végezzünk, amelynek végén eljutunk a "szabvány igaz" (⊤)⇒ kijelentéshez:
⌝p⊃(p⊃q) = (→ implikáció kifejezése)
⌝p⊃(⌝p∨q) = (→ implikáció kifejezése)
⌝⌝p∨(⌝p∨q) = (→ kettős tagadás)
p∨(⌝p∨q) = (→ asszociativitás)
(p∨⌝p)∨q = (→ kizárt harmadik törvénye⇒)
⊤∨q = (→ diszjunkció szabvány-igaz kijelentéssel)
⊤ (q.e.d.)
(h) ⊨ p⊃(q⊃p)
(i) ⊨ p⊃(q⊃.p∧q)
(j) ⊨ p∧(p⊃q)⊃.q
(k) ⊨ (p⊃q)∧⌝q⊃.⌝p
(l) A⨁B⨁C
=
(⌝A∧B∧⌝C) ∨ (A∧⌝B∧⌝C) ∨
(⌝A∧⌝B∧C) ∨
(A∧B∧C)
(A fenti kifejezés az egybites teljes összeadó⇒ által szolgáltatott összeget adja meg.)
(m) (A∧B∧C) ∨
(⌝A∧B∧C) ∨
(A∧⌝B∧C) ∨
(A∧B∧⌝C)
=
(A∧B) ∨ (A∧C) ∨ (B∧C)
(A fenti kifejezés az egybites teljes összeadó⇒ által szolgáltatott átvitelt adja meg.)
(Megjegyzés: mivel az egyszerűsítendő kifejezés t.d.n.f. alakban⇒ van, a levezetés a Karnaugh-tábla⇒ alapján könnyen megkapható.⇒)
(n) (A∧C) ∨ (B∧⌝C) ∨ (A∧B) = (A∧C) ∨ (B∧⌝C)
Használjuk fel a felbontás⇒ azonosságát, majd alkalmazzuk kétszer az abszorpció⇒ azonosságát:
(A∧C) ∨ (B∧⌝C) ∨ (A∧B)=
(A∧C) ∨ (B∧⌝C) ∨ (A∧B∧C) ∨ (A∧B∧⌝C)=
(A∧C) ∨ (A∧C∧B)
∨
(B∧⌝C) ∨ (B∧⌝C∧A)=
(A∧C) ∨ (B∧⌝C)
(q.e.d.)
(o) ⊨ A≡B ⊃. (A⊃B)∧(B⊃A)
Induljunk ki a bizonyítandó logikai törvényből. Célunk most is az, hogy a korábbi logikai azonosságokat⇒ felhasználva olyan azonos átalakításokat végezzünk, amelynek végén eljutunk a "szabvány igaz" (⊤)⇒ kijelentéshez:
A≡B ⊃. (A⊃B)∧(B⊃A)
=
(A∧B)∨(⌝A∧⌝B) ⊃. (A⊃B)∧(B⊃A)
=
(A∧B)∨(⌝A∧⌝B) ⊃. (⌝A∨B)∧(⌝B∨A)
=
⌝[(A∧B)∨(⌝A∧⌝B)] ∨. (⌝A∨B)∧(⌝B∨A)
=
⌝(A∧B)∧⌝(⌝A∧⌝B) ∨. (⌝A∨B)∧(⌝B∨A)
=
(⌝A∨⌝B)∧(⌝⌝A∨⌝⌝B) ∨. (⌝A∨B)∧(⌝B∨A)
=
(⌝A∨⌝B)∧(A∨B) ∨. (⌝A∨B)∧(⌝B∨A)
=
az ∨. operátor mindkét oldalán alkalmazzuk a disztributivitás⇒ azonosságát:
(⌝A∧A)∨(⌝A∧B)∨(⌝B∧A)∨(⌝B∧B)
∨.
(⌝A∧⌝B)∨(⌝A∧A)∨(B∧⌝B)∨(B∧A)
=
(⌝A∧B)∨(⌝B∧A)∨(⌝A∧⌝B)∨(B∧A)
=
(⌝A∧B)∨(⌝A∧⌝B)
∨.
(⌝B∧A)∨(B∧A)
=
(⌝A∧B)∨(⌝A∧⌝B)
∨.
(⌝B∧A)∨(B∧A)
=
⌝A∧(B∨⌝B)
∨.
(⌝B∨B)∧A
=
⌝A∨A
=
⊤ (q.e.d.)
Példák logikai függvények kifejezésére
A logikai alapműveletek (negáció, konjunkció és diszjunkció) segítségével minden logikai függvény kifejezhető. Az alapműveleteknek ezt a tulajdonságát úgy fejezzük ki, hogy a NOT, AND és OR logikai függvények funkcionálisan teljes rendszert alkotnak.
A kapuáramkörök technológiai megvalósítása szempontjából lényeges, hogy mind a NAND logikai függvény, mind pedig a NOR logikai függvény egymagában is teljes rendszert alkot.
A NAND művelet A NAND B:{0,1}Χ{0,1}→{0,1} módon leírható kétváltozós logikai függvény. Definíció szerint
A NAND B ⇋ ⌝(A∧B)
teljesül, tehát igazságtáblázata a következő:
NAND A B ⌝(A∧B) 0 0 1 0 1 1 1 0 1 1 1 0 A NOR művelet A NOR B:{0,1}Χ{0,1}→{0,1} módon leírható kétváltozós logikai függvény. Definíció szerint
A NOR B ⇋ ⌝(A∨B)
teljesül, tehát igazságtáblázata a következő:
NOR A B ⌝(A∨B) 0 0 1 0 1 0 1 0 0 1 1 0 Legyenek A és B logikai változók; ekkor az alapműveletek kifejezhetők a NAND és NOR műveletek segítségével:
- [NAND]
- ⌝A = ⌝(A∧A) = A NAND A
- A∧B = ⌝(⌝(A∧B)) = ⌝(⌝(A∧B)∧⌝(A∧B)) = (A NAND B) NAND (A NAND B)
- A∨B = ⌝(⌝(A∨B)) = ⌝(⌝A∧⌝B) = (A NAND A) NAND (B NAND B)
- [NOR]
- ⌝A = ⌝(A∨A) = A NOR A
- A∧B = ⌝(⌝(A∧B)) = ⌝(⌝A∨⌝B) = (A NOR A) NOR (B NOR B)
- A∨B = ⌝(⌝(A∨B)) = ⌝(⌝(A∨B)∨⌝(A∨B)) = (A NOR B) NOR (A NOR B)
A továbbiakban az egyszerűség kedvéért a korábban bevezetett három alapműveletet (NOT, AND és OR) fogjuk használni. Ezek funkcionálisan teljes rendszert alkotnak, vagyis bármilyen logikai függvény kifejezhető a segítségükkel. Nézzük meg, hogyan.
Állítsuk elő a p(A,B,C) három változós logikai függvényt az igazságtáblázata segítségével:
(frissítés: CRTL R) A B C p(A,B,C) A fenti igazságtáblázatban megadott p(A,B,C) logikai függvény egyik lehetséges előállítása a logikai alapműveletek segítségével a következőképpen lehetséges:
p(A,B,C) =
A p(A,B,C) logikai függvény fenti előállítását a függvény teljes diszjunktív normálformájának (t.d.n.f.) nevezzük.
Általánosítva a fenti alakot, az igazságtáblázattal megadott három változós
p(A,B,C)
függvény teljes diszjunktív normálformáját (t.d.n.f.) a függvény igazságtáblázatából a következőképpen állíthatjuk elő:(0) A táblázat első három oszlopában szereplő A, B és C logikai változók bármelyikét jelöljük X-szel.
(1) A táblázat minden sorának, amelyben a p(A,B,C) függvény értéke 1 (azaz a táblázat jobb szélső oszlopában 1 szerepel), megfeleltetünk egy ún. elemi konjunkciót, amelyet az alábbi tényezők konjunkciójaként állítunk elő:
– az elemi konjunkció tényezője lesz a függvény minden olyan X logikai változója, amelynek az (adott sornak megfelelő) oszlopában 1 található, és
– az elemi konjunkció tényezője lesz a függvény minden olyan X logikai változójának ⌝X negáltja, amelynek (az adott sornak megfelelő) oszlopában 0 található.
(2) A p(A,B,C) függvény t.d.n.f. előállítását a fenti módon előállított elemi konjunkciók diszjunkciója adja.Összefoglalva:
(1.a) Minden elemi konjunkció X∧Y∧Z alakú, ahol
X vagy A vagy ⌝A,
Y vagy B vagy ⌝B,
Z vagy C vagy ⌝C,
attól függően, hogy az A, B és C logikai változók oszlopában 1 vagy 0 logikai érték szerepel.
(1.b) Annyi elemi konjunkció van, ahány 1 érték szerepel a p(A,B,C) függvény értékeinek az oszlopában (azaz az igazságtáblázat utolsó, jobb szélső oszlopában).
(2) A keresett t.f.n.f. alakot az elemi konjunkciók diszjunkciója adja.Szemléletesen megfogalmazva:
– egy logikai függvény értéke akkor és csak akkor igaz, ha t.d.n.f. alakjában van olyan elemi konjunkció, amelyik igaz;
– egy elemi konjunkció pedig akkor és csak akkor igaz, ha minden tényezője igaz.Megjegyzések:
– Az elemi konjunkciók egy másik szokásos elnevezése minterm.
– A mintermekben nem negált alakban előforduló logikai változók ún. ponált alakban fordulnak elő. Ennek megfelelően egy mintermben minden logikai változónak elő kell fordulnia vagy ponált, vagy negált alakban.
A logikai függvények t.d.n.f. alakját a legtöbb esetben algebrai átalakításokkal egyszerűbb alakra hozhatjuk, felhasználva a logikai műveletek alaptulajdonságait.⇒ Tipikus példa erre az ún. szomszédos mintermek vagy általánosan a szomszédos termek egyszerűsítése.
- Szomszédosnak nevezünk két mintermet, ha azok csak egy változóban különböznek, azaz
– a termeket megkülönböztető változó az egyik mintermben ponált, a másikban negált alakban fordul elő, és
– az összes többi változó a mintermekben azonos alakban szerepel (ti. vagy csak ponált, vagy csak negált alakban).Ha például a t.d.n.f. alakban a ... ∨ (⌝A∧⌝B∧⌝C) ∨ (⌝A∧B∧⌝C) ∨ ... kifejezés fordul elő, akkor először is vegyük észre, hogy az A és B logikai változók sorrendjétől eltekintve a (⌝A∧⌝C) konjunktív kifejezés az egymással diszjunkcióban levő mindkét mintermben előfordul, miközben a termeket egymástól kizárólag a 'B' változó különbözteti meg. A mindkét mintermben előforduló közös konjunktív kifejezést kiemelve a kifejezést átalakíthatjuk a következőképpen:
... ∨ (⌝A∧⌝B∧⌝C) ∨ (⌝A∧B∧⌝C) ∨ ...=
... ∨ [(⌝A∧⌝C) ∧ (⌝B∨B)] ∨ ...=
... ∨ [(⌝A∧⌝C) ∧ ⊤] ∨ ...=
... ∨ (⌝A∧⌝C) ∨ ...
Ez nyilvánvaló egyszerűsítést jelent, mivel a kiindulásként adott két szomszédos mintermből kiiktattuk a 'B' változót. Vegyük észre, hogy a kifejezés már az első lépés után is egyszerűsödött, mivel az eredeti kifejezésben öt AND-OR művelet, az átalakított kifejezésben viszont már csak három AND-OR művelet szerepelt. A 'B' megkülönböztető változó eltűnése után kapott egyszerűsített kifejezés pedig már csak egy AND műveletet tartalmazott.A szomszédos mintermek egyszerűsíthetők a bennük közösen előforduló változók vagy konjunktív kifejezések kiemelésével, ami a termeket egymástól megkülönböztető változó eltűnéséhez vezet.Egy t.d.n.f. alakban levő formula esetében az egyszerűsítés során
- minden termet fel kell használnunk;
- egy termet több egyszerűsítésben is felhasználhatunk;
- ha egy term nem vonható össze más termekkel, akkor változtatás nélkül le kell írnunk.
A szomszédos mintermek grafikus megjelenítésére szolgálnak az ún. Karnaugh-táblák. Ennek megjelenítéséhez rendezzük át a korábbi igazságtáblázatot⇒ a következőképpen:
(megjelenített formula⇒) A B C 0 1 A táblázatban csak a megjelenített formula mintermjeit tüntetjük fel. (Jegyezzük meg, hogy az "eredeti" Karnaugh-táblákban nem a mintermek szerepelnek, hanem helyettük egyszerűen 1 értékek.)
A Karnaugh-táblákban a szomszédos mintermek háromféleképpen jelenhetnek meg:
- a vízszintesen szomszédos (egymás mellett levő) mintermekből a 'C' logikai változó kiiktatható
- a függőlegesen szomszédos (egymás alatt levő) mintermekből vagy az 'A' vagy a 'B' logikai változó kiiktatható
- ha az egymás alatt levő sorokban az 'A' változó értéke különböző, az 'A' iktatható ki
- ha az egymás alatt levő sorokban a 'B' változó értéke különböző, a 'B' iktatható ki
- az első és az utolsó sorban és azonos oszlopban szereplő mintermek szintén szomszédosak; ezekből vagy az 'A' vagy a 'B' logikai változó kiiktatható
- ha az első és az utolsó sorban az 'A' változó értéke különböző, az 'A' iktatható ki
- ha első és az utolsó sorban a 'B' változó értéke különböző, a 'B' iktatható ki
Ha több formula esetén is kipróbáljuk az egyszerűsítést, észrevehetjük, hogy a Karnaugh-tábla alapján a megjelenített formula rendszerint többféleképpen is egyszerűsíthető.
Ha a táblázatban két-két szomszédos cellának van közös oldala, akkor az egyszerűsített mintermek maguk is tovább egyszerűsíthetők, azaz ilyen esetekben két logikai változó is kiiktatható. Például az alábbi Karnaugh-tábla alapján az
p(A,B,C) =
(⌝A∧B∧⌝C) ∨ (⌝A∧B∧C) ∨ (A∧B∧⌝C) ∨ (A∧B∧C) =
(⌝A∧B) ∨ (A∧B) =
B
egyszerűsítés hajtható végre.Ha a Karnaugh-táblában a szomszédos mintermek átfedik egymást, mindkettő alapján egyszerűsíthetünk. Például tekintsük az alábbi Karnaugh-táblázatot:
p(A,B,C) =
(⌝A∧⌝B∧C) ∨ (⌝A∧B∧⌝C) ∨ (⌝A∧B∧C) =
(⌝A∧⌝B∧C) ∨ (⌝A∧B∧C) ∨ (⌝A∧B∧⌝C) ∨ (⌝A∧B∧C) =
(⌝A∧C) ∨ (⌝A∧B)
Figyeljük meg, hogy a (⌝A∧B∧C) mintermet megkettőztük (amit a logikai 'vagy' művelet idempotenciája alapján megtehetünk).Próbáljunk meg néhány t.d.n.f. alakú kifejezést egyszerűsíteni az alábbi, interaktívan kitölthető Karnaugh-tábla segítségével. Az egyszerűsítendő logikai függvény mintermjeinek megadásához kattintsunk a megfelelő cellára (egy megjelenített minterm eltüntetéséhez pedig a megfelelő mintermre kattintsunk):
Karnaugh-tábla A B C 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 Ha például a táblázatban kijelölt celláknak megfelelő logikai függvény
p(A,B,C) = (A∧B∧C) ∨ (⌝A∧B∧C) ∨ (A∧⌝B∧C) ∨ (A∧B∧⌝C)
alakú, akkor először jelenítsük meg a függvény mintermjeit a fenti Karnaugh-táblában, majd alakítsuk át a p(A,B,C) logikai függvényt a megfelelő változók kiiktatásával.
(1) Először adjuk a kifejezéshez még kétszer hozzá az (A∧B∧C) kifejezést, mivel a Karnaugh-táblában három "szomszédja" is van (ezt megtehetjük az ∨ művelet idempotenciája miatt, ugyanis A~A∨A tetszőleges 'A' logikai kifejezés esetén igaz):
p(A,B,C) =
(A∧B∧C) ∨ (⌝A∧B∧C) ∨
(A∧B∧C) ∨ (A∧⌝B∧C) ∨
(A∧B∧C) ∨ (A∧B∧⌝C)(2) Ezután iktassuk ki a megfelelő kifejezések kiemelésével először az 'A', majd a 'B', és végül a 'C' változókat:
p(A,B,C) = (B∧C) ∨ (A∧C) ∨ (A∧B)(3) Végül rendezzük át a kifejezést:
p(A,B,C) = (A∧B) ∨ (A∧C) ∨ (B∧C)Az így kapott kifejezés a p(A,B,C) logikai függvény legegyszerűbb alakja.
Ha egy logikai kifejezést logikai kapuáramkörök segítségével akarunk megvalósítani, a kifejezés egyszerűsítése lehetővé teszi, hogy kevesebb áramkört kelljen használnunk.Végül ellenőrizzük egy JavaScript program segítségével, hogy a logikai függvény teljes (t.d.n.f.) és egyszerűsített alakja megegyezik:
// egy P(A,B,C) logikai függvény t.d.n.f. (F) és egyszerűsített (G) alakjának igazságtáblázata function neg(x) { var a=Boolean(x); var c=!a; return Number(c); } function kon(x,y) { var a=Boolean(x), b=Boolean(y); var c=a && b; return Number(c); } function dis(x,y) { var a=Boolean(x), b=Boolean(y); var c=a || b; return Number(c); } writeln("A"+" "+"B"+" "+"C"+" "+"F"+" "+"G"); writeln("---------"); for(i=0;i<=1;i++) { for(j=0;j<=1;j++) { for(k=0;k<=1;k++) { var t1=kon(i,j); t1=kon(t1,k); var t2=kon(neg(i),j); t2=kon(t2,k); var t3=kon(i,neg(j)); t3=kon(t3,k); var t4=kon(i,j); t4=kon(t4,neg(k)); var f=dis(t1,t2); f=dis(f,t3); f=dis(f,t4); var u1=kon(i,j); var u2=kon(i,k); var u3=kon(j,k); var g=dis(u1,u2); g=dis(g,u3); writeln(i+" " +j+" "+k+" "+f+" "+g); } } } writeln("---------");A program által előállított igazságtáblázatban az 'F' és 'G' oszlopok értéke minden sorban megegyezik, tehát a megadott p(A,B,C) logikai függvény teljes (t.d.n.f.) és egyszerűsített alakja megegyezik.