Cvičenia 1
DLV a SMODELS
- DLV
- dlv subor.dlv
- -N=10 -- nastavenie max. integerov
- -n=X -- vypíše najviac X modelov.
- -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.
- 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žiť ako termy v predikátoch)
- Čísla
- prirodzené čísla - nekonečné modely, treba obmedziť 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).
Vstup
Nasledujúce ú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).
Siblings
Identifikuje súrodencov. Zadefinujte predikát siblings(X,Y), ktorý je pravdivý práve vtedy, keď X a Y sú súrodenci. Pre tých, o ktorých vieme, akého sú pohlavia, zadefinujte aj predikáty sister(S,X) a brother(B,X), ktoré sú pravdivé práve vtedy, keď S/B je sestra/brat X.
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).siblings.sm
siblings(X,Y) :- father(F,X), father(F,Y), X!=Y. siblings(X,Y) :- mother(M,X), mother(M,Y), X!=Y. sister(S,X) :- siblings(S,X), woman(S). brother(B,X) :- siblings(B,X), man(B).