:- pred constr(bool). :- mode constr(in). :- ignore constr/1. :- type tree(D) ---> leaf ; node( D, tree(D), tree(D) ). % empty tree key left-subtree right-subtree % tree(d) is the type of the trees whose keys have type D. % Here we assume that "D" is "int". Note: duplicates are NOT allowed. % ========================================================== % Program. % https://algs4.cs.princeton.edu/32bst/ :- pred bstdelete(int,tree(int),tree(int)). :- mode bstdelete(in,in,out). bstdelete(X,leaf,leaf). % note deleting X from empty tree succeeds. bstdelete(X,node(A,leaf,R), R) :- constr(X=A). bstdelete(X,node(A,L,leaf), L) :- constr(X=A). bstdelete(X,node(A,L,R), node(Succ,L,T) ) :- constr(X=A & IsDef), bstdeletemin(R, T, Succ, IsDef). bstdelete(X,node(A,L,R), node(A,L1,R)) :- constr(X N>MaxL)) & (LeqRight=(IsDefR => NMaxR, ite(MaxL>N,MaxL,N), ite(MaxR>N,MaxR,N) ), % max(MaxL,max(MaxR,N)) ite(IsDefL, ite(MaxL>N,MaxL,N), % max(MaxL,N) ite(IsDefR & MaxR>N,MaxR,N))))). % max(MaxR,N) % ---- :- pred treemin(tree(int),bool,int). :- mode treemin(in,out,out). :- cata treemin/3-1. treemin(leaf,IsDef,Min) :- constr(~IsDef & Min=0). treemin(node(N,L,R),IsDef,Min) :- treemin(L,IsDefL,MinL), treemin(R,IsDefR,MinR), constr(IsDef & (Min= ite(IsDefL & IsDefR, ite(MinL bstree(T1,B1), treecount(Y,T1,C1), treecount(Y,T2,C2) => constr( B1 => C2=ite(X=Y, 0, C1 ) ). % the contract on bstdelete is NOT checked % without the following contract on bstdeletemin :- spec bstdeletemin(T1,T2,Min,IsDef) ==> bstree(T1,B1), treecount(Y,T1,C1), treecount(Y,T2,C2) => constr( (IsDef & B1) => C2=ite(Min=Y, 0, C1 ) ). % ========================================================== % Verification. :- pred ff1. ff1 :- constr(~ ( B1 => C2=ite(X=Y, 0, C1 ) )), bstree(T1,B1), treecount(Y,T1,C1), treecount(Y,T2,C2), bstdelete(X,T1,T2). :- pred ff2. ff2 :- constr( ~( (IsDef & B1) => C2=ite(Min=Y, 0, C1 ) )), bstree(T1,B1), treecount(Y,T1,C1), treecount(Y,T2,C2), bstdeletemin(T1,T2,Min,IsDef). % ========================================================== % NON-CATA predicates: bstdelete bstdeletemin constr