A ta 4. je ok: http://www.e-studij.si/UL/FRI/UNI-RI/MOS/Izpiti/2007-12-10-prolog
A to pomeni da potem ni treba preverjati števil, ker so že zagotovo not? Samo za atome je potrebno preveriti, da so a - e? lpM 2008/6/22 Matjaz Horvat <[EMAIL PROTECTED]>: > Hehe, saj res, s tole notacijo zgleda precej bolj optimalno, čeprav je > vsebinsko rešitev ista. > > Hvala. > > > lpM > > 2008/6/22 Uroš Jurglič <[EMAIL PROTECTED]>: > >> memberBT(X, b(_,X,_)). >> memberBT(X, b(L,_,R)) :- memberBT(X, L) ; memberBT(X, R). >> >> hmm, kar je pravzaprav cist isto kot spodaj :) >> >> prvo pravilo: uspe, ce je X v node-u >> drugo pravilo: uspe, ce je X ali v levem ali v desnem poddrevesu... >> ce je L ali R nil se itak ne ujame na nobeno pravilo, saj ni oblike >> b(...), tko da memberBT(X, nil) nikol ne uspe >> >> 2008/6/22 Matjaz Horvat <[EMAIL PROTECTED]>: >> > Tale gotovo ni prav... >> > >> > Binarna drevesa so podana v obliki b(L, E, R), kjer sta L in R levo >> oziroma >> > desno poddrevo, E pa element v vozlišču. Prazno drevo predstavlja simbol >> > nil. Drevo z enim samim elementom je tako b(nil, E, nil). Napišite >> predikat >> > memberBT(X, BT), ki z vračanjem vrne vse elemente X binarnega drevesa >> BT! >> > >> > memberBT(X, b(L, X, R)). >> > memberBT(X, b(L, _, R)):-memberBT(X,L). >> > memberBT(X, b(L, _, R)):-memberBT(X,R). >> > >> > Se komu sanja kako se to reši? >> > >> > lpM >> > >> > 2008/6/22 Uroš Jurglič <[EMAIL PROTECTED]>: >> > >> >> evo tole deluje: >> >> L=[7,1,12,7,8,1], conc(First,[X|_],L), findall(Y, (member(Y,First), >> >> Y>X), LX), length(LX,0). >> >> >> >> btw: s setof ne dela, ker setof ne vrne praznega seznama, ampak >> >> preprosto ne uspe... findall pa vedno uspe, ampak ko ni zadetkov vrne >> >> prazen list. >> >> >> >> >> >> >> >> >> >> 2008/6/21 Miha Cerar <[EMAIL PROTECTED]>: >> >> > pomoje je potrebno kaj takega spravt v rekurzijo: >> >> > ?- _L=[7,1,12,7,8,1], conc(_,[P,_B|_],_L),P>_B. >> >> > delamo na tem :) >> >> > >> >> > >> >> > >> >> > 2008/6/21 Uroš Jurglič <[EMAIL PROTECTED]>: >> >> > >> >> >> kaj pa tole? >> >> >> e) Z vračanjem poišči vse elemente seznama L, pred katerimi v >> seznamu >> >> >> ni nobenega večjega elementa! (npr, v L = [7,1,12,7,8,1] sta taka >> >> >> elementa 7 in 12)! >> >> >> >> >> >> 2008/6/21 Uroš Jurglič <[EMAIL PROTECTED]>: >> >> >> > setof( X, A^B^(parent(X,A), parent(X,B), not(A=B), female(A), >> >> >> > female(B)), L ), length(L, N). >> >> >> > >> >> >> > tole bi po logiki slo, nisem pa sprobal... >> >> >> > >> >> >> > >> >> >> > 2008/6/21 Miha Cerar <[EMAIL PROTECTED]>: >> >> >> >> >> >> >> >> Mal resujem naloge, in ce gre se kdo..bi mogocel znal vprasat >> prolog >> >> >> tole: >> >> >> >> imate podano družinsko drevo (z relacijami parent ter >> male/female) >> >> >> -koliko >> >> >> >> ljudi ima več kot dve hčerki? >> >> >> >> Znam izpisat št. vseh ki imajo hči, več pa ne .. >> >> >> >> Anyone? >> >> >> >> >> >> >> >> lp >> >> >> >> >> >> >> >> 2008/6/21 Uroš Jurglič <[EMAIL PROTECTED]>: >> >> >> >> >> >> >> >> > Jaz tuki ne vidim nobene razlike, vsaj ce imas class takole >> >> definiran: >> >> >> >> > class(X, positive) :- X>0. >> >> >> >> > class(X, negative) :- X<0. >> >> >> >> > >> >> >> >> > Potem gre pri splitu z rezom za 'zeleni rez' - ni deklarativne >> >> >> razlike, je >> >> >> >> > samo postopkovna (torej samo optimizacija). >> >> >> >> > >> >> >> >> > Ce pozenem obe verziji in da uporabim zgornjo definicijo class, >> >> dobim >> >> >> vedno >> >> >> >> > isti rezultat in ne tko kot si ti napisal. Razen ce imas class >> kako >> >> >> drugace >> >> >> >> > definiran..? >> >> >> >> > >> >> >> >> > >> >> >> >> > >> >> >> >> > >> >> >> >> > >> >> >> >> > 2008/6/21 Miha Cerar <[EMAIL PROTECTED]>: >> >> >> >> > >> >> >> >> > > Še bolj postopkovno razloženo :) >> >> >> >> > > >> >> >> >> > > če ni reza dobiš tole: >> >> >> >> > > >> >> >> >> > > | ?- split([1,2,-3],P,L) . >> >> >> >> > > L = [-3], >> >> >> >> > > P = [1,2] ? ; >> >> >> >> > > >> >> >> >> > > L = [2,-3], >> >> >> >> > > P = [1] ? ; >> >> >> >> > > >> >> >> >> > > L = [1,-3], >> >> >> >> > > P = [2] ? ; >> >> >> >> > > >> >> >> >> > > L = [1,2,-3], >> >> >> >> > > P = [] ? >> >> >> >> > > >> >> >> >> > > če pa je pa samo pravilno: >> >> >> >> > > | ?- >> >> >> >> > > split([1,2,-3],P,L) >> >> >> >> > > . >> >> >> >> > > >> >> >> >> > > L = [-3], >> >> >> >> > > P = [1,2] ? ; >> >> >> >> > > >> >> >> >> > > 2008/6/21 Miha Cerar <[EMAIL PROTECTED]>: >> >> >> >> > > >> >> >> >> > > > verzija brez reza lahko pri vračanju kliče cilj class(X, >> >> >> >> > > positive/negative) >> >> >> >> > > > ne glede na to, kakšen je X >> >> >> >> > > > >> >> >> >> > > > 2008/6/21 Matjaz Horvat <[EMAIL PROTECTED]>: >> >> >> >> > > > >> >> >> >> > > > REZ >> >> >> >> > > >> split([],[],[]). >> >> >> >> > > >> split([X|R],[X|R1],N):-class(X,positive),!, split(R,R1,N). >> >> >> >> > > >> split([X|R],P,[X|R1]):-class(X,negative), split(R,P,R1). >> >> >> >> > > >> >> >> >> >> > > >> BREZ >> >> >> >> > > >> split([],[],[]). >> >> >> >> > > >> split([X|R],[X|R1],N):-class(X,positive), split(R,R1,N). >> >> >> >> > > >> split([X|R],P,[X|R1]):-class(X,negative), split(R,P,R1). >> >> >> >> > > >> >> >> >> >> > > >> Najdite in razložite problem pri verziji brez reza >> (verzija >> >> brez >> >> >> reza >> >> >> >> > > >> lahko >> >> >> >> > > >> pri vračanju >> >> >> >> > > >> kliče cilj class(X, positive/negative) ne glede na to, >> kakšen >> >> je >> >> >> X). >> >> >> >> > > >> >> >> >> >> > > >> V čem je torej problem, če ni reza? >> >> >> >> > > >> >> >> >> >> > > >> lpM >> >> >> >> > > >> >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > >> >> >> >> > >> >> >> > >> >> >> >> >> > >> >> >> > >> > >
