PROLOG
1) Definujte predikat orez(+Seznam obdelniku, +Okno, -Seznam orezanych obdelniku), ktery vyreze z kazdeho daneho obdelniku tu cast, ktera se nachazi v okne a hodi ji na vystup. Nachazi-li se obdelnik uplne mimo okno, na vystup neprijde misto nej nic.
Obdelniky jsou zadany nasledovne: o(XD,YD,XH,YH) - [XD,YD] jsou souradnice leveho dolniho rohu a [XH,YH] jsou souradnice praveho horniho rohu obdelniku.
Okno je zadano jako obdelnik.
Priklad:
?- orez([o(1,1,3,3),o(2,3,5,4)],o(2,2,4,4),V).
V = [o(2,2,3,3),o(2,3,4,4)].
Reseni:
Kód: Vybrat vše
orez([],_,[]).
orez([o(XD,YD,XH,YH)|Zb], o(XL,YL,XP,YP), [o(XD1,YD1,XH1,YH1)|V]) :-
orez_obd(XD,XH,XL,XP,XD1,XH1), XD1 \== nil,
orez_obd(YD,YH,YL,YP,YD1,YH1), YD1 \== nil, !,
orez(Zb, o(XL,YL,XP,YP), V).
orez([_|Zb], Okno, V) :- orez(Zb, Okno, V).
orez_obd(D,H,L,P,D,H) :- D >= L, H =< P, !.
orez_obd(D,H,L,P,L,H) :- D =< L, H >= L, H =< P, !.
orez_obd(D,H,L,P,D,P) :- D >= L, D =< P, H >= P, !.
orez_obd(D,H,L,P,L,P) :- D =< L, H >= P, !.
orez_obd(_,H,L,_,nil,nil) :- H =< L, !.
orez_obd(D,_,_,P,nil,nil) :- D >= P.
Priklad:
?- troj( [a-[b,c], b-[a,c,d], c-[a,b,d], d-[b,c]], T ).
T = [[a, b, c], [b, c, d]].
Reseni:
Kód: Vybrat vše
troj(G,T) :- setof(S, trojuh(G,S), T).
trojuh(G,T) :- select(V1,G,G1), select(V2,G1,G2), select(V3,G2,_),
je_trojuh(V1,V2,V3), oznaceni(V1,V11), oznaceni(V2,V22), oznaceni(V3,V33), sort([V11,V22,V33], T).
je_trojuh(V1-S1,V2-S2,V3-S3) :- member(V2,S1), member(V3,S2), member(V1,S3).
oznaceni(V-S,V).
1) Definujte funkci gen, ktera se vstupnim parametrem typu Int vytvori nekonecny seznam seznamu prirozenych cisel, serazenych maximo-lexikograficky, tzn.:
a) pro libovolne takove 2 seznamy S1 a S2 plati, ze je-li maximum S1 < maximum S2, pak je S1 pred S2 ve vytvarenem seznamu
b) je-li max S1 = max S2, pak rozhoduje lexikograficke pravidlo, tzn. "jdi tak dlouho v obou seznamech, dokud nenarazis na prvni prvek, kde se lisi, a seznam s mensim prvkem umisti pred druhy"
Priklad:
take 10 (gen 2)
=> [[0,0],[0,1],[1,0],[1,1],[0,2],[1,2],[2,0],[2,1],[2,2],[0,3]]
Reseni:
Kód: Vybrat vše
gen n = genN n 0
genN n max = (filter (any (==max)) (genS n max)) ++ (genN n (max+1))
genS 0 _ = []
genS 1 max = [[a] | a<-[0..max]]
genS n max = [a:b | a<-[0..max], b <- predchozi]
where predchozi = genS (n-1) max
data BStrom a = List | Vrchol (BStrom a) a (BStrom a)
Definujte funkci fold pro takovy binarni strom, tzn.:
fold:: ...
Tenhle priklad jsem nedelal (a dokonce ani nemuzu zarucit, ze tenhle malej kus je dobre), takze prosim omluvte mou nedostatecnou pamet a komentujte :p
Mno, a zbyva velky priklad (jako obvykle, jazyk jste si mohli vybrat):
5) Mame zadane dvojice vet ve dvou jazycich, tzn. veta a jeji preklad - oboje zadano jako usporadany seznam slov.
Z toho mame pomoci nami zvolene heuristiky nalezt co nejlepsi vykladovy slovnik typu: (Slovo prvniho jazyka) -> (Slovo druheho jazyka).
Mejte na pameti, ze:
a) jedno slovo muze mit vice prekladu
b) pocet slov vety a jejiho prekladu se muze povelmi ruznit
c) na slovosled nemuzeme brat ohled
d) nemusime resit sklonovani atd (jedno slovo se vyskytuje ve vsech vetach prave v jednom tvaru)
e) neco, co moje pamet hodila do trychtyre.
Alespon takhle nejak jsem to pochopil a takhle nejak si to pamatuju