Cvičenia 2
Riešenia úloh Fibonacci a GCD odvzajte v moodli do 7.10.2014 18:09:59. Môžete ich odovzdávať v jednom súbore (jednom logickom programe obsahujúcom obidve riešenia).
DLV a SMODELS
- DLV
- dlv subor.dlv
- -N=10 -- nastavenie max. integerov
- -filter=pred1,pred2,... -- vypíše iba tieto predikáty
- SMODELS
- lparse [ lparse options...] subor.sm | smodels [ smodels options...]
- alebo sm[ lparse opts....] subor.sm [ -- smodels options...] ak mate sm skript
- .sm pre smodels súbory je môj zvyk, autori myslím používajú .lp keďže je to vlastne vstup pre lparse.
- smodels vypisujú štandartne iba prvý model, ak chceme všetky: sm subor.sm -- 0
- Veľmi jednoduchý sytax highligt pre vim (ak používate vim a nepáči sa vám biela alebo highlight pre prolog)
- Stiahnuť smodels.vim a uložiť do ~/.vim/syntax/smodels.vim
- Vo vim zadať: :se ft=smodels (ft ako filetype)
- alebo do súboru dať komentár na koniec: vim: ft=smodels : (funguje len ak má vim zapnuté modelines)
- alebo do .vimrc alebo .vim/filetype.vim dať autocmd BufNewFile,BufRead *.sm,*.dlv setf smodels
- Matematické operácie
- dlv: +,-,#succ, má obmedzenú aritmetiku po #maxint, sú to predikáty
- smodles: všetko možné ... +,-,*,/, sú to naozaj funkcie(tj dajú sa použit ako termy v predikátoch)
- Čísla
- prirodzené čísla - nekonečné modely, treba obmedzit ich množinu
- DLV: #maxint=19. alebo ako commandline option -N=19 obmedzí dlv iba na čísla 0 - 19
- smodels: každá premenná v tele pravidla sa musí nachádzať v nejakom doménovom predikáte (v zaásade nesmie byť rekurzívny).
#const max=10. num(0..max). #hide num(_).
- Groundovanie
- dlv --instantiate
- lparse -t -- doménové predikáty
Graf
Napíšte logický program, ktorý spraví "uzáver" grafu, tj pre graf zadaný pomocou predikátu edge/2 bude predikát path/2 platný pre každú dvojicu vrcholov, medzi ktorými existuje orientovaná cesta.Successor
Napíšte logický program v ktorého najmenšom modeli bude predikát succ_a/1 platný pre každého nasledovníka X+1, pre ktoré platí a(X). Teda pre a(1). a(5). a(6). dostaneme model { a(1), a(5), a(6), succ_a(2), succ_a(6), succ_a(7) }.
Odd Even
Napíšte logický program, v ktorého najmenšom modeli bude predikát even/1 bude platný pre všetky párne čísla. Obdobne odd/1 bude platný pre všetky nepárne.Sum
Napíšte predikát sum(S,I) platný práve vtedy keď S = ∑i=0..I i.
Fibonacci
Napíšte predikát fib(F,I) platný práve vtey keď F je I-te Fibonacciho číslo.
Deleno / Modulo
Napíšte predikáty deleno(X,Y,Z) a modulo(X,Y,Z) (s použitím + a *) tak aby
- deleno(X,Y,Z) ≡ X/Y=Z, kde / je celočíselné delenie.
- modulo(X,Y,Z) ≡ X%Y=Z, kde % je zvyšok po celočíselnon delení.
GCD
Napíšte predikát gcd(T,X,Y) tak aby bol platný práve vtedy keď T je najväčším spoločným deliteľom X a Y.