// Adapted from Nguyen Huu Hai's example // Must be executed on non-empty list // If a is already stored, ignore. void insert(node2 x, int a) { // <0> if (a < x->val) { //if a is lower, we go down in the left subtree // <1> if (x->left == NULL) { // <2> x = x->left = new node2(a,NULL,NULL); } else { // <3> insert(x->left,a); // x = x->left; goto <0> } } else if (a > x->val) { //if a is bigger, we go down on the right subtree // <4> if (x->right == NULL) { // <5> x = x->right = new node2(a,NULL,NULL); } else { // <6> insert(x->right,a); // x = x->right; goto <0> } } // if a == x->val, do nothing // <7> } CLP Specification: ================== path(H,X,X,E,{X}). path(H,X,Y,E,S) :- T * {X} = S, H[X+1]!=null, EH[X], path(H,H[X+2],Y,E,T). bst(H,X,{X}) :- H[X+1]=null, H[X+2]=null. bst(H,X,S) :- H[X+1]!=null, H[X]>max(H[SL]), bst(H,H[X+1],SL), H[X+2]!=null, H[X]max(H[SL]), bst(H,H[X+1],SL), H[X+2]=null, SL * {X} = S. bst(H,X,S) :- H[X+1]=null, H[X+2]!=null, H[X]S path(Hf,X0,Xf,A,T), bst(Hf,X0,S), in(Xf,S), Hf[Xf]=A |= bst(Hf,X0,S), max(H[S])=max(cup({A},H[S])), min(H[S])=min(cup({A},H[S])) STOP: DIRECT PROOF (cup({A},H[S]) = H[S] since in(Xf,S)) = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = N4: LEFT UNFOLD N1b p(2,H,X,A,Hf,Xf), path(H,X0,X,A,T), bst(H,X0,S), in(X,S), A, New!=null, H[New]=A, H[New+1]=null, H[New+2]=null, X'=H'[X+1] |= bst(Hf,X0,?U), max(H[?U])=max(cup({A},H[S])), min(H[?U])=min(cup({A},H[S])) N6: LEFT UNFOLD N5 path(H,X0,X,A,T), bst(H,X0,S), in(X,S), A, New!=null, H[New]=A, H[New+1]=null, H[New+2]=null, Xf=Hf[X+1] |= bst(Hf,X0,?U), max(H[?U])=max(cup({A},H[S])), min(H[?U])=min(cup({A},H[S])) N7: REMOVE Hf, Xf path(H,X0,X,A,T), bst(H,X0,S), in(X,S), A,X0,?U), max(H[?U])=max(cup({A},H[S])), min(H[?U])=min(cup({A},H[S])) N8a: LEFT UNFOLD N7 path (rule 1) bst(H,X,S), in(X,S), A,X,?U), max(H[?U])=max(cup({A},H[S])), min(H[?U])=min(cup({A},H[S])) = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = N9a: LEFT UNFOLD N8a (bst rule 1) H[X+1]=null, H[X+2]=null, in(X,{X}), A,X,?U), max(H[?U])=max(cup({A},H[{X}])), min(H[?U])=min(cup({A},H[{X}])) N11: RIGHT UNFOLD N9a (3rd rule of bst) H[X+1]=null, H[X+2]=null, in(X,{X}), A[X+1]!=null, [X] > max([?SL]), bst(,[X+1],?SL), [X+2]=null, ?SL * {X} = ?U. N13: RIGHT UNFOLD N11 (bst 1st rule) H[X+1]=null, H[X+2]=null, in(X,{X}), A max([{New}]), [New+1]=null, [New+2]=null, [X+1]!=null [X+2]=null N14: RIGHT SIMPLIFY N13 (AIP) H[X]>max([{New}]) == H[X]>A (X+1 != New, H[New]=A) [New+1]=null == H[New+1]=null (X+1 != New) [New+1]=null == H[New+2]=null (X+2 != New) [X+1]!=null == New!=null [X+2]=null == H[X+2]=null H[X+1]=null, H[X+2]=null, in(X,{X}), A A, H[New+1]=null, H[New+2]=null, New!=null, H[X+2]=null. DP -------------------------------------------------------------------------------- N9b: LEFT UNFOLD N8a (4th rule of bst) H[X+2]!=null, H[X],X,?U), max(H[?U])=max(cup({A},H[SR * {X}])), min(H[?U])=min(cup({A},H[SR * {X}])) N15: RIGHT UNFOLD N9b (2nd rule of bst) H[X+2]!=null, H[X][X+1]!=null, [X]>max([?SL]), bst(,[X+1],?SL), [X+2]!=null, [X][?SR1]), bst(,[X+2],?SR1), max(H[?SL * ?SR1 * {X}])=max(cup({A},H[SR * {X}])), min(H[?SL * ?SR1 * {X}])=min(cup({A},H[SR * {X}])) N16: RU N15 (bst rule 1) H[X+2]!=null, H[X][X+1]!=null, [X]>max([[X+1]]), [[X+1]+1]=null, [[X+1]+2]=null. [X+2]!=null, [X][?SR1]), bst(,[X+2],?SR1), max(H[{[X+1]} * ?SR1 * {X}])=max(cup({A},H[SR * {X}])), min(H[{[X+1]} * ?SR1 * {X}])=min(cup({A},H[SR * {X}])) N17: ?SR1 -> SR H[X+2]!=null, H[X][X+1]!=null, [X]>max([[X+1]]), [[X+1]+1]=null, [[X+1]+2]=null, [X+2]!=null, [X][SR]), bst(,[X+2],SR), max(H[{[X+1]} * SR * {X}])=max(cup({A},H[SR * {X}])), min(H[{[X+1]} * SR * {X}])=min(cup({A},H[SR * {X}])) N18: SIMPLIFY N17 [X] == H[X] X != X+1 [X+1] == New X+1 = X+1 [X+2] == H[X+2] X+1 != X+2 [New] == H[New] {New} * SR * X [New+1] == H[New+1] {New} * SR * X [New+2] == H[New+2] {New} * SR * X [SR] == H[SR] {New} * SR * X bst(,H[X+2],SR) == bst(H,H[X+2],SR) {New} * SR * X H[X+2]!=null, H[X]max(H[New]), H[New+1]=null, H[New+2]=null, H[X+2]!=null, H[X][SR]), bst(H,H[X+2],SR), max(H[{New} * SR * {X}])=max(cup({A},H[SR * {X}])), min(H[{New} * SR * {X}])=min(cup({A},H[SR * {X}])) DP ------------------------------------------------------------------------------- N8b: LEFT UNFOLD N7 (path 2nd rule) path(H,H[X0+1],X,A,T1), bst(H,X0,S), T1 * {X0} = T, H[X0+1]!=null, A,X0,?U), max(H[?U])=max(cup({A},H[S])), min(H[?U])=min(cup({A},H[S])) N21: LEFT UNFOLD N8b (bst 2nd rule) path(H,H[X0+1],X,A,T1), bst(H,H[X0+1],SL), bst(H,H[X0+2],SR), T1 * {X0} = T, SL * SR * {X0} = S, in(X,S), Amax(H[SL]), H[X0],X0,?U), max(H[?U])=max(cup({A},H[S])), min(H[?U])=min(cup({A},H[S])) N22: AP N21,N7 path(H,H[X0+1],X,A,T1), bst(H,H[X0+1],SR), SL * SR * {X0} = S, in(X,S), A,H[X0+1],U1), max(H[U1])=max(cup({A},H[SR])), min(H[U1])=min(cup({A},H[SR])), T1 * {X0} = T, H[X0+1]!=null, Amax(H[SL]), bst(H,H[X0+1],SL), H[X0+2]!=null, H[X0],X0,?U), max(H[?U])=max(cup({A},H[S])), min(H[?U])=min(cup({A},H[S])) N23: RIGHT UNFOLD N22 (bst rule 2) path(H,H[X0+1],X,A,T1), bst(H,H[X0+1],SR), SL * SR * {X0} = S, in(X,S), A,H[X0+1],U1), max(H[U1])=max(cup({A},H[SR])), min(H[U1])=min(cup({A},H[SR])), T1 * {X0} = T, H[X0+1]!=null, Amax(H[SL]), bst(H,H[X0+1],SL), H[X0+2]!=null, H[X0][X0+1]!=null, [X0]>max(H[?SL1]), bst(,[X0+1],?SL1), [X0+2]!=null, [X0],[X0+1],?SR1), ?SL1 * ?SR1 * {X0} = ?U, max(H[?U])=max(cup({A},H[S])), min(H[?U])=min(cup({A},H[S])) -------------------------------------------------------------------------------- path(H,X,X,E,{X}). path(H,X,Y,E,S) :- T * {X} = S, H[X+1]!=null, EH[X], path(H,H[X+2],Y,E,T). bst(H,X,{X}) :- H[X+1]=null, H[X+2]=null. bst(H,X,S) :- H[X+1]!=null, H[X]>max(H[SL]), bst(H,H[X+1],SL), H[X+2]!=null, H[X]max(H[SL]), bst(H,H[X+1],SL), H[X+2]=null, SL * {X} = S. bst(H,X,S) :- H[X+1]=null, H[X+2]!=null, H[X],H[X0+1],min(A,Min),max(A,MaxL)), AMaxL, H[X0+2]!=null, H[X0],X0,min(A,Min),max(A,Max)) N23: RIGHT UNFOLD N22 (bst rule 2) bst(,H[X0+1],min(A,Min),max(A,MaxL)), AMaxL, H[X0+2]!=null, H[X0][X0+1]!=null, [X0]>?MaxL1, bst(,[X0+1],min(A,Min),?MaxL1), [X0+2]!=null, [X0],[X0+2],?MinR1,max(A,Max)), no_reach(,X0,[X0+1]), no_reach(,X0,[X0+2]), no_share(,[X0+1],[X0+2]) N24: RIGHT SIMPLIFY N23 (NOTE: X0!=X DUE TO no_visit(H,X0,H[X0+1],X,A)) AMaxL, bst(,H[X0+1],min(A,Min),max(A,MaxL)), H[X0+2]!=null, H[X0]?MaxL1, bst(,H[X0+1],min(A,MinL),?MaxL1), H[X0+2]!=null, H[X0]MaxL, bst(,H[X0+1],min(A,Min),max(A,MaxL)), H[X0+2]!=null, H[X0]max(A,MaxL), bst(,H[X0+1],min(A,MinL),max(A,MaxL)), H[X0+2]!=null, H[X0]MaxL, H[X0+2]=null, no_visit(H,X0,H[X0+1],X,A), no_reach(H,X0,H[X0+1]) |= bst(,X0,min(A,Min),max(A,Max)) N27: COINDUCTION USING N7 bst(,H[X0+1],min(A,Min),max(A,MaxL)), AMaxL, H[X0+2]=null, no_visit(H,X0,H[X0+1],X,A), no_reach(H,X0,H[X0+1]) |= bst(,X0,min(A,Min),max(A,Max)) N28: RIGHT UNFOLD N27 (3rd rule) bst(,H[X0+1],min(A,Min),max(A,MaxL)), AMaxL, H[X0+2]=null, no_visit(H,X0,H[X0+1],X,A), no_reach(H,X0,H[X0+1]) |= [X0+1]!=null, [X0]>?MaxL1, max(A,Max)=H[X0], bst(,[X0+1],min(A,Min),?MaxL1), [X0+2]=null, no_reach(,X0,[X0+1]) N29: SIMPLIFY N28 (X!=X0 DUE TO no_visit(H,X0,H[X0+1],X,A)) bst(,H[X0+1],min(A,Min),max(A,MaxL)), AMaxL, H[X0+2]=null no_visit(H,X0,H[X0+1],X,A), no_reach(H,X0,H[X0+1]) |= H[X0+1]!=null, H[X0]>?MaxL1, max(A,Max)=H[X0], bst(,H[X0+1],min(A,Min),?MaxL1), H[X0+2]=null, no_reach(H,X0,H[X0+1]) N30: RIGHT SPECIALIZE N29 WITH MaxL1=max(A,Max) bst(,H[X0+1],min(A,Min),max(A,MaxL)), AMaxL, H[X0+2]=null, no_visit(H,X0,H[X0+1],X,A), no_reach(H,X0,H[X0+1]) |= H[X0+1]!=null, H[X0]>max(A,MaxL), max(A,Max)=H[X0], bst(,H[X0+1],min(A,Min),max(A,MaxL)), H[X0+2]=null, no_reach(H,X0,H[X0+1]) STOP: DIRECT PROOF ------------------------------------------------------------------------------- N31: LEFT UNFOLD N7 (path 3rd rule) path(H,H[X0+2],X,A), bst(H,X0,Min,Max), H[X0+2]!=null, A>H[X0], A,X0,min(A,Min),max(A,Max)) N32: LEFT UNFOLD N31 (bst 2nd rule) path(H,H[X0+2],X,A), bst(H,H[X0+2],MinR,Max), AMaxL, bst(H,H[X0+1],Min,MaxL), H[X0+2]!=null, H[X0]H[X0], no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+1]), no_reach(H,X0,H[X0+2]), no_share(H,H[X0+1],H[X0+2]) |= bst(,X0,min(A,Min),max(A,Max)) N33: COINDUCTION ON N32 USING N7 A>H[X0], H[X0+1]!=null, H[X0]>MaxL, bst(H,H[X0+1],Min,MaxL), H[X0+2]!=null, H[X0],H[X0+2],min(A,MinR),max(A,Max)), no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+1]), no_reach(H,X0,H[X0+2]), no_share(H,H[X0+1],H[X0+2]) |= bst(,X0,min(A,Min),max(A,Max)) N34: RIGHT UNFOLD N33 (bst 2nd rule) A>H[X0], H[X0+1]!=null, H[X0]>MaxL, bst(H,H[X0+1],Min,MaxL), H[X0+2]!=null, H[X0],H[X0+2],min(A,MinR),max(A,Max)), no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+1]), no_reach(H,X0,H[X0+2]), no_share(H,H[X0+1],H[X0+2]) |= [X0+1]!=null, [X0]>?MaxL1, bst(,[X0+1],min(A,Min),?MaxL1), [X0+2]!=null, [X0],[X0+2],?MinR1,max(A,Max)), no_reach(,X0,[X0+1]), no_reach(,X0,[X0+2]), no_share(,[X0+1],[X0+2]) N35: RIGHT SIMPLIFY X0!=X due to no_visit(H,X0,H[X0+2],X). A>H[X0], H[X0+1]!=null, H[X0]>MaxL, bst(H,H[X0+1],Min,MaxL), H[X0+2]!=null, H[X0],H[X0+2],min(A,MinR),max(A,Max)), no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+1]), no_reach(H,X0,H[X0+2]), no_share(H,H[X0+1],H[X0+2]) |= H[X0+1]!=null, H[X0]>?MaxL1, bst(H,H[X0+1],Min,?MaxL1), H[X0+2]!=null, H[X0],H[X0+2],?MinR1,max(A,Max)), no_reach(H,X0,H[X0+1]), no_reach(H,X0,H[X0+2]), no_share(H,H[X0+1],H[X0+2]) N36: RIGHT SPECIALIZE WITH MinR1=min(A,MinR), MaxL1=MaxL A>H[X0], H[X0+1]!=null, H[X0]>MaxL, bst(H,H[X0+1],Min,MaxL), H[X0+2]!=null, H[X0],H[X0+2],min(A,MinR),max(A,Max)), no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+1]), no_reach(H,X0,H[X0+2]), no_share(H,H[X0+1],H[X0+2]) |= H[X0+1]!=null, H[X0]>MaxL, bst(H,H[X0+1],Min,MaxL), H[X0+2]!=null, H[X0],H[X0+2],min(A,MinR),max(A,Max)), no_reach(H,X0,H[X0+1]), no_reach(H,X0,H[X0+2]), no_share(H,H[X0+1],H[X0+2]) STOP: DIRECT PROOF ------------------------------------------------------------------------------- N37: LEFT UNFOLD N31 (bst 4th rule) path(H,H[X0+2],X,A), bst(H,H[X0+2],MinR,Max), AH[X0], no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+2]) |= bst(,X0,H[X0],max(A,Max)) N38: COINDUCTION USING N7 bst(,H[X0+2],min(A,MinR),max(A,Max)), H[X0+1]=null, H[X0]H[X0] no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+2]) |= bst(,X0,H[X0],max(A,Max)) N39: RIGHT UNFOLD N38 (bst 4th rule) bst(,H[X0+2],min(A,MinR),max(A,Max)), H[X0+1]=null, H[X0]H[X0] no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+2]) |= [X0]=H[X0], [X0+1]=null, [X0+2]!=null, [X0],[X0+2],?MinR1,max(A,Max)), no_reach(,X0,[X0+2]) N40: RIGHT SIMPLIFY N39 USING "NO SHARING" X0!=X due to no_visit(H,X0,H[X0+2],X,A) bst(,H[X0+2],min(A,MinR),max(A,Max)), H[X0+1]=null, H[X0]H[X0] no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+2]) |= H[X0+1]=null, H[X0+2]!=null, H[X0],H[X0+2],?MinR1,max(A,Max)), no_reach(H,X0,H[X0+2]) N41: RIGHT SPECIALIZE WITH MinR1=min(A,MinR) bst(,H[X0+2],min(A,MinR),max(A,Max)), H[X0+1]=null, H[X0]H[X0] no_visit(H,X0,H[X0+2],X,A), no_reach(H,X0,H[X0+2]) |= H[X0+1]=null, H[X0+2]!=null, H[X0],H[X0+2],min(A,MinR),max(A,Max)), no_reach(H,X0,H[X0+2]) STOP: DIRECT PROOF ------------------------------------------------------------------------------- N42: LEFT UNFOLD N3 (p) p(3,H,X,A,Hf,Xf), path(H,X0,X,A), bst(H,X0,Min,Max), AMaxL, bst(H,H[X+1],Min,MaxL), H[X+2]!=null, H[X]MaxL, bst(H,H[X+1],Min,MaxL), H[X+2]!=null, H[X]MaxL, bst(H,H[X+1],Min,MaxL), H[X+2]=null, no_reach(H,X,H[X+1]) |= H[X+1]!=null, AMaxL, bst(H,H[X+1],Min,MaxL), H[X+2]=null, no_reach(H,X,H[X+1]) |= H[X+1]!=null, AMaxL, H[X0+2]!=null, H[X0]MaxL, H[X0+2]!=null, H[X0]MaxL, H[X0+2]!=null, H[X0]MaxL, H[X0+2]!=null, H[X0]MaxL, no_visit(H,X0,H[X0+1],X,A), no_reach(H,X0,H[X0+1]) |= path(H,X0,H[X+1],A) S15: COINDUCTION OF S14 USING S0 H[X0+1]!=null, AMaxL, path(H,H[X0+1],H[X+1],A), no_visit(H,X0,H[X0+1],X,A), no_reach(H,X0,H[X0+1]) |= path(H,X0,H[X+1],A) S16: RIGHT UNFOLD S15 (path rule 2) H[X0+1]!=null, AMaxL, path(H,H[X0+1],H[X+1],A), no_visit(H,X0,H[X0+1],X,A), no_reach(H,X0,H[X0+1]) |= H[X0+1]!=null, AMaxL, path(H,H[X0+1],H[X+1],A), no_visit(H,X0,H[X0+1],X,A), no_reach(H,X0,H[X0+1]) |= H[X0+1]!=null, AH[X0], path(H,H[X0+2],X,A), AH[X0], H[X0]>MaxL, bst(H,H[X0+1],Min,MaxL), H[X0]H[X0], H[X0]>MaxL, bst(H,H[X0+1],Min,MaxL), H[X0]H[X0], H[X0]>MaxL, bst(H,H[X0+1],Min,MaxL), H[X0]H[X0], path(H,H[X0+2],H[X+1],A), no_visit(H,X0,H[X0+2],H[X+1],A) S22: SIMPLIFY S21 no_visit(H,X0,H[X0+2],H[X+1],A)=true DUE TO no_reach(H,X0,H[X0+2]) path(H,H[X0+2],H[X+1],A), H[X0+1]!=null, H[X0+2]!=null, A>H[X0], H[X0]>MaxL, bst(H,H[X0+1],Min,MaxL), H[X0]H[X0], path(H,H[X0+2],H[X+1],A), STOP: DIRECT PROOF ------------------------------------------------------------------------------- S24: LEFT UNFOLD S18 (bst rule 4) path(H,H[X0+2],X,A), AH[X0], Min=H[X0], H[X0+1]=null, H[X0]H[X0], Min=H[X0], H[X0+1]=null, H[X0]H[X0], Min=H[X0], H[X0+1]=null, H[X0]H[X0], path(H,H[X0+2],H[X+1],A), no_visit(H,X0,H[X0+2],H[X+1],A) S27: SIMPLIFY S26 no_visit(H,X0,H[X0+2],H[X+1],A)=true DUE TO no_reach(H,X0,H[X0+2]) path(H,H[X0+2],H[X+1],A), H[X0+2]!=null, A>H[X0], Min=H[X0], H[X0+1]=null, H[X0]H[X0], path(H,H[X0+2],H[X+1],A), STOP: DIRECT PROOF =============================================================================== N44: LEFT UNFOLD N0a p(4,H,X,A,Hf,Xf), path(H,X0,X,A), bst(H,X0,Min,Max), A>H[X] |= bst(Hf,X0,min(A,Min),max(A,Max)) STOP: SYMMETRIC TO N3 ------------------------------------------------------------------------------- B0: bst(H,X,Min,Max) |= Min <= Max B1: LEFT UNFOLD B0 Min=Max=H[X], H[X+1]=null, H[X+2]=null |= Min <= Max STOP: DIRECT PROOF B2: LEFT UNFOLD B0 H[X+1]!=null, H[X]>MaxL, bst(H,H[X+1],Min,MaxL), H[X+2]!=null, H[X]MaxL, Min <= MaxL, H[X+2]!=null, H[X]MaxL, bst(H,H[X+1],Min,MaxL), H[X+2]=null |= Min <= Max B5: COINDUCTION USING B0 H[X+1]!=null, H[X]>MaxL, Min <= MaxL, H[X+2]=null, Max=H[X] |= Min <= Max STOP: DIRECT PROOF B6: LEFT UNFOLD B0 H[X+1]=null, Min=H[X], H[X+2]!=null, H[X]