Professional Documents
Culture Documents
STRUKTURE, NEGACIJA
GOVORIMO O…
oStrukture - ponavljanje
oUpit sa strukturama
oNegacija
oPretpostavka zatvorenog svijeta
oNegacija kao neuspjeh
oNadogradnja zadataka
STRUKTURE - PONAVLJANJE
Služe da se više podataka jednostavnih tipova poveže
u podatak složenijeg tipa.
Razlika strukture i činjenice:
◦ činjenica je jednostavna klauzula
◦ struktura je term koji može biti argument neke
klauzule
STRUKTURE - PONAVLJANJE
Struktura ima sljedeći oblik:
argumenti (termi),
koji mogu biti i druge
funktor strukture
STRUKTURE - PONAVLJANJE
Ako definiramo predikat s više činjenica, poželjno je,
mada ne i nužno, da u svim činjenicama odgovarajući
argumenti budu istog tipa, a ako su strukture, da
sadrže isti broj argumenata.
Struktura se koristi kao zapis (record), a ne kao lista!
PREDIKAT opisStvari / 2
Da bismo unijeli više realnosti u igru, definirat
ćemo predikat opisStvari / 2, koji će imati za prvi
argument naziv stvari, a za drugi strukturu opis / 2
s dva argumenta koji će predstavljati:
◦ dodatni atribut opisa stvari
◦ težinu stvari u gramima
PREDIKAT opisStvari / 2
opisStvari(komoda, opis(stara, 35000)).
opisStvari(krevet, opis(klimavi, 25000)).
opisStvari(fenjer, opis(mali,150)).
opisStvari(stol, opis(drveni, 25000)).
opisStvari(jabuka, opis(crvena, 120)).
opisStvari(napitak1, opis(mutni, 40)).
opisStvari(napitak2, opis(prozirni, 40)).
opisStvari(blago, opis(vrijedno, 20000)).
opisStvari(vaza, opis('velika ukrasna', 7000)).
opisStvari(šibice, opis(suhe, 5)).
opisStvari(izbočina, opis(kamena, 200)).
UPITI SA STRUKTURAMA
Možemo definirati upit na taj
način da definiramo pojedine
ili sve argumente strukture, ?- opisStvari(X, opis(Y, 150)).
pri čemu pojedine argumente X = fenjer,
strukture možemo označavati Y = mali ;
varijablama: false.
listaStvari(Mjesto) :- jeU(X,Mjesto),
tab(2),
opisStvari(X,opis(Y,_)),
write(Y), write(' '),
write(X),
nl, fail.
listaStvari(_).
PREDIKAT listaStvari / 1
Nakon čega možemo postaviti sljedeći upit:
?- gledaj(soba1).
soba1 sadrži
stara komoda
klimavi krevet
mali fenjer
true.
NEGACIJA
Svaki logički programski jezik mora imati
mogućnost negacije cilja.
Postoje različita metapravila koja omogućuju rad s
negiranim ciljevima.
PRETPOSTAVKA ZATVORENOG SVIJETA
Način na koji Prolog pristupa problemu negacije
proizlazi iz općenitog pristupa istinitosti u bazi
podataka koji se naziva pretpostavka zatvorenog
svijeta (closed world assumption), koja kaže
sljedeće:
?- not(lokacija(stol,hodnik1)).
true.
?- not(lokacija(jabuka,stol)).
false.
PREDIKAT mozeUzeti / 1
Sada želimo pomoću znanja stečenog u prošlom
poglavlju i znanja iz ovog poglavlja predefinirati
predikat mozeUzeti / 1 tako da osim stvari koje nisu
u prostoriji, igrač ne može uzeti ni stvar koja je teža
od 20 kg.
U slučaju pokušaja uzimanja teže stvari potrebno
je kreirati odgovarajuću poruku.
PREDIKAT mozeUzeti / 1
mozeUzeti(Stvar) :- polozaj(X),
jeU(Stvar, X),
opisStvari(Stvar, opis(_ , Y)),
Y =< 20000.
mozeUzeti(Stvar) :- polozaj(X),
jeU(Stvar, X),
opisStvari(Stvar, opis(_ , Y)),
Y > 20000, write('Pretesko je'),
nl, fail.
mozeUzeti(Stvar) :- polozaj(X),
not(jeU(Stvar, X)),
write('Toga nema ovdje'), nl, fail.
PALJENJE I GAŠENJE
Kreiramo novi predikat svjetlo / 2, kojim označavamo
sve stvari koje se mogu upaliti te navodimo što je
potrebno imati da bi se mogle upaliti.
Također popravljamo predikate upali / 1 i ugasi / 1
tako da neće biti moguće paliti i gasiti ništa što igrač
ne nosi sa sobom i za što nema sredstvo za paljenje.
PREDIKAT svjetlo / 2
svjetlo(fenjer, šibice).
upali(X) :- ima(X),
upaljeno(X),
write('Već je upaljeno'), nl, fail.
upali(X) :- ima(X), not(svjetlo(X,_)),
write(X), write(' '),
write('se ne može upaliti'), nl, fail.
PREDIKAT ugasi / 1
ugasi(X) :- ima(X), upaljeno(X),
retract(upaljeno(X)),
asserta(ugaseno(X)),
write('Ugasio sam'), nl.
ugasi(X) :- not(ima(X)),
write('Nemam '), write(X), nl,fail.
ugasi(X) :- ima(X), ugaseno(X),
write('Već je ugašeno'), nl, fail.
ugasi(X) :- ima(X), not(svjetlo(X,_)),
write(X), write(' '),
write('se ne može paliti i gasiti'), nl, fail.
GENEOLOŠKA BAZA PODATAKA
Neka od rješenja za pravila:
braca(X,Y) :- roditelj(Z,X), roditelj(Z,Y), \=(X,Y).
braca2(X,Y) :- majka(Z,X), majka(Z,Y), otac(W,X), otac(W,Y),
\=(X,Y).
sestra(X,Y) :- majka(Z,X), majka(Z,Y), otac(W,X), otac(W,Y),
\=(X,Y), osoba(X,z).
brat(X,Y):- majka(Z,X), majka(Z,Y), otac(W,X), otac(W,Y),
\=(X,Y), osoba(X,m).