You are on page 1of 6

1.

Osnovne konstrukcije SML-a i Prologa


Prolog:
Osnovna konstrukcija logickog programiranja, uslova i izraza, su naslijedjeni iz logike. Postoje tri osnovna
izraza: fakti, pravila i upiti. Postoji jedinstvena struktura podataka: logicki uslov.
Najjedonstavnija vrsta recenice se naziva fakt. Fakt oznacava odnos ili relaciju koja povezuje objekte.
Primjer father(Abraham, Isaac).Ovaj fakt kaze da je Abraham otac od Isaaca ili da je relacija father
izmedju objekata Abraham i Isaac. Drugo ime za relaciju je predikat. Imena individua su poznata kao
atomi. Slicno, plus(2,3,5) izrazava relaciju koju 2 i 3 imaju sa 5.
Konacan skup predikata i atoma u faktima cine program. Ovo je najjednostavniji oblik logickog
programa. Opis situacije takodje daje i skup vise fakta.
Drugi oblik izraza u logickom programu je upit. Upiti su nacini dobijanja informacija iz logickog programa.
Upit "pita" da li je odredjena relacija medju objektima. Npr. upit father(Abraham,Isaac)?
pita da li su ova dva objekta u relaciji father. Sintaksicki upiti i fakti izgledaju isto, ali razlikuju se u
kontekstu. Kada postoji mogucnost zabune, tacka oznacava kraj fakta, a upitnik kraj upita.

Izracunavanja u ML-u se sastoje od procjenjivanja izraza. Svaki izraz ima tri bitne karakteristike:
Moze i ne mora da ima tip.
Moze i ne mora da ima vrijednost.
Mora i ne mora da "radi nesto".
Ove karakteristike su sve sta morate da znate kako bi racunali sa izrazima.Sta je tip? Uopsteno govoreci,
tip se definise odredjujuci sledece stvari: ime tipa, vrijednost i operacije koje se mogu izvoditi na tom
tipu. Posmatrajmo prvi tip integera ili cjelobrojnog tipa. Njegovo ime je int. Operacije na integeru
ukljucuju sabiranje +, oduzimanje -, mnozenje *, cjelobrojno dijeljenje div i dijeljenje po ostatku mod.

2.Jednostavne baze podataka u Prologu


Prolog
Usvaja se konvencija iz teorije baze podataka i svakoj relaciji se dodjeljuje relaciona sema koja tacno
odredjuje ulogu koju svaka pozicija ili argument u cilju treba da posjeduje. Varijablama se daju
mnemonicna imena, ali se obicno koriste X i Y kada se radi o upitima. Nove relacije se grade iz osnovnih,
tako sto se definisu odgovarajuca pravila. Primjer sin(Sin,Roditelj), kcer(Kcer,Roditelj),.. Sa logickog

gledista, nevazno je koja je veza definisana sa faktima a koja sa pravilima. Primjer ujak(Ujak, Osoba):brat(Ujak,Roditelj), roditelj(Roditelj,Osoba). sibling(Sib1,Sib2):roditelj(Roditelj,Sib1),roditelj(Roditelj,Sib2), Sib1=/=Sib2.
rodjak(Rodjak1,Rodjak2):roditelj(Roditelj1,Rodjak1),roditelj(Roditelj2,Rodjak2),sibling(Roditelj1,Roditelj2).

3.Rekurzija u SML-u i Prologu


Prolog
Najjednostavniji rekurzivni tip podataka su prirodni brojevi. To potice od osnova matematike.
Cinjenica je, Prolog programi za obavljanje aritmetickih operacija razlikuju se znacajno od njihovih
logickih "kolega". Primjer pr_broj(0). pr_broj(s(X)):-pr_br(X). Definisu se prirodni brojevi iz dva glavna
razloga. Prvo, aritmeticke operacije se smatraju vise za funkcionalne, nego relacione. Dajuci primjere za
takva slicna podrucja naglasava promjenu u misljenju koja je potrebna za kreiranje logickih programa.
Prirodni brojevi su izgradjeni iz dva konstruktora, konstantnog simbola 0 i i funkcije sljedbenik arnosti 0.
Svi prirodni brojevi su zadani rekurzivno na taj nacin.
Primjer rekurzija i stepen stepen (X,0,1).
stepen(X,Y,Z):-Y1 is Y-1, stepen(X,Y1,Z1), Z is X*Z1.

SML
fun member(x,nil)=false | member(x,h::t)= if x=h then true else member(x,t);
Primjer rekurzivne funkcije member ili clan.
Rekurzivne funkcije u SML-u koriste vlastite vrijednosti kako bi izracunale finalnu vrijednost. Ocigledno,
kako bi se sprijecilo beskonacno vracanje unazad, neki pozivi moraju da vrate vrijednost bez vise
vracanja unazad. Dakle, treba se voditi racuna o konacnosti programa kako bi se mogao izvrsiti.

4.Kompozicija rekurzivnih programa

Prolog
Kompozicija logickih programa je vjestina koja se najvise moze nauciti iskustvom i vjezbom. Iz
jednostavnih relacija, najbolja aksiomatizacija ima esteticku eleganciju koja ocigledno izgleda tacno kada
je napisana. Kroz rjesavanje vjezbi, citalac moze pronaci da ipak posoji razlika izmedju prepoznavanja i
konstruisanja elegantnog logickog programa. Primjer koristenja kompozicija rekurzivnih programa :
% insert sort
ubaci(X,[],[X]).
ubaci(X,[A|As],[X,A|As]):-X<A.
ubaci(X,[A|As],[A|Bs]):-X>=A,ubaci(X,As,Bs).
insertsort([],[]).
insertsort([A|As],Bs):-insertsort(As,Cs),ubaci(A,Cs,Bs).

5.Hanojske kule
Hanojske kule je naziv za matematicku igru ili slagalicu. Sastoji se od tri sipke (sipka A, B i C) i odredjenog
broja diskova razlicite velicine koji su naslagani na sipke. U pocetku su diskovi poredani na sipki A od
veceg ka manjem, tako da cini konusni oblik. Cilj igre je da se premjesti sve sto je slozeno na sipku A na
sipku B koristeci sipku C i sledeci sledeca pravila:
Samo se jedan disk moze pomjeriti odjednom.Svaki potez se sastoji od uzimanja gornjeg diska sa jedne
od sipki i postavljanja ga na drugu. Nijedan disk se ne smije postaviti na disk manje velicine. Sa tri diska,
igra se moze rijesiti u 7 poteza.
move(1,X,Y,_) :-write('Move top disk from '), write(X), write(' to '), write(Y), nl.
move(N,X,Y,Z) :- N>1, M is N-1, move(M,X,Z,Y), move(1,X,Y,_), move(M,Z,Y,X).

6.Aritmetika u SML-u i Prologu

Skoro svaki racunar nudi veoma efikasne aritmeticke operacije direktno u hardveru, i prakticni logicki
programi ne mogu da ignorisu ovu karakteristiku. Racunanja kao sabiranje traju odredjeno vrijeme
nezavisno od velicine sabiraka. Rekurzivni logicki program 'plus' traje proporcionalno prvom uzetom
broju. Ovo bi se moglo poboljsati tako sto se predje na binarnu ili decimalnu notaciju, ali se i dalje ne
moze takmiciti sa vec direktnim izvodjenjem namjenjenom hardveru.
Prolog
Svaka implementacija Prologa rezervise nekoliko predikatskih imena za sistemske procedure. Upiti za
ovakve predikate se zovu sistemski predikati. Oni se upravljaju sa specijalnim kodom koji je ugradjen.
Standardni Prolog ima sistemski predikat (Value,Expression) za aritmeticku procjenu. Ciljevi sa
predikatom su obicno napisani u binarnoj infiksnoj formi. Operatori se koriste kako bi programi bili
citljiviji.Jedni od sistemskih predikata su =:=,<,>,=< itd. Programeri takodje mogu da definisu i vlastite
operatore, kako potreba bude zahtijevala.

7.Racunanje faktorijela

SML : fun fakt(0)=1 | fakt(1)=1 | fakt(n)=n*fakt(n-1);


Prolog : fakt(0,1). fakt(1,1). fakt(N,X):- N1 is N-1,fakt(N1,X1), X is X1*N.

8.Fibonacijevi brojevi
SML: fun fib(0)=1|fib(1)=1|fib(n)=fib(n-1)+fib(n-2);
Prolog: fib(0,1).fib(1,1).fib(N,F):-N1 is N-1, fib(N1,F1),N2 is N-2, fib(N2,F2),F is F1+F2.

9.Rad sa listama u SML-u i Prologu :

SML: Konstruktor nil se moze smatrati kao prazna lista. Binarni konstruktor h::t je neprazna lista koja
ima glavu h i rep t. Ovakva definicija listi se smatra induktivnom.
Dvije stvari ovde su znacajne:
1.Operacija :: uzima kao drugi argument listu koja predstavlja rep prethodne i rezultat je opet lista.
Dakle, :: spaja element na listu.
Samo-induktivni aspekt je karakterisitican za induktivnu definiciju.
2.I nil i op:: su polimorfni tipovi. Nil je prazna lista koja se nalazi na kraju ili repu svake liste..Dakle, bilo
koji element moze doci kao glava ove liste.
op:: konstruise listu nezavisnu od elemenata od kojih ce se sastojati.
Rad sa listama :
operator :: je desno asocijativan . Npr. h1::h2::h3::t, prvo ce da spoji h3 sa t, pa h2 sa tim i na kraju
dodati h1. Dobija se lista [h1,h2,h3,...] ili [h1,h2,h3] ako je t bilo nil.
Ova notacija naglasava interpretaciju listi kao konacan niz vrijednosti, ali skriva osnovni induktivni
karakter lista tako sto se one grade uz operator :: i nil.

Prolog: susjedni(X,Y,[X,Y|Zs]).
susjedni(X,Y,[Z|Zs]):-susjedni(X,Y,Zs).
poslednji(X,[X]).
poslednji(X,[Y|Ys]):-poslednji(X,Ys).
primjer, treba dodatna objasnjenja... na osnovu primjera.

10.Stek, specifikacija i implementacija.


3.3 Stekovi
Jos jedan nacin cuvanja podataka je u steku. Stek se obicno implementira sa samo dve glavne operacije
(pored konstruktora i destruktora, naravno):

push

stavlja objekat na stek

pop

skida poslednji stavljeni objekat sa steka

Uobicajeni model steka je gomila tanjira. Tanjiri se "stavljaju" ("push") na vrh gomile, i "skidaju" ("pop")
takodje sa vrha.
Stekovi obrazuju LIFO (Last-In-First-Out = Poslednji-Unutra-Prvi-Van) redove .
Stek je jednostavno jos jedan skup objekata, pa bi stoga bilo moguce koristiti istu specif
Primetimo:kaciju kao i za opsti skup. Medjutim, skupovi sa LIFO semantikom steka su toliko vazni u
racunarskoj nauci da ogranicena specifikacija steka nalazi svoju punu potvrdu.
Iako je moguce implementirati stek pomocu povezane liste (dodavanje i brisanje sa glave povezane liste
daje upravo LIFO semantiku steka), najcesce primene steka imaju memorijsko ogranicenje, tako da je
implementacija pomocu niza prirodnija i efikasnija (Kod vecine operativnih sistema, alokacija i dealokacija memorije je relativno skupa operacija, tako da postoji nedostatak u brzini na racun
fleksibilnosti implementacija pomocu povezane liste.).
11.Red za cekanje, definicija i implementacija

nema.. xD

You might also like