glavni funktor je vedno tisti z najvisjo stevilko prioritete, + in - imata enako, sta pa definirana oba kot yFx.
yFx je kljucen, to pomeni da je na levi strani lahko izraz ki ima enako prioriteto, na desni pa mora imeti manjso; v praksi to pomeni, da se v izrazu z vec plusi ali minusi vedno sesteva z leve (dno drevesa), konca pa na desni (tam je koren drevesa in glavni funktor). zato je spodnji izraz enak "-( +(a,b), *(2,c) )" - na levi strani imamo izraz +(a,b), zato ker je na levi strani lahko argument z isto priroteto. in iz istega razloga izraz "+(a, -(b, 2*c) )" ni mogoc, ker ima na desni strani izraz -(b, 2*c) ki ima isto prioriteto; to pa po definiciji operatorja ne more biti, saj je + definiran z yFx; ce bi bil xFy bi pa slo. se enkrat: v praksi je najlazje tko, da pomnozis najprej vse produkte, potem pa imas samo clene z vmesnimi plusi in minusi, takrat pa zacnes sestevati na levi in gres proti desni... ko zakljucis na desni, si pri glavnem funktorju. 2008/6/22 gyga <[EMAIL PROTECTED]>: > Ce naredim tole > > functor(a + b - 2 * c, F, A). > > dobim > F=-, > A=2; > se pravi ne gleda prvega znaka. > 2008/6/22 Miha Cerar <[EMAIL PROTECTED]>: > >> hm, sem mal gledal tole: >> >> http://books.google.si/books?id=0YtoWjWaCAoC&pg=PA162&lpg=PA162&dq=prolog+predicate+functor&source=web&ots=1Xp33bL9iR&sig=0VMs4gT3SSlQVPzkVaXnMxHk5Tg&hl=en&sa=X&oi=book_result&resnum=3&ct=result#PPA162,M1 >> >> sedaj bolj razumem, čeprav mi ni ravno jasno kako gleda to.. >> >> lp >> >> 2008/6/22 gyga <[EMAIL PROTECTED]>: >> >> > Verjetno zato, ker pobere prvega. To je +. >> > >> > Se motim? >> > >> > 2008/6/22 Miha Cerar <[EMAIL PROTECTED]>: >> > >> > > Zakaj je tukaj : functor(a + b + 2 * c, F, A). - glavni funktor + >> (beri: >> > > plus)? >> > > torej dobimo >> > > F=+, >> > > A=2; >> > > >> > > lp >> > > >> > > 2008/6/22 Matjaz Horvat <[EMAIL PROTECTED]>: >> > > >> > > > Ta del je potem kvečjemu: >> > > > >> > > > integer(X), X<=9, X>=9; >> > > > atom(X), member(X, [a,b,c,d,e,f]). >> > > > >> > > > lpM >> > > > >> > > > 2008/6/22 Miha Cerar <[EMAIL PROTECTED]>: >> > > > >> > > > > ne, v seznamu mankajo še št. od 0-9, al pa pomoje če bi se naredil, >> > da >> > > če >> > > > > je >> > > > > integer(X)<9. >> > > > > >> > > > > 2008/6/22 Matjaz Horvat <[EMAIL PROTECTED]>: >> > > > > >> > > > > > 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 >> > > > > > >> >> >> >> > > >> >> > > > > > >> >> >> >> > > > >> > > > > > >> >> >> >> > > > >> > > > > > >> >> >> >> > > >> > > > > > >> >> >> >> > >> > > > > > >> >> >> > >> > > > > > >> >> >> >> > > > > > >> >> > >> > > > > > >> >> >> > > > > > >> > >> > > > > > >> >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> >
