verzija: SageMath 9.4
load('logika.sage')
bool(True)
bool(False)
bool(2)
bool([])
bool(0)
bool([0])
bool([1,0,3])
list(map(lambda x: bool(x),[1,0,3]))
Možemo definirati svoju funkciju bul koja će se ponašati kao i funkcija bool, samo što će umjesto vrijednosti True i False vraćati vrijednosti 1 i 0.
def bul(x):
if bool(x)==True:
return 1
else:
return 0
bul(True)
bul(False)
bul(2)
bul([])
bul(0)
bul([0])
bul([1,0,3])
list(map(lambda x: bul(x),[1,0,3]))
not(True)
not(False)
not(3)
not([])
not([0])
not(0)
True and False
True & False
1 & 0
1 and 0
False or True
False | True
0 | 1
0 or 1
def implikacija(x,y):
return not(x) or y
implikacija(True,False)
implikacija(1,0)
implikacija(0,0)
implikacija(False,False)
def ekvivalencija(x,y):
return (not(x) or y) and (not(y) or x)
ekvivalencija(False,True)
ekvivalencija(True,True)
ekvivalencija(0,1)
ekvivalencija(1,1)
def NOR(x,y):
return not(x or y)
NOR(True,False)
NOR(False,False)
NOR(1,0)
NOR(0,0)
def NAND(x,y):
return not(x and y)
NAND(True,False)
NAND(True,True)
NAND(1,0)
NAND(1,1)
def xor(x,y):
return (x and not(y)) or (not(x) and y)
xor(True,False)
xor(True,True)
xor(1,0)
xor(1,1)
import sage.logic.propcalc as logika
import sage.logic.logicparser as logikapar
formula1=logika.formula('a&b')
formula1
formula1.truthtable()
logika.formula('a&b').truthtable()
logika.formula('a|b')
logika.formula('a|b').truthtable()
logika.formula('~a')
logika.formula('~a').truthtable()
logika.formula('a->b')
logika.formula('a->b').truthtable()
logika.formula('a<->b')
logika.formula('a<->b').truthtable()
logika.formula('~(a|b)')
logika.formula('~(a|b)').truthtable()
logika.formula('~(a&b)')
logika.formula('~(a&b)').truthtable()
logika.formula('a^b')
logika.formula('a^b').truthtable()
Primjer
Semantička tablica formule $F(x,y,z)=\big(\overline{y}\wedge z\big)\Leftrightarrow\big((x\Rightarrow y)\vee z\big)$.
semanticka_tablica('((~y)&z)<->((x->y)|z)')
semanticka_tablica('((~y)&z)<->((x->y)|z)',izlaz="rjecnik")
semanticka_tablica('((~y)&z)<->((x->y)|z)',izlaz="html")
Primjer
Semantička tablica formule $F(a,b,c,d)=\big((a\Rightarrow b)\wedge(b\Rightarrow c)\big)\Rightarrow(a\Leftrightarrow d)$.
semanticka_tablica('((a->b)&(b->c))->(a<->d)')
semanticka_tablica('((a->b)&(b->c))->(a<->d)',izlaz="rjecnik")
semanticka_tablica('((a->b)&(b->c))->(a<->d)',izlaz="html")
Primjer (De Morganovi zakoni)
Provjerimo da vrijede De Morganovi zakoni: $\overline{a\vee b}=\overline{a}\wedge\overline{b}$, $\overline{a\wedge b}=\overline{a}\vee\overline{b}$.
tablica_istinitosti(['~(a|b)','(~a)&(~b)'])
tablica_istinitosti(['~(a&b)','(~a)|(~b)'],izlaz='html')
Primjer (Distributivnost konjunkcije u odnosu na disjunkciju)
$a\wedge\big(b\vee c\big)=\big(a\wedge b\big)\vee\big(a\wedge c\big)$
tablica_istinitosti(['a&(b|c)','(a&b)|(a&c)'])
tablica_istinitosti(['a&(b|c)','(a&b)|(a&c)'],izlaz="html")
Primjer (Distributivnost disjunkcije u odnosu na konjunkciju)
$a\vee\big(b\wedge c\big)=\big(a\vee b\big)\wedge\big(a\vee c\big)$
tablica_istinitosti(['a|(b&c)','(a|b)&(a|c)'])
tablica_istinitosti(['a|(b&c)','(a|b)&(a|c)'],izlaz="html")
tablica_istinitosti(['~a'])
tablica_istinitosti(['~a'],izlaz='html')
tablica_istinitosti(['a&b'])
tablica_istinitosti(['a&b'],izlaz='html')
tablica_istinitosti(['a|b'])
tablica_istinitosti(['a|b'],izlaz='html')
tablica_istinitosti(['a->b'])
tablica_istinitosti(['a->b'],izlaz='html')
tablica_istinitosti(['a<->b'])
tablica_istinitosti(['a<->b'],izlaz='html')
tablica_istinitosti(['~(a|b)'])
tablica_istinitosti(['~(a|b)'],izlaz='html')
tablica_istinitosti(['~(a&b)'])
tablica_istinitosti(['~(a&b)'],izlaz='html')
tablica_istinitosti(['(a&(~b))|((~a)&b)'])
tablica_istinitosti(['(a&(~b))|((~a)&b)'],izlaz='html')
4+7==10
is_even(8)
is_odd(8)
sqrt(15) in QQ
is_prime(2)
2 in Primes()
(3<2) & (2>1)
(3<2) and (2>1)
(3<2) | (2>1)
(3<2) or (2>1)
implikacija(3<2,2>1)
implikacija(2>1,3<2)
ekvivalencija(3<2,2>1)
implikacija((pi in QQ) or (5^2==25),5^2==20)
implikacija((pi in QQ) and (5^2==25),5^2==20)
implikacija(Mod(6,3)!=0,is_even(6))
implikacija(2<3,is_prime(2) and is_odd(3))
implikacija(2<3,(2 in Primes()) and is_odd(3))
f1=logika.formula('a->(a|b)')
f1.is_tautology()
tablica_istinitosti(['a->(a|b)'])
tablica_istinitosti(['a->(a|b)'],izlaz='html')
f2=logika.formula('(a&(a->b))->b')
f2.is_tautology()
tablica_istinitosti(['(a&(a->b))->b'])
tablica_istinitosti(['(a&(a->b))->b'],izlaz='html')
f3=logika.formula('((a->b)&(~b))->(~a)')
f3.is_tautology()
tablica_istinitosti(['((a->b)&(~b))->(~a)'])
tablica_istinitosti(['((a->b)&(~b))->(~a)'],izlaz='html')
f4=logika.formula('((~a)&(a|b))->b')
f4.is_tautology()
tablica_istinitosti(['((~a)&(a|b))->b'])
tablica_istinitosti(['((~a)&(a|b))->b'],izlaz='html')
f5=logika.formula('((a->b)&(b->c))->(a->c)')
f5.is_tautology()
tablica_istinitosti(['((a->b)&(b->c))->(a->c)'])
tablica_istinitosti(['((a->b)&(b->c))->(a->c)'],izlaz='html')
Zadatak
Jesu li konjunkcije $k_1=x\wedge y\wedge\overline{z}$ i $k_2=x\wedge\overline{y}\wedge\overline{z}$ bazične konjunkcije formule $F(x,y,z)=\big((x\vee y)\wedge z\big)\Leftrightarrow\overline{x\wedge\overline{y}}$ ?
Rješenje. Uočimo da je $k_i$ bazična konjunkcija formule $F$ ako i samo ako je $k_i\Rightarrow F$ tautologija.
k1=logika.formula('x&y&(~z)')
k2=logika.formula('x&(~y)&(~z)')
F=logika.formula('((x|y)&z)<->(~(x&(~y)))')
$k_1$ nije bazična konjunkcija formule $F$
k1.ifthen(F).is_tautology()
k1.add_statement(F,'->').is_tautology()
$k_2$ jest bazična konjunkcija formule $F$
k2.ifthen(F).is_tautology()
k2.add_statement(F,'->').is_tautology()
Zadatak
Jesu li disjunkcije $d_1=\overline{x}\vee\overline{y}\vee z$ i $d_2=x\vee\overline{y}\vee\overline{z}$ bazične disjunkcije formule
Rješenje. Uočimo da je $d_i$ bazična disjunkcija formule $F$ ako i samo ako je $F\Rightarrow d_i$ tautologija.
d1=logika.formula('(~x)|(~y)|z')
d2=logika.formula('x|(~y)|(~z)')
F=logika.formula('(y->(((~x)|y)&z))<->(x->((~z)&y))')
$d_1$ jest bazična disjunkcija formule $F$
F.ifthen(d1).is_tautology()
F.add_statement(d1,'->').is_tautology()
$d_2$ nije bazična disjunkcija formule $F$
F.ifthen(d2).is_tautology()
F.add_statement(d2,'->').is_tautology()
Primjer
Disjunktivna i konjunktivna normalna forma funkcije $F(x,y,z)=\big((\overline{x}\vee z)\Leftrightarrow y\big)\Rightarrow\big(\overline{z}\Rightarrow(y\wedge z)\big)$ i njihove minimizacije.
DNF('((~x|z)<->y)->(~z->(y&z))')
CNF('((~x|z)<->y)->(~z->(y&z))')
minDNF('((~x|z)<->y)->(~z->(y&z))')
minCNF('((~x|z)<->y)->(~z->(y&z))')
Primjer
Disjunktivna i konjunktivna normalna forma funkcije $F(x,y,z)=\big((x\wedge\overline{y})\vee z\big)\Leftrightarrow\big((y\wedge z)\Rightarrow(\overline{x}\wedge{y})\big)$ i njihove minimizacije.
DNF('((x&~y)|z)<->((y&z)->(~x&y))')
CNF('((x&~y)|z)<->((y&z)->(~x&y))')
minDNF('((x&~y)|z)<->((y&z)->(~x&y))')
minCNF('((x&~y)|z)<->((y&z)->(~x&y))')
provjera preko tablice istinitosti
tablica_istinitosti(['(~x&z)|(x&~y)','(~x|~y)&(x|z)','((x&~y)|z)<->((y&z)->(~x&y))'])
tablica_istinitosti(['(~x&z)|(x&~y)','(~x|~y)&(x|z)','((x&~y)|z)<->((y&z)->(~x&y))'],izlaz='html')
Primjer
Disjunktivna i konjunktivna normalna forma funkcije $F(x,y,z)=\big((\overline{y}\wedge z)\Rightarrow(x\wedge\overline{z})\big)\Leftrightarrow\big(y\wedge(\overline{x}\vee z)\big)$ i njihove minimizacije.
DNF('((~y&z)->(x&~z))<->(y&(~x|z))')
CNF('((~y&z)->(x&~z))<->(y&(~x|z))')
minDNF('((~y&z)->(x&~z))<->(y&(~x|z))')
minCNF('((~y&z)->(x&~z))<->(y&(~x|z))')
Zadatak
Za formulu $F(x,y,z)=\big(\overline{y}\wedge z\big)\Leftrightarrow\big((x\Rightarrow y)\vee z\big)$ izradite semantičku tablicu, odredite disjunktivnu i konjunktivnu normalnu formu i minimizirajte formulu $F$.
F='((~y)&z)<->((x->y)|z)'
semanticka_tablica(F)
semanticka_tablica(F,izlaz='html')
DNF(F)
CNF(F)
minDNF(F)
minCNF(F)