Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Prolog, zanoreni seznamu.

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Prolog, zanoreni seznamu.

Autor: Marek Schneider

17:17:08 08.04.2009

Dekuji moc.

Citovat příspěvek

 

Re: Prolog, zanoreni seznamu.

Autor: Luinar

13:34:26 05.04.2009

Zdravim.
Rozpis pro
hloubkaOb([5,[6]],X) vypada:
1. pravidlo nevyhovuje automaticky
2. pravidlo vyhovuje pokud plati:
a) hloubkaOb(5,R1) -> je splneno podle tretiho pravidla pokud R1=0
b) hloubkaOb([[6]],R2) -> rozebereme pozdeji
c) R3 je R1+1 -> je splneno kdyz R3=1 (protoze R1 musi byt podle a) rovno 0)
d) max(R3,R2,X) -> X musi byt max z 1 a R2

2. uroven zanoreni:
b) tj. hloubkaOb([[6]],R2) se vyhodnocuje nasledujicim zpusobem:
1. pravidlo opet nevyhovuje automaticky
2. pravidlo se rozpada na pravidla ktera je treba splnit:
a) hloubkaOb([6],S1)
b) hloubkaOb([],S2) -> podle prvniho pravidla dany vyrok plati, pouze tehdy pokud S2=1
c) S3 = S1 + 1
d) max(S3,S2,R2) -> v R2 musi byt maximalni hodnota S2 z S3, a vzhledem k tomu, ze S2=1, tak to bude S1+1 (S1 muze byt nejmene 0)

3. uroven zanoreni:
Tentokrat zjistujeme, zdali plati a) tj. hloubkaOb([6],S1):
1. pravidlo nic
2. pravidlo vede na:
a) hloubkaOb(6,T1) -> z 3. pravidla vim, ze to plati pokude je T1=0
b) hloubkaOb([],T2) -> 1. pravidlo a T2=1
c) T3 = T1 + 1 -> T3=1
d) max(T3,T2,S1) -> S1 musi byt tedy 1

Navrat o uroven vyse a vime, ze S1 musi byt 1, tedy S3 musi byt 2 => R2=2
Opet se vratime o uroven vyse a vysledek je max(R3=1,R2=2,X) tj. X=2 ...

Snad jsem to rozepsal dostatecne prehledne.

Ad BTW: Je to spise hobby, ale obcas se Prolog hodi na otestovani si nejakych myslenek, aby clovek ten backtrack nemusel cely psat sam.

Preji prijemny den
Luinar

Citovat příspěvek

 

Re: Prolog, zanoreni seznamu.

Autor: Marek Schneider

15:46:37 04.04.2009

Luinar: Dekuji mnohokrat, vase reakce mi moc pomohla, hlavne ten druhy priklad s maximem uz konecne funguje a navic i chapu proc:)

Jeste k tomu prvnimu bych mel dotaz. Priklad s jednoduchym polem (se zanorenim 1) chapu, ale nejak mi neni jasne, kde dochazi k inkrementaci pocitadla hloubky zanoreni. Teda je mi jasne ze to bude toto: R3 is R1 + 1 (protoze jina inkrementace tam neni) ale nejak mi nedochazi proc. Mohl byste prosim rozepsat napriklad tento priklad, tak jako predtim:

hloubkaOb([5,[6]],X).

Chapu kde se vezmou ty jednicky, jenze pak mi pripada, ze se porad jen vybirani vetsi ze dvou jednicek, coz je jedna a tak nevim kde se tam nakonec vezme ta vysledna dvojka.

Btw, vy programujete v prologu profesionalne nebo je to jen vase hobby?

Citovat příspěvek

 

Re: Prolog, zanoreni seznamu.

Autor: Luinar

12:23:58 04.04.2009

V tom prvnim pripade ten treti radek Vam rika, ze kdyz dostanete cokoliv jineho nez seznam vratte nulu. Je to tam kvuli tomu, ze dane pole obsahuje i cisla a stringy. Viz jednoduchy priklad vyhodnoceni:
maximumOb([5],?)
1. pravidlo nevyhovuje.
2. pravidlo vede na:
maximumOb(5,R1) -> nevyhovuje prvnimu ani druhemu pravidlu, ale prave az tretimu tj. R1 = 0, kdyby tam nebylo, pak nelze vyhodnotit a cela vetev vypoctu hodi FALSE.
maximumOb([],R2) -> vyhovuje prvnimu pravidlu
... dokonci se vypocet

Takze u toho druheho prikladu tam mate 2 pravidla, ktera jsou OK, ale to treti mi prijde redundantni. Resil bych to treti pravidlo:
maximumOb(H,H) :- integer(H), !.
a pridal ctvrte pravidlo
maximumOb(_,0).
To v pripade ze by v poli byl string. Misto 0 muzete zvolit jinou minimalni hodnotu.

fasdfasdfasdf: Odpovidat na otazku jak jde neco udelat v Prologu tim jak se to dela v Jave a C je ponekud mimo misu.

Snad jsem aspon trochu pomohl
Luinar

Citovat příspěvek

 

Re: Prolog, zanoreni seznamu.

Autor: fasdfasdfasdf

23:11:01 03.04.2009

jo milacku, prolog, do toho ja nevidim a ani nechci videt.
v C, C++, C#, Java klidne, ale prolog bohuzel.

Citovat příspěvek

 

Re: Prolog, zanoreni seznamu.

Autor: Marek Schneider

17:42:31 03.04.2009

dfsgsdfgsdfg: A jak byste toto v prologu implementoval?

Citovat příspěvek

 

Re: Prolog, zanoreni seznamu.

Autor: dfsgsdfgsdfg

12:00:35 03.04.2009

ja bych hloubku zanoreni zjistoval podle poctu levych zavorek, ktere nemaji hned u sebe blizko svou pravou zavorku.

Citovat příspěvek

 

Prolog, zanoreni seznamu.

Autor: Marek Schneider

18:41:23 02.04.2009

Dobry den,

ucim se programovat v jazyce Prolog a rad bych vam zkusenejsim polozil dva dotazy:

1) Chtel jsem udelal predikat na zjisteni maximalniho zanoreni obecneho seznamu, napriklad [1,2,[3,4,[5,6]]] ma zanoreni 3. To jsem vsak nejak nezvladnul, ale nasel jsem reseni:

hloubkaOb([],1).
hloubkaOb([H|T],R) :- hloubkaOb(H,R1), hloubkaOb(T,R2), R3 is R1 + 1,max(R3,R2,R).
hloubkaOb(_,0).

Jenze ho nedovedu pochopit, k cemu prosim slouzi ten treti radek? Mohl by mi to prosim nekdo lidsky vysvetlit?

2) Dale jsem chtel udelat predikat, ktery zjisti maximalni hodnotu v obecnem seznamu. Dosel jsem v tomuto reseni, ktere bohuzel nefunguje:

max(X,Y,X) :- X>Y, !.
max(X,Y,Y).

maximumOb([],0).
maximumOb([H|T],MAX) :- maximumOb(H,M1),maximumOb(T,M2),max(M1,M2,MAX).
maximumOb([H|T],MAX) :- integer(H),maximumOb(T,H).

Zajimalo by me, jak moc jsem blizko, co je potreba doplni/zmenit aby to fungovalo, nebo zda je to naprosty nesmysl.

Predem dekuji za reakce.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: