» Poradna » Zpět na dotaz

RE: Prolog - strom

STU  |  15. 8. 2008 3:59:19  |  Odpovědí: 13

No hned pre zaciatok - vseobecny binarny strom ma hodnoty aj vo vnutornych uzloch, cize spravne by si mal mat hodnotu aj v strukture tree, strom by som skor definoval takto (ak je aj prazdny strom stromom... nech sa to nekomplikuje):

tree(_,L,R) :-
tree(L), tree(R).
tree(nil).


"potrbujem definovat funkciu swap/2, ktore vymeni prvy v strome takze:"

Nenapisal si sice, ze co "prvy" sa ma vymenit... :P Ale pokial by si chcel vymenit podstromy len na prvej urovni, tak je to primitivne jednoduche:

swapped( tree(X,L,R), tree(X,R,L) ).


Ak to chces na vsetkych urovniach:

swapped( nil, nil ).
swapped( tree(X, L1, R1) , tree(X, L2, R2) ) :-
swapped( L1, R2 ),
swapped( R1, L2 ).


Potom to funguje napriklad takto:

?- swapped(tree(4,tree(1,nil,nil),tree(5,tree(4,nil,nil),tree(5,nil,nil))),X).
X = tree(4, tree(5, tree(5, nil, nil), tree(4, nil, nil)), tree(1, nil, nil)).

--------------------------------------------------------------------

Ak to nutne musi byt podla tvojej definicie, tzn. s leaf a bez hodnot vo vnutornych uzloch, tak definica:

leaf(_).

strom(leaf(_)).
strom(L,R) :-
strom(L),
strom(R).


Potom vymena iba priamych nasledovnikov rovnako jednoducho:

swapped(leaf(X), leaf(Y)).
swapped( tree(L,R), tree(R,L) ).


Alebo na vsetkych urovniach:

swapped( leaf(X), leaf(X) ).
swapped( tree(L1, R1) , tree(L2, R2) ) :-
swapped( L1, R2 ),
swapped( R1, L2 ).



Tvoj priklad:

?- swapped(tree(tree(leaf(1), leaf(2)), leaf(4)),T).
T = tree(leaf(4), tree(leaf(2), leaf(1))).



Btw. testoval som len "mnohourovnove" verzie a aj to iba zlahka, takze mozno su tam chyby...

Jméno:
 

E-mail (nepovinné, adresa bude v zabezpečené podobě zobrazena u přezdívky):

:-D :-)) :-) ;-) :-P :-| :-/ :-( 3-[ :-O B-]

Pravidla diskuzí v Poradně webu Živě.cz

Zasláním příspěvku do Poradny souhlasíte s těmito pravidly:

  • Podmínky užívání služby informační společnosti
  • Informace o zpracování osobních údajů
  • Příspěvky se musí týkat tématu otázky.
  • Příspěvky nesmí obsahovat vulgární výrazy a slovní útoky na jiné osoby. Příspěvky nesmí poškozovat web Živě.cz ani jeho provozovatele.
  • Je zakázáno vkládat do příspěvků odkazy na stránky nabízející obsah porušující autorská a jiná práva.
  • Příspěvky nelze využívat k propagaci.
  • Příspěvky, které porušují pravidla diskuzí, budou odstraněny. Případně budou upraveny tak, aby neporušovaly pravidla diskuzí. V textu bude následně uvedeno, že příspěvky byly ze strany moderátorů upraveny.
  • Právo moderovat Poradnu mají pouze zástupci vybraní redakcí Živě.cz. Základní kontrola příspěvku probíhá ještě před jeho zveřejněním.
  • Živě.cz je soukromý web a provozovatel má při řešení sporů, které se týkají příspěvků v Poradně, vždy konečné slovo.

Kdy vám můžeme smazat příspěvek?

  • Když budete vulgární.
  • Když budete slovně útočit na ostatní.
  • Když se nebudete držet tématu dotazu.
  • Když budete poradnu zneužívat pro reklamu.
  • Když záměrně zneužijete cizí přezdívku.
  • Když budete porušovat zákony.
  • A když budete na takové příspěvky reagovat, protože se vždy mažou včetně odpovědí ve stromu.