You are on page 1of 23

SVEUILITE U ZAGREBU

FAKULTET ORGANIZACIJE I INFORMATIKE


VARADIN

Ana-Marija Balen

Rezervacija kino karata


PROJEKT IZ KOLEGIJA LOGIKO PROGRAMIRANJE

Mentor:
Dr. sc. Sandra Lovreni

Varadin, 2015.

SVEUILITE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
VARADIN

Ana-Marija Balen
Broj indeksa: 42605/13-R
Diplomski studij
Smjer: Baze podataka i baze znanja

Rezervacija kino karata


PROJEKT IZ KOLEGIJA LOGIKO PROGRAMIRANJE

Mentor:
Dr. sc. Sandra Lovreni

Varadin, 2015.

Sadraj
1.

Uvod ................................................................................................................................... 4

2.

Opis mogunosti jezika Prolog ........................................................................................... 5


2.1.

Dinamiki predikat ...................................................................................................... 5

2.2.

Predikati ...................................................................................................................... 5

2.3.

Pravila.......................................................................................................................... 6

2.4.

Anonimna varijabla ..................................................................................................... 6

2.5.

Predikati za ulaz / izlaz................................................................................................ 6

2.6.

Ugraeni predikati nl / 0 i tab / 1 ................................................................................ 7

2.7.

Ugraeni predikati za auriranje baze ......................................................................... 8

2.8.

Aritmetiki operatori ................................................................................................... 9

2.9.

Kontrolna struktura if then else ........................................................................... 10

3.

Popis predikata i injenica ................................................................................................ 11

4.

Programski kod i komentari ............................................................................................. 12

5.

Primjer izvoenja .............................................................................................................. 17

6.

Zakljuak .......................................................................................................................... 22

7.

Literatura .......................................................................................................................... 23

1. Uvod
Rezervacija kino ulaznica je ve due vrijeme sasvim normalan pojam i korisnici ga obavljaju
samostalno, putem interneta. Aplikaciju Rezervacija kino ulaznica mogue je implementirati
u jeziku Prolog to u prikazati u ovome seminaru. Aplikacija e imati mogunosti prikaza
popisa svih filmova koji trenutno igraju u kinu, mogunost prikaza termina predstave
selektirano po nazivu filma. Moi e se takoer izlistati svi trenutni filmovi koji igraju u kinu
s podacima o terminu, anru filma i informacije u kojem kinu se prikazuje taj film. Zadnja, ali
najbitnija stavka je rezervacija ulaznica koja je omoguena korisnikim imenom, ifrom filma
i brojem ulaznica koje se ele rezervirati. Rezervacijom ulaznica broj slobodnih ulaznica se
aurira u bazi znanja.

2. Opis mogunosti jezika Prolog


Projekt je izraen u SWI Prologu, a ovdje u navesti sve mogunosti ovog jezika koje sam
iskoristila u projektu.

2.1.

Dinamiki predikat

Predikati u SWI Prologu smatraju se statikim predikatima i ne doputa im se mijenjanje


vrijednosti. Stoga, sve takve predikate najprije treba promijeniti u dinamike predikate
direktivom dynamic / 1. predikati ije se klauzule kreiraju tek pokretanjem programa odmah
se smatraju dinamikim, ali se preporua i njih ukljuiti u direktivu.
Direktiva dynamic / 1 ima sljedeu sintaksu:
:- dynamic ime/kratnost
Takoer to vidimo iz primjera u projektu:
:-dynamic slobodno/2.

2.2.

Predikati

Predikati su injenice specijalnih vrsta pravila bez tijela i vrata. Njima definiramo bazu znanja.
U primjeru projekta, film je predikat iji je argument naziv filma.
film(hobit).
film(igre_gladi).
film(interstellar).
film(koko3).
film(ninja_turtles).
film(preglup_i_pregluplji).
film(pingvini_s_madagaskara).

2.3.

Pravila
glava :- tijelo

Pravilo je klauzula oblika

i ono se ita na sljedei nain:

Vrijedi glava ako vrijedi tijelo.

Pravila omoguuju definiranje odnosa meu predikatima bez da se oni eksplicitno definiraju
za svaku instancu argumenata.
ulaznica(Naziv,Sifra,Kolicina):predstava(Naziv,Sifra,_,_,_,_),slobodno(Sifra,Kolicina).

2.4.

Anonimna varijabla

Anonimna varijabla - slui za definiranje varijabli koje koristimo samo jednom u klauzuli.
Anonimna varijabla je takoer koritena u gornjem primjeru. Oznaava se donjom crtom _,
ili ak anonimne varijable s imenom koje se oznaavaju _Ime.

2.5.

Predikati za ulaz / izlaz

Predikat za ulaz - write / 1 ispisuje na zaslon term koji mu je argument. Usklaivanje predikata
uspijeva uvijek kod poziva, a kod ponavljanja javlja neuspjeh. Argument moe biti ili varijabla
koritena u programu ili bilo koji string.
Predikat za izlaz read / 1 navodi korisnika da upie neke podatke, a podatke sprema u
varijablu koja mu je argument.
Npr. u pravilu termini_filma/0 kojim biramo za koji film elimo pogledati termine predstava,
write ispisuje pitanje, a read sprema upisani pojam u varijablu Film koju kasnije koristi u
daljnjim upitima nad bazom.
termini_filma

:-

write('Koji

film

popisa

biste

eljeli

pogledati?'), nl,
read(Film), nl,
write('Ovo
write('.').

su

termini

prikazivanja

filma

'),

write(Film),

2.6.

Ugraeni predikati nl / 0 i tab / 1

nl / 0 vri na zaslonu prelazak u novi red. Usklaivanje predikata odvija se jednako kao i
kod write / 1.
tab / 1 na zaslon ispisuje onoliko razmaka koliko mu kazuje broj koji mu je argument.
Usklaivanje predikata odvija se jednako kao i kod write / 1.
fail / 0 - usklaivanje ovog predikata nikada neuspijeva.
popis:write('Prikazujemo

listu

svih

filmova

koje

moete

pogledati:'),nl,
write('ifra'),tab(5),write('Naziv'),tab(8),write('Vrijeme'),
tab(8),write('Zanr'),tab(8),write('Trajanje'),tab(7),write('Ki
no'), nl,
write('=======================================================
======================'), nl,
predstava(Naziv,Sifra,Vrijeme,Zanr,Trajanje,Kino),
write(Sifra),
tab(5),

tab(7),

write(Zanr),

write(Naziv),
tab(5),

tab(5),

write(Vrijeme),

write(Trajanje),

tab(10),

write(Kino), nl, fail.

Da na kraju ovog pravila nismo stavili predikat fail, trebali bi traiti svaki novi red. U ovom
sluaju program ispie sve redove koje moe pronai u bazi, a ne samo prvi red koji zadovolji
pravilo.

2.7.

Ugraeni predikati za auriranje baze

U ovom programu takoer se pojavljuju i predikati za auriranje baze. To su predikati asserta


/ 1 za unos nove klauzule kao prve klauzule navedenog predikata, assertz / 1 za unos nove
klauzule kao posljednje klauzule navedenog predikata te retract / 1 - brie iz baze sve klauzule
koje se mogu uskladiti s navedenom klauzulom.
Zbog ovih ugraenih predikata se statiki predikati moraju predefinirati u dinamike, jer ovi
predikati mijenjaju njihove vrijednosti.
U primjeru je naveden predikat assert, no njegova je uloga identina kao i uloga predikata
assertz.
narudzba(Korisnik, Sifra, Broj):korisnik(Korisnik,
_),
ulaznica(Naziv,
Sifra,
_),
predstava(Naziv, Sifra, Vrijeme, _, _, _), slobodno(Sifra,
Kolicina),
Kolicina
>=
Broj,(write('Postovani/a
'),
write(Korisnik), write(','), nl, write('rezervirali ste karte
za film '), write(Naziv), write(' u '), write(Vrijeme),
write('.')) ->
(slobodno(Sifra, Kolicina), NovaKolicina is Kolicina - Broj,
retract(slobodno(Sifra,
_)),
assert(slobodno(Sifra,NovaKolicina)), nl,
write('Kolicina karata je azurirana.'));
write('Unijeli ste krivo ime, sifru ili na stanju nema dovoljan
broj ulaznica, molimo provjerite.').

2.8.

Aritmetiki operatori

Da bi prolog mogao biti koriten u realnim situacijama, mora podravati aritmetiku. Problem
je to vrednovanje aritmetikih izraza nije u skladu s Prologovim osnovnim konceptom rada.
Ugraeni operator is / 2 vrednuje svoj drugi argument i usklauje ga s prvim argumentom. Na
taj se nain postie vrednovanje aritmetikog izraza i dodjeljivanje njegove vrijednosti prvom
argumentu.
Primjer moemo pronai u gore navedenom kodu gdje se definira NovaKolicina kao
Kolicina (stara) minus eljeni Broj ulaznica. Iz navedenog primjera jasno vidimo da je
koriten takoer i aritmetiki znak za oduzimanje.
Osim aritmetikih izraza, u realnim aplikacijama se brojevi usporeuju. Prolog ima ugraene
predikate za obavljanje usporedbe.

Prefix

Infix

Uspijeva ako je

=<(X,Y)

X =< Y

X manje ili jednako Y

>=(X,Y)

X >= Y

X vee ili jednako Y

=(X,Y)

X=Y

X jednako Y

<(X,Y)

X<Y

X manje od Y

>(X,Y)

X>Y

X vee od Y

\=(X,Y)

X \= Y

X nejednako Y

Tablica 1. Ugraeni predikati za obavljanje usporedbe

U svom projektu koristila sam operator vee ili jednako ime u bazi provjeravamo imamo li
dovoljnu koliinu karata na zalihi prije nego to se izvri rezervacija.

2.9.

Kontrolna struktura if then else

Na navedenom primjeru moemo objasniti i kontrolnu strukturu if then- else. Ona u Prologu
izgleda malo drugaije nego u ostalim programskim jezicima, a njezina srtuktura izgleda
ovako:
cilj1 -> cilj2; cilj3
Struktura if then else ita se na sljedei nain: Ako uspije cilj1, unificira se cilj2. Ako ne
uspije cilj1, Prolog pokuava cilj3.
U naem primjeru to funkcionira ovako: ako je korisnik kod narudbe unio ispravno korisniko
ime, ifru filma i broj eljenih karata, baza znanja e se aurirati, broj karata uz odreeni film
e se obrisati i unijet e se prijanja vrijednost umanjena za broj rezerviranih karat. Ukoliko
na prvi cilj ne uspije, odnosno ako navedeni podaci nisu ispravno uneseni, program izbacuje
poruku upozorenja da podaci nisu ispravni.

3. Popis predikata i injenica


Predikat / injenice

Opis

korisnik / 2

Predikat korisnik sadri dva argumenta ime i prezime korisnika

film / 1

Predikat film slui za definiranje filmova koji trenutno igraju u


kinu
Ovaj predikat nam slui za sve bitne informacije vezane uz film

predstava / 6

(naziv, ifra filma, vrijeme predstave, anr, trajanje i kino u


kojem se prikazuje)

slobodno / 2
ulaznica / 3
popis_filmova / 0

termini_filma / 0
popis / 0
br_ulaznica / 0

start / 0

Predikat slobodno povezuje ifru filma s brojem slobodnih mjesta


u dvorani
Pravilo ulaznica vee predstavu sa koliinom slobodnih karata
Pravilo popis_filmova ispisuje nazive svih filmova koji trenutno
igraju u kinu
Pravilo termini_filma od korisnika trai da unese naziv eljenog
filma nakon ega ispisuje termine prikazivanja tog filma
Popis definira listu svih filmova sa svim njihovim informacijama
Predikat broj ulaznica definiran je za prikaz trenutno slobodnih
mjesta u dvorani po pojedinoj predstavi
Start je pravilo koje daje korisniku opcije koje moe koristiti u
programu.
Ovaj predikat ima zadau rezervirati karte za kino. Argumenti su

narudzba / 3

korisnikovo ime, ifra filma i broj karata koje eli rezervirati


nakon ega se stanje karata aurira.

Tablica 2. Popis predikata i injenica

4. Programski kod i komentari


% REZERVACIJA KARATA ZA KINO / Ana-Marija Balen 2014.g.
% prebacivanje statickog predikata u dinamiki kako bi se njegova vrijednost
mogla mijenjati.
:-dynamic slobodno/2.
% definiranje korisnika korisnikim imenom i gradom u kojem ivi.
korisnik(ana, zagreb).
korisnik(pero, varazdin).
korisnik(ivo, bjelovar).
korisnik(marija, sisak).
korisnik(mario, zadar).

% definiranje predikata film - sadri naziv filma.


film(hobit).
film(igre_gladi).
film(interstellar).
film(koko3).
film(ninja_turtles).
film(preglup_i_pregluplji).
film(pingvini_s_madagaskara).

% definiranje filma u bazi znanja - ime, ifra, vrijeme predstave, anr,


trajanje, kino.
predstava(hobit, hob1, 19:30, avantura, 145, aMall).
predstava(hobit, hob2, 20:15, avantura, 145, arena).
predstava(hobit, hob3, 21:20, avantura, 145, bCent).
predstava(hobit, hob4, 22:10, avantura, 145, arena).
predstava(hobit, hob5, 22:45, avantura, 145, arena).
predstava(igre_gladi, igr1, 18:15, avantura, 125, arena).
predstava(igre_gladi, igr2, 20:20, avantura, 125, aMall).

predstava(igre_gladi, igr3, 21:30, avantura, 125, bCent).


predstava(igre_gladi, igr4, 22:15, avantura, 125, arena).
predstava(interstellar, int1, 21:10, akcija, 169, arena).
predstava(interstellar, int2, 22:10, akcija, 169, aMall).
predstava(interstellar, int3, 23:10, akcija, 169, bCent).
predstava(koko3, kok1, 16:15, dj_avantura, 90, bCent).
predstava(koko3, kok2, 18:15, dj_avantura, 90, aMall).
predstava(koko3, kok3, 17:20, dj_avantura, 90, arena).
predstava(ninja_turtles, nt01, 19:30, avantura, 101, arena).
predstava(ninja_turtles, nt02, 19:45, avantura, 101, aMall).
predstava(ninja_turtles, nt03, 21:40, avantura, 101, bCent).
predstava(preglup_i_pregluplji, pip1, 19:45, komedija, 110, bCent).
predstava(preglup_i_pregluplji, pip2, 20:30, komedija, 110, aMall).
predstava(preglup_i_pregluplji, pip3, 22:50, komedija, 110, arena).
predstava(pingvini_s_madagaskara, pm01, 15:30, animirani, 92, arena).
predstava(pingvini_s_madagaskara, pm02, 17:15, animirani, 92, aMall).
predstava(pingvini_s_madagaskara, pm03, 18:45, animirani, 92, bCent).

% slobodne karte odredene 's' 2 argumenta - ifra filma i broj slobodnih


karata za predstavu.
slobodno(hob1, 25).
slobodno(hob2, 53).
slobodno(hob3, 67).
slobodno(hob4, 45).
slobodno(hob5, 75).
slobodno(igr1, 23).
slobodno(igr2, 57).
slobodno(igr3, 34).
slobodno(igr4, 78).
slobodno(int1, 64).
slobodno(int2, 56).
slobodno(int3, 23).
slobodno(kok1, 77).
slobodno(kok2, 45).

slobodno(kok3, 56).
slobodno(nt01, 32).
slobodno(nt02, 76).
slobodno(nt03, 56).
slobodno(pip1, 75).
slobodno(pip2, 44).
slobodno(pip3, 55).
slobodno(pm01, 33).
slobodno(pm02, 47).
slobodno(pm03, 36).

% definiranje pravila ulaznica/3 koji vee predstavu sa slobodnom kolicina


na zalihama.
ulaznica(Naziv, Sifra, Kolicina) :predstava(Naziv, Sifra, _, _, _, _), slobodno(Sifra, Kolicina).

% definiranje pravila popis_filmova/0 koji ispisuje filmove koji trenutno


igraju u kinu.
popis_filmova :- write('Ovo su filmovi koji trenutno igraju u nasem
kinu:'), nl, film(Film), write(Film), nl, fail.

% definiranje pravila termini_filma/0 koji ispisuje termine predstava samo


za odabrani film.
termini_filma :- write('Koji film s popisa biste zeljeli pogledati?'),
nl, read(Film), nl, write('Ovo su termini prikazivanja filma '), write(Film),
write('.'),

nl,

nl,

write('Sifra'),

tab(4),

write('Vrijeme'),

tab(5),

write('Trajanje'), tab(7), write('Kino'), tab(5), write('Zanr'), nl,


write('==================================================================')
, nl,
predstava(Film, Sifra, Vrijeme, Zanr, Trajanje, Kino), write(Sifra), tab(5),
write(Vrijeme),

tab(8),

write(Zanr), nl, fail.

write(Trajanje),

tab(11),

write(Kino),

tab(5),

definiranje

predikata

popis/0

koji

ispisuje

sve

filmove

njihove

koje

mozete

write('Vrijeme'),

tab(6),

informacije.
popis

:-

pogledati:'),

write('Prikazujemo

nl,

nl,

listu

write('Sifra'),

svih

tab(5),

filmova

write('Trajanje'), tab(7), write('Kino'), tab(8), write('Zanr'), tab(10),


write('Naziv'),

nl,

write('====================================================================
========='), nl,
predstava(Naziv,
tab(7),

Sifra,

Vrijeme,

write(Vrijeme),

tab(7),

Zanr,

Trajanje,

write(Trajanje),

Kino),

write(Sifra),

tab(11),

write(Kino),

tab(8), write(Zanr), tab(7), write(Naziv), nl, fail.


popis.

% broj_ulaznica/0 je pravilo definirano kako bi se znao broj trenutno


slobodnih mjesta u dvorani.
br_ulaznica :- write('Trenutno je broj slobodnih ulaznica: '), nl, nl,
write('Sifra'), tab(3), write('Kolicina'), nl,
write('================'), nl,
ulaznica(_Naziv,

Sifra,

Kolicina),

write(Sifra),

tab(8),

write(Kolicina), nl, fail.


br_ulaznica.

definiranje

pravila

start/0

kojim

korisnik

dobiva

opcije

koje

moe

koristiti u programu.
start :- write('Dobrodosli u najveci izbor kino predstava.'), nl,
write('> Za popis filmova odaberite opciju popis_filmova.'), nl,
write('> Ako zelite vidjeti kada i u kojem kinu igra odredjeni film,
odaberite opciju termini_filma.'), nl,
write('>

Za

popis

slobodnih

mjesta

dvorani

odaberite

opciju

br_ulaznica.'), nl,
write('> Za popis svih filmova odaberite opciju popis.'), nl,
write('> Za ispunjavanje narudzbe vasim imenom i sifrom izabranih
ulaznica odaberite opciju narudzba.').

% definiranje narudbe u koju kupac unosi svoje korisniko ime, i ifru


ulaznica koje eli kupiti,
% ako su svi podaci tono upisani, kupcu izlazi poruka da je rezervirao karte
i da se stanje karata auriralo,
% ako ime kupca ili ifra nije tona, kupac dobiva poruku da je neto krivo
uneseno i da pokua ponovno.
narudzba(Korisnik, Sifra, Broj):korisnik(Korisnik, _), ulaznica(Naziv, Sifra, _), predstava(Naziv,
Sifra, Vrijeme, _, _, _), slobodno(Sifra, Kolicina),
Kolicina >= Broj,(write('Postovani/a '), write(Korisnik), write(','),
nl, write('rezervirali ste karte za film '), write(Naziv), write(' u
'), write(Vrijeme), write('.')) ->
(slobodno(Sifra,
Kolicina),
NovaKolicina
is
Kolicina
Broj,
retract(slobodno(Sifra, _)), assert(slobodno(Sifra,NovaKolicina)), nl,
write('Kolicina karata je azurirana.'));
write('Unijeli ste krivo ime, sifru ili na stanju nema dovoljan broj
ulaznica, molimo provjerite.').

5. Primjer izvoenja
1 ?- start.
Dobrodosli u najveci izbor kino predstava.
> Za popis filmova odaberite opciju popis_filmova.
> Ako zelite vidjeti kada i u kojem kinu igra odredjeni film,
odaberite opciju termini_filma.
>

Za

popis

slobodnih

mjesta

dvorani

odaberite

opciju

br_ulaznica.
> Za popis svih filmova odaberite opciju popis.
> Za ispunjavanje narudzbe vasim imenom i sifrom izabranih
ulaznica odaberite opciju narudzba.
true.

2 ?- popis_filmova.
Ovo su filmovi koji trenutno igraju u nasem kinu:
hobit
igre_gladi
interstellar
koko3
ninja_turtles
preglup_i_pregluplji
pingvini_s_madagaskara
false.

3 ?- termini_filma.
Koji film s popisa biste zeljeli pogledati?
|: hobit.
Ovo su termini prikazivanja filma hobit.
Sifra

Vrijeme

Trajanje

Kino

Zanr

=========================================================

hob1

19:30

145

aMall

avantura

hob2

20:15

145

arena

avantura

hob3

21:20

145

bCent

avantura

hob4

22:10

145

arena

avantura

hob5

22:45

145

arena

avantura

false.

4 ?- br_ulaznica.
Trenutno je broj slobodnih ulaznica:
Sifra

Kolicina

================
hob1

25

hob2

53

hob3

67

hob4

45

hob5

75

igr1

23

igr2

57

igr3

34

igr4

78

int1

64

int2

56

int3

23

kok1

77

kok2

45

kok3

56

nt01

32

nt02

76

nt03

56

pip1

75

pip2

44

pip3

55

pm01

33

pm02

47

pm03

36

true.
5 ?- popis.
Prikazujemo listu svih filmova koje mozete pogledati:
Sifra

Vrijeme

Trajanje

Kino

Zanr

Naziv

=============================================================================
hob1

19:30

145

aMall

avantura

hobit

hob2

20:15

145

arena

avantura

hobit

hob3

21:20

145

bCent

avantura

hobit

hob4

22:10

145

arena

avantura

hobit

hob5

22:45

145

arena

avantura

hobit

igr1

18:15

125

arena

avantura

igre_gladi

igr2

20:20

125

aMall

avantura

igre_gladi

igr3

21:30

125

bCent

avantura

igre_gladi

igr4

22:15

125

arena

avantura

igre_gladi

int1

21:10

169

arena

akcija

int2

22:10

169

aMall

akcija

interstellar

int3

23:10

169

bCent

akcija

interstellar

kok1

16:15

90

bCent

dj_avantura

koko3

kok2

18:15

90

aMall

dj_avantura

koko3

kok3

17:20

90

arena

dj_avantura

nt01

19:30

101

arena

avantura

ninja_turtles

nt02

19:45

101

aMall

avantura

ninja_turtles

nt03

21:40

101

bCent

avantura

ninja_turtles

pip1

19:45

110

bCent

komedija

preglup_i_pregluplji

pip2

20:30

110

aMall

komedija

preglup_i_pregluplji

pip3

22:50

110

arena

komedija

pm01

15:30

92

pm02

17:15

92

aMall

animirani

pingvini_s_madagaskara

pm03

18:45

92

bCent

animirani

pingvini_s_madagaskara

arena

animirani

interstellar

koko3

preglup_i_pregluplji
pingvini_s_madagaskara

true.

6 ?- narudzba(anna, hob1, 4).


Unijeli ste krivu sifru ili ime, pokusajte ponovno.
true.

7 ?- narudzba(ana, hob1, 4).


Postovani/a ana,
rezervirali ste karte za film hobit u 19:30.
Kolicina karata je azurirana.
true.

8 ?- br_ulaznica.
Trenutno je broj slobodnih ulaznica:
Sifra

Kolicina

================
hob1

21

hob2

53

hob3

67

hob4

45

hob5

75

igr1

23

igr2

57

igr3

34

igr4

78

int1

64

int2

56

int3

23

kok1

77

kok2

45

kok3

56

nt01

32

nt02

76

nt03

56

pip1

75

pip2

44

pip3

55

pm01

33

pm02

47

pm03

36

true.

6. Zakljuak
Prolog je logiki programski jezik i ima mogunost implementirati logike igre i rijeiti logike
probleme. U ovom seminaru sam implementirala rezervaciju karata kao jednog od logikih
problema. Rezervacija karata je uobiajena stvar i na ovaj nain sam pokazala da se moe
isprogramirati i u ovakvom programskom jeziku. Iskoristila sam mnoge ugraene predikate,
ali i definirala svoja pravila kako bi aplikacija postala funkcionalna. Smatram da je Prolog vrlo
dobro rjeenje za ovakav problem jer se u jednoj datoteci moe stvoriti baza znanja te lako
raditi operacije nad njom.

7. Literatura
[1] Predavanje s kolegija Uvod u formalne metode - Prolog, Fakultet organizacije i informatike,
Varadin, 2013.
[2] S Interneta: http://www.swi-prolog.org/
[3] Forum kolegija Logiko programiranje, Fakultet organizacije i informatike, Varadin http://autopoiesis.foi.hr/wiki.php?name=Logi%C4%8Dko+programiranje+-+FOI
[4] S Interneta: http://en.wikipedia.org/wiki/Prolog

You might also like