You are on page 1of 24

PROLOG

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:

naziv(x1, x2, ..., xn)

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.

Možemo i cijele strukture


?- opisStvari(jabuka, X).
označavati varijablama, kao i
X = opis(crvena, 120).
ostale terme:
PREDIKAT listaStvari / 1
Sada možemo predefinirati, u cilju boljeg opisa, predikat
listaStvari / 1 na

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:

Istinito je samo ono što je upisano u bazu podataka.


Odnosno, sve za što se ne zna je li istinito je lažno.
NEGACIJA KAO NEUSPJEH
Vezano uz pretpostavku zatvorenog svijeta, Prolog
za interpretiranje negacije koristi metapravilo
zvano negacija kao neuspjeh (negation as failure),
koje kaže:

Negacija cilja uspijeva ako i samo ako cilj ne


uspijeva.
UGRAĐENI PREDIKAT not / 1
Predikat not / 1 je ugrađeni predikat koji kao argument
prima cilj. Unifikacija predikata not / 1 će uspjeti ako i samo
ako cilj koji je argument ne uspijeva.
Predikat not / 1 predstavlja negaciju tipa negacija kao
neuspjeh.
Na našoj bazi moguće je postavljati sljedeće upite:

?- 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).

Ovdje šibice ne ulaze u popis stvari koje daju


svjetlo, već su samo sredstvo za paljenje.
PREDIKAT upali / 1
upali(X) :- svjetlo(X,Y), ima(X), ima(Y),
ugaseno(X),
retract(ugaseno(X)),
asserta(upaljeno(X)),
write('Upalio sam'), nl.
upali(X) :- svjetlo(X,Y), ima(X), not(ima(Y)),
write('Nemam '), write(Y), nl, fail.
upali(X) :- not(ima(X)),
write('Nemam '), write(X), nl, fail.
PREDIKAT upali / 1

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).

Baza treba sadržavati i pravila za majku, oca, sina, kći, djeda,


baku, unuka, unuku, u_braku (prema činjenicama za predikat
vjencani) te pretka i potomka. Doradite pravila za ljepši ispis.
GENEOLOŠKA BAZA PODATAKA
Definirajte pravila sa sljedećim predikatima:
◦ tetak / 2 i teta / 2
◦ ujak / 2 i ujna / 2
◦ stric / 2 i strina / 2
◦ bratic / 2 i sestricna / 2
◦ necak / 2 i necakinja / 2
GOVORILI SMO O…

You might also like