Cvičenia 5
V moodli odovzdávajte riešenie úloh Fibonacci a GCD (mozete ich spojiť do jedného textového súboru, ak budú dostatočne viditeľne oddelené).DLV a SMODELS
- Informácie o tom, ako získať DLV a smodels sú na stránke predmetu ASP.
- 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
- CLINGO je veľmi podobné SMODELS (clasp = lp, gringo = smodels, clingo = sm).
- -n X -- vypíše najviac X modelov.
- 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 pravidle 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(_).
Vstup
Nasledujúce dve úlohy všetky pracujú s týmto vstupom:
family.smmother(shmi,anakin). father(anakin,luke). father(anakin,leia). mother(padme,luke). mother(padme,leia). father(luke,ben). mother(mara,ben). mother(leia,jacen). father(han,jacen).
Man / Woman
Pre niektorých ľudí z nášho vstupu vieme určiť akého sú pohlavia (matka/otec). Napíšte logický program, ktorý definuje predikáty man(X) a woman(X), ktoré sú pravdivé vždy, keď (vieme rozhodnúť že) X je muž resp. žena.
manwoman.smwoman(X) :- mother(X,Y). man(X) :- father(X,Y).
Ancestor
Napíšte logický program, ktorý definuje predikát ancestor(A,B), ktorý bude pravdivý vždy, keď A je predkom B.
ancestor.smancestor(X,Y) :- father(X,Y). ancestor(X,Y) :- mother(X,Y). ancestor(X,Z) :- ancestor(X,Y), ancestor(Y,Z).
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.