z3
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| z3 [2025/02/10 12:27] – kresimir | z3 [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====Z3 solver==== | ====Z3 solver==== | ||
| - | Z3 solver je alat napravljen za dokazivanje teorema koji je razvio | + | //Z3 solver// je alat napravljen za dokazivanje teorema, a koji je razvio |
| - | Njegova namjena je da može odrediti je li skup zadanih logičkih pretpostavki zadovoljiv, te u slučaju da je, nalazi rješenje koje zadovoljava definirani skup. Ima mnoge primjene u području računarstva, | + | Njegova namjena je da može odrediti je li skup zadanih logičkih pretpostavki zadovoljiv, te u slučaju da je, nalazi rješenje koje zadovoljava definirani skup. Ima mnoge primjene u području računarstva, |
| - | Za korištenje Z3 nije potrebno detaljno poznavati teoriju i implementaciju, | + | Za korištenje Z3 nije potrebno detaljno poznavati teoriju i implementaciju, |
| ===Python bilioteka za korištenje Z3=== | ===Python bilioteka za korištenje Z3=== | ||
| Line 10: | Line 10: | ||
| https:// | https:// | ||
| u kojemu su dostupne upute za instalaciju i korištenje, | u kojemu su dostupne upute za instalaciju i korištenje, | ||
| - | ¸¸ | + | < |
| pip install z3-solver | pip install z3-solver | ||
| - | ¸¸ | + | </ |
| Za korištenje u jednostavnijim slučajevima, | Za korištenje u jednostavnijim slučajevima, | ||
| - | Osnovne upotrebe | + | ===Osnovne upotrebe=== |
| - | Definicija varijabli | + | ==Definicija varijabli== |
| - | Nakon stvaranja nove .py datoteke, instalirani pip paket se može koristiti | + | Nakon stvaranja nove .py datoteke, instalirani pip paket se može koristiti naredbom |
| - | ¸¸ | + | < |
| from z3 import * | from z3 import * | ||
| - | ¸¸ | + | </ |
| - | Za inicijalizaciju objekta solver, kojem će se proslijediti definirane varijable i uvjeti za definiciju i rješavanje problema se koristi naredba: | + | Za inicijalizaciju objekta |
| - | ¸¸ | + | < |
| solver = Solver() | solver = Solver() | ||
| - | ¸¸ | + | </ |
| Varijable koje Z3 koristi se inicijaliziraju definiranjem tipa podataka koji sadrže, kao u C-u. npr. za definiranje x varijable koja je integer se koristi naredba: | Varijable koje Z3 koristi se inicijaliziraju definiranjem tipa podataka koji sadrže, kao u C-u. npr. za definiranje x varijable koja je integer se koristi naredba: | ||
| - | ¸¸ | + | < |
| x = Int(' | x = Int(' | ||
| - | ¸¸ | + | </ |
| Za definiranje s varijable koja je tipa string se koristi naredba: | Za definiranje s varijable koja je tipa string se koristi naredba: | ||
| - | ¸¸ | + | < |
| s = String(' | s = String(' | ||
| - | ¸¸ | + | </ |
| Za definiranje varijable koja predstavlja jedan bit se koristi naredba: | Za definiranje varijable koja predstavlja jedan bit se koristi naredba: | ||
| - | ¸¸ | + | < |
| bitA = BitVec(' | bitA = BitVec(' | ||
| - | ¸¸ | + | </ |
| - | Osim integer, string i bit tipova, Z3 podržava još mnoge druge tipove varijabli, od kojih su neki osnovni: boolean, bajt (izveden kao polje od 8 bitova), realni brojevi, float brojevi i drugi. Od ovih osnovnih tipova se mogu graditi složeniji tipovi, kao enumeracije, | + | Osim tipova |
| - | ¸¸ | + | < |
| byte1 = BitVec(' | byte1 = BitVec(' | ||
| - | ¸¸ | + | </ |
| + | |||
| + | |||
| + | ==Definicija ograničenja (uvjeta)== | ||
| - | Iz prethodnih naredbi može se uočiti da jest string argument u inicijalizaciji osnovnih tipova, odnosno prvi argument u inicijalizaciji vektorskih tipova ime varijable koja se definira u kontekstu Z3 rješavatelj objekta. Ova varijabla je proizvoljna i najčešće je istog naziva kao i Python varijabla ili neka izvedenica naziva Python varijable koja se koristi. | ||
| - | Drugi argument u naredbi inicijalizacije vektora je dužina vektora, koja je 8 u definiranju bajta kao bit vektora dužine 8. Također mogu se koristiti i druge dužine za definiranje bit vektora. | ||
| - | Definicija ograničenja (uvjeta) | ||
| Nakon što je solver objekt inicijaliziran i varijable su definirane, ograničenja i uvjeti se mogu dodavati naredbom: | Nakon što je solver objekt inicijaliziran i varijable su definirane, ograničenja i uvjeti se mogu dodavati naredbom: | ||
| - | ¸¸ | + | < |
| solver.add(< | solver.add(< | ||
| - | ¸¸ | + | </ |
| Tako bi se za sljedeći skup ograničenja nad x i y int varijablama: | Tako bi se za sljedeći skup ograničenja nad x i y int varijablama: | ||
| x + y = 106, | x + y = 106, | ||
| Line 58: | Line 58: | ||
| y % 7 = 0 | y % 7 = 0 | ||
| koristile sljedeće naredbe za postavljanje ograničenja modela: | koristile sljedeće naredbe za postavljanje ograničenja modela: | ||
| - | ¸¸ | + | < |
| - | solver .add(x + y == 106) | + | solver.add(x + y == 106) |
| - | solver .add(x - y > -111) | + | solver.add(x - y > -111) |
| - | solver .add(y / x > 10) | + | solver.add(y / x > 10) |
| - | solver .add(x < 50) | + | solver.add(x < 50) |
| - | solver .add(y > 19) | + | solver.add(y > 19) |
| - | solver .add(y % 7 == 0) | + | solver.add(y % 7 == 0) |
| - | ¸¸ | + | </ |
| Vidimo da je zapis vrlo jednostavan, | Vidimo da je zapis vrlo jednostavan, | ||
| - | Pokretanje rješavanja definiranog problema | + | ==Pokretanje rješavanja definiranog problema== |
| - | Kako bi se pokrenulo rješavanje problema i provjerilo postoji li model koji može zadovoljiti | + | Kako bi se pokrenulo rješavanje problema i provjerilo postoji li model koji može zadovoljiti |
| - | ¸¸ | + | < |
| solver.check() | solver.check() | ||
| - | ¸¸ | + | </ |
| Koja vraća vrijednost „sat“ za satisfiable ako ima rješenja ili vrijednost „unsat“ za unsatisfiable ako nema rješenja. | Koja vraća vrijednost „sat“ za satisfiable ako ima rješenja ili vrijednost „unsat“ za unsatisfiable ako nema rješenja. | ||
| Ako je problem rješiv, naredba za generiranje modela koji zadovoljava postavljene uvjete je sljedeća: | Ako je problem rješiv, naredba za generiranje modela koji zadovoljava postavljene uvjete je sljedeća: | ||
| - | ¸¸ | + | < |
| model = solver.model() | model = solver.model() | ||
| - | ¸¸ | + | </ |
| - | Nakon toga se može napraviti | + | Nakon toga se može napraviti: |
| - | ¸¸ | + | < |
| print(model) | print(model) | ||
| - | ¸¸ | + | </ |
| - | Kako bi se vidjelo rješenje, ili se ispis može formatirati i preurediti da bude čitljiviji | + | Kako bi se vidjelo rješenje, ili se ispis može formatirati i preurediti da bude čitljiviji. |
| Ovaj dio programa se može jednostavno ostvariti sljedećim kodom: | Ovaj dio programa se može jednostavno ostvariti sljedećim kodom: | ||
| - | ¸¸ | + | < |
| if solver.check() == sat: | if solver.check() == sat: | ||
| Line 94: | Line 94: | ||
| else: | else: | ||
| print(" | print(" | ||
| - | ¸¸ | + | </ |
| Za pokretanje izvršavanja prethodno definiranog skupa uvjeta s varijablama X i Y, Z3 će uspješno pronaći rješenje x = 1, y = 105. | Za pokretanje izvršavanja prethodno definiranog skupa uvjeta s varijablama X i Y, Z3 će uspješno pronaći rješenje x = 1, y = 105. | ||
| - | No definirani problem često može sadržavati više rješenja. Jednostavan pristup kako pronaći sva rješenja pojedinog problema je da se u while petlji nakon pronalaska jednog rješenja, doda novi uvjet koji definira da X i Y ne smiju biti vrijednosti pronađene u prethodnom rješenju i da se ponovno pokrene postupak pronalaska rješenja, sve dok se ne dođe do slučaja da se više rješenje ne može pronaći. | + | No definirani problem često može sadržavati više rješenja. Jednostavan pristup kako pronaći sva rješenja pojedinog problema je da se u while petlji nakon pronalaska jednog rješenja, doda novi uvjet koji definira da X i Y ne smiju biti vrijednosti pronađene u prethodnom rješenju i da se ponovno pokrene postupak pronalaska rješenja, sve dok se ne dođe do slučaja da se rješenje |
| Ova programska logika se može ostvariti sljedećim kodom: | Ova programska logika se može ostvariti sljedećim kodom: | ||
| - | ¸¸ | + | < |
| while solver.check() == sat: | while solver.check() == sat: | ||
| model = solver.model() | model = solver.model() | ||
| print(" | print(" | ||
| solver.add(Or(x != solver.model()[x], | solver.add(Or(x != solver.model()[x], | ||
| - | ¸¸ | + | </ |
| - | Pokretanjem ovog koda za prethodno definirani problem, Z3 osim rješenja x = 1, y = 105 pronalazi i drugo rješenje x = 8, y = 98. | + | Pokretanjem ovog koda za prethodno definirani problem, Z3 osim rješenja x = 1, y = 105 pronalazi i drugo rješenje: x = 8, y = 98. |
| - | ===PRIMJER -Zadatak s Hacknite platforme – ZZZ=== | + | ===PRIMJER - Zadatak s Hacknite platforme – ZZZ=== |
| < | < | ||
| Line 115: | Line 115: | ||
| </ | </ | ||
| Uz zadatak dostupna je i datoteka python_checker.py. | Uz zadatak dostupna je i datoteka python_checker.py. | ||
| - | Ime zadatka „ZZZ“ je hint na Z3. | + | Ime zadatka „ZZZ“ je hint na Z3 solver. |
| - | Kod zadatka uz formatiranje uvjeta radi bolje čitljivosti je prikazan na slici 1. | + | Kôd zadatka, uz formatiranje uvjeta radi bolje čitljivosti, je prikazan na slici 1. |
| {{z3solver: | {{z3solver: | ||
| - | Pregledom | + | Pregledom |
| - | Uz pretpostavku da skup svih uvjeta bez prvog uvjeta koji provjerava sha256 hash ima dovoljno mali skup rješenja, da se prvo mogu pronaći sva rješenja za ostale uvjete, a nakon toga se nad pronađenim rješenjima mogu generirati sha256 sažetci odgovarajućih znamenki rješenja i naknadno | + | Uz pretpostavku da skup svih uvjeta bez prvog uvjeta koji provjerava sha256 hash ima dovoljno mali skup rješenja, da se prvo mogu pronaći sva rješenja za ostale uvjete, a nakon toga se nad pronađenim rješenjima mogu generirati sha256 sažetci odgovarajućih znamenki rješenja i naknadno |
| - | Programski | + | Programski |
| {{z3solver: | {{z3solver: | ||
z3.1739190457.txt.gz · Last modified: 2025/12/01 11:40 (external edit)