Cvičenia 4 -- nemonotónnosť
Negácia (defaultová)
Poznámka: ak by ste mali pocit, že by sa vám niekde hodila silná negácia, odsimulujte si ju :-) ako napríklad pri generovaní možností: predikat(X) :- not non_predikat(X). non_predikat(X) :- not predikat(X)..
Def. negácia sa zapisuje jednoducho s not:
a. c :- not b.
Z predndnášky by vám mala byť jasná sémantika (čo sú stabilné modely tohoto programu).
Keďže ide o closed world assumption (CWA) prináša to drobné komplikácie: nad akou doménou ju chceme robiť? Robiť ju totižto nad množinou všetkých termov (ako to vlastne robí teoretická sémantika) je príliš zložité. Preto musíme zabezpečíť aby bola jasná doména:
- SMODELS: každá premenná, ktorá sa vyskytuje v negovanom predikáte alebo v hlave, sa musí v tom pravidle vyskytovať ešte v nejakom kladnom doménovom predikáte v tele. Doménový predikát je zjednodušene taký, ktorý vieme odvodiť bez rekurzívnej negácie, respektíve iba stratifikovanou negáciou (tj vie ho vyrobiť lparse pri groundovaní)
- DLV: každá premenná z negatívneho predikátu alebo aj hlavy, sa musí vyskytovat v (ľubovoľnom) pozitívnom predikáte.
a(1..5). b(1..2). c(X) :- not b(X).neg3.sm
a(1..5). b(1..2). c(X) :- a(X), not b(X).neg3.dlv
#maxint=7. a(1..5). b(1..2). c(X) :- #int(X), not b(X).
Choice
Napíšte program, ktorý bude mať dva stabilné modely: jeden v ktorom platí predikát a/0 a jeden v ktorom neplatí.
Vieme vytvoriť program, ktorého stabilnými modelmi by boli práve {a} a {}?
Choice 2
Napíšte program, ktorý bude mať pre nejaký vstupný predikát option/1 stabilné modely, z ktorých v každom bude predikát selected/1 platný pre nejakú podmožinu X z { X | option(X)}. Teda pre
option(1). option(2).
dostaneme modely ( predikát a vynechávam ):
- {}
- { selected(1) }
- { selected(2) }
- { selected(1), selected(2) }
Ináč povedané pre každé X z option(X) sa chceme nezávisle na ostatných rozhodnúť či v modeli bude alebo nebude selected(X).
Choose
Napíšte program, tak aby v každom modeli bol chosen(X) pravdivý práve pre jedno X z option(X).
N-Queens
Máme šachovnicu NxN políčok, rozmiestnite na ňu N dám tak aby sa žiadne neohrozovali. Riešenie cez predikát q(X,Y) znamenajúci, že na políčku X,Y je kráľovná. Ideálne si spravte konštantu n, ktorá bude hovoriť rozmery a počet kráľovien.
V smodels sa da zadeklarovat konstanta suboru #const n=8
V dlv cez predikat, tak ako sme to robili: cislo(1..8)