Professional Documents
Culture Documents
Odgovori II 1-11
Odgovori II 1-11
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.
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).
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.
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).
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
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.
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.
push
pop
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