Algebraic data types: Difference between revisions

Content added Content deleted
m (Added to <5 category)
(Added Prolog version (untested))
Line 53: Line 53:
in let T (_,a,y,b) = ins s
in let T (_,a,y,b) = ins s
in T (B,a,y,b)
in T (B,a,y,b)

=={header|Prolog}}==
<prolog>
color(r).
color(b).

tree(e).
tree(t(C,L,_,R)) :- color(C), tree(L), tree(R).

balance(b, t(r,t(r,A,X,B),Y,C), Z, D, t(r,t(b,A,X,B),Y,t(b,C,Z,D))):-!.
balance(b, t(r,A,X,t(r,B,Y,C)), Z, D, t(r,t(b,A,X,B),Y,t(b,C,Z,D))):-!.
balance(b, A, X, t(r,t(r,B,Y,C),Z,D), t(r,t(b,A,X,B),Y,t(b,C,Z,D))):-!.
balance(b, A, X, t(r,B,Y,t(r,C,Z,D)), t(r,t(b,A,X,B),Y,t(b,C,Z,D))):-!.
balance(C, A, X, B, t(C,A,X,B)).

ins(X,e,t(r,e,X,e)) :- !.
ins(X,t(C,A,Y,B),R) :- X < Y, !, ins(X,A,Ao), balance(C,Ao,Y,B,R).
ins(X,t(C,A,Y,B),R) :- X > Y, !, ins(X,B,Bo), balance(C,A,Y,Bo,R).
ins(_,S,S).

insert(X,S,t(b,A,Y,B)) :- ins(X,S,t(_,A,Y,B)).
<prolog>