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...