理论AVL_引理导入AVL开始primrec isbal::“一棵树\bool“其中isbal_empty:“isbal叶=真”|isbal_branch:“isbal(节点n l r)=((高度l=高度r |高度l=Suc(高度r)|Suc(高度l)=高度r)&isbal l和isbal r)“上下文行顺序开始(*insert_avl*的Case-split引理)引理insert_node_cases[case_names already lrrot rlot linsert rlrot lrot rinsert]:“(x=n\P(节点n l r)\(x\n个\x个高度(insert_avl x l)=Suc(Suc(高度r))\bal(insert_avl x l)=右侧)\P(lr_rot(n,(插入值x l),r))\((x)\n个\x个高度(insert_avl x l)=Suc(Suc(高度r))\bal(插入avl x l)\右侧)\P(r_rot(n,(insert_avl x l),r))\(x)\n个\x个高度(insert_avl x l)\Suc(Suc(高度r))\P(节点n(insert_avl x l)r)\((x)\n个\\x个高度(insert_avl x r)=Suc(Suc(高度l))\bal(insert_avl x r)=左侧)\P(rl_rot(n,l,(insert_avl x r))\((x)\n个\\x个高度(insert_avl x r)=Suc(Suc(高度l))\bal(插入avl x r)\左)\P(l_rot(n,l,(insert_avl x r))\(x)\n个\\x个高度(insert_avl x r)\Suc(Suc(高度l))\P(节点n l(insert_avl x r))\P(插入值x(节点n l r))“作者(clarsimp simp add:l_bal_def r_bal_def Let_def)引理insert_node_bal_cases[case_names already lbal linsert rbal rinsert]:“(x=n\P(节点n l r)\(x\n个\x个高度(insert_avl x l)=Suc(Suc(高度r))\P(l _ bal n(插入_ avl x l)r)\(x)\n个\x个高度(insert_avl x l)\Suc(Suc(高度r))\P(节点n(insert_avl x l)r)\((x)\n个\\x个高度(insert_avl x r)=Suc(Suc(高度l))\P(r_bal n l(插入值x r))\(x)\n个\\x个高度(insert_avl x r)\Suc(Suc(高度l))\P(节点n l(insert_avl x r))\P(插入值x(节点n l r))“作者(clarsimp simp add:l_bal_def r_bal_def Let_def)引理isbal_r_rot[rule_format]:“高度l=Suc(Suc(高度r))\平衡\右侧\伊斯巴尔l\伊斯巴尔r\isbal(r_rot(n,l,r))“展开bal_def依据(案例l,自动)引理isbal_lr_rot[rule_format]:“高度l=Suc(Suc(高度r))\bal l=右侧\伊斯巴尔l\伊斯巴尔r\isbal(lr_rot(n,l,r))“展开bal_def证明(案例l,自动simp添加:Orderings.max_def)修复a::'a和tree1::“'a树”和tree2::“a树”假设“高度树2=Suc(高度r)”和“高度树1=高度r”,以及“isbal树1”、“isbal-tree2”和“isbalr”然后显示“isbal(lr_rot(n,节点a tree1 tree2,r)”by(case“tree2”,自动)qed(质量工程师)(*对称*)引理isbal_l_rot[rule_format]:“Suc(Suc(height l))=高度r\平衡(bal r)\左侧\伊斯巴尔l\伊斯巴尔r\isbal(l_rot(n,l,r))“对不起的(*对称*)引理isbal_rl_rot[rule_format]:“Suc(Suc(height l))=高度r\bal r=左侧\伊斯巴尔l\伊斯巴尔r\isbal(rl_rot(n,l,r))“对不起的(*关于旋转后高度的引理*)引理height_lr_rot[rule_format]:“bal l=右\高度l=Suc(Suc(高度r))\Suc(高度(lr_rot(n,l,r))=高度(节点n l r)“展开bal_def证明(案例l,自动simp添加:Orderings.ord_class.max_def)修复a::'a和tree1::“'a树”和tree2::“a树”假设“高度树1<Suc(高度r)”和“高度树2=Suc(高r)”然后显示“height(lr_rot(n,Node a tree1 tree2,r))=Suc(Suc(height r))”按(案例树2,自动)qed(质量工程师)引理height_r_rot[rule_format]:“bal l\右侧\高度l=Suc(Suc(高度r))\Suc(高度(r_rot(n,l,r))=高度(节点n l r)|(高度(r_rot(n,l,r))=高度(节点n l r)”展开bal_def依据(案例l,自动)引理height_r_rot2:“bal l\右==>高度l=Suc(Suc(高度r))==>Suc(高度(r_rot(n,l,r))=高度(节点n l r)|(高度(r_rot(n,l,r))=高度(节点n l r)”展开bal_def依据(案例l,自动)(*对称*)引理height_rl_rot[rule_format]:“bal r=左\高度r=Suc(Suc(高度l))\Suc(height(rl_rot(n,l,r)))=高度(节点n l r)“对不起的(*对称*)引理height_l_rot[rule_format]:“bal r\左侧\高度r=Suc(Suc(高度l))\Suc(高度(l_rot(n,l,r))=高度(节点n l r)|(height(l_rot(n,l,r))=高度(节点n l r)“对不起的引理height_l_bal[rule_format]:“高度l=Suc(Suc(高度r))\Suc(height(l_bal n l r))=高度(节点n l l r)|height(l_baln l r)=高度(节点n l r)“将l_bal_def展开为(案例“bal l=右”,简单添加:height_l_rot,fastforce目标:height_r_rot simp:max_def)(*对称*)引理height_r_bal[rule_format]:“高度r=Suc(Suc(高度l))\Suc(height(r_bal n l r))=高度(节点n l l r)|height(r_bal n l r)=高度(节点n l r)“对不起的引理height_insert[rule_format]:“isbal t\高度(insert_avl x t)=高度t|高度(insert _avl x t)=吸力(高度t)“证明(感应t)case Leaf simp秀“?case”下一个案例(节点a t1 t2)show“isbal(节点a t1 t2)\高度(insert_avl x(节点a t1 t2))=高度(节点a t1 t2)\height(insert_avl x(节点a t1 t2))=Suc(高度(节点a t1 t2)”证明(归纳规则:insert_node_bal_cases)case已经因此“case”by(simp)下一个病例lbalhave hlb:“height(insert_avl x t1)=Suc(Suc(height t2))\Suc(高度(l _ bal a(插入_ avl x t1)t2))=高度(节点a(insert_avl x t1)t2)\高度(lbal a(插入avl x t1)t2)=高度(节点a(insert_avl x t1)t2)“x(规则高度_l_bal)Node.hyps lbal秀“?case”by(clarsimp simp add:Orderings.max_def)下一个case linsert with Node.hyps显示“?case”by(fastforce)下一个(*对称(几乎)*)case rbal显示“case”对不起下一个(*对称*)case rinsert秀“?case”对不起qed(质量工程师)qed(质量工程师)(*关于insert_avl之后平衡的引理*)引理isbal_insert_left[rule_format]:假设height:“高度(insert_avl x l)\Suc(Suc(高度r))”和balinsertxl:“isbal(insert_avl x l)”和balnode:“isbal(节点n l r)”显示“isbal(节点n(insert_avl x l)r)”证明-来自balnode haveheight2:“高度(insert_avl x l)=高度l\高度(insert_avl x l)=Suc(高度l)”和balr:“isbal r”通过(自动简单添加:高度插入)用height balinsertxl balnode show“?thesis”by(simp,fastforce)qed(质量工程师)(*对称*)引理isbal_insert_right[rule_format]:假设height:“高度(insert_avl x r)\Suc(Suc(高度l))”和balinsertxl:“isbal(insert_avl x r)”和balnode:“isbal(节点n l r)”显示“isbal(节点n l(insert_avl x r)”对不起的(*插入操作保留isbal属性*)引理isbal_insert[规则格式]:“isbal t\isbal(插入avl x t)“证明(归纳,简单)修复a::'a和t1::“'a树”和t2::“'a树”假设balt1:“isbal t1\isbal(insert_avl x t1)“和balt2:“isbal t2\isbal(插入avl x t2)“然后显示“isbal(节点a t1 t2)\isbal(insert_avl x(节点a t1 t2))“证明(impI简介)假设balance_node:“isbal(节点a t1 t2)”然后通过(auto)获得balancet1:“isbal t1”和balancet2:“isbal t2”具有balt1和balt2balance_insertt1:“isbal(insert_avl x t1)”和balance_insertt2:“isbal(insert_avl x t2)”(自动)显示“isbal(insert_avl x(节点a t1 t2)”证明(归纳规则:insert_node_cases)案例已经带有balance_node显示“?case”by(simp)下一个案例lrrot带有balance_insertt1 balance_t2通过显示“?case”(简单添加:isballrr_rot)下一个案例错误带有balance_insertt1 balance_t2通过显示“?case”(简单添加:isbal_r_rot)下一个案例linsert因此,“高度(插入avl x t1)\Suc(Suc(高度t2))“由(elim congE)从这个balanceinsertt1 balancenode显示“?case”by(规则isbalinsert_left)下一个case rlrot show“?case”对不起下一个case lrot show“?case”对不起下一个case rinsert show“?case”对不起qed(质量工程师)qed(质量工程师)qed(质量工程师)(*******************位于************)(*旋转保留isin属性*)引理isin_lr_rot[rule_format]:“高度l=Suc(Suc(高度r))\bal l=右侧\isin x(lr_rot(n,l,r))=isin x“证明(案例l,simp_all add:bal_def,intro impI)修复a::'a和t1::“'a树”和t2::“'a树”假设“l=节点a t1 t2”和“最大值(高度t1)(高度t2)=Suc(高度r)”和“高度t1<高度t2”因此“isin x(lr_rot(n,节点a t1 t2,r))=(x=n\x=a\isin x t1\isin x t2\isin x r)“by(案例t2,simp_all add:bal_def,auto)qed(质量工程师)引理isin_r_rot[rule_format]:“高度l=Suc(Suc(高度r))\平衡\对\isin x(r_rot(n,l,r))=isin x“by(cases l,simp,intro impI,fastforce simp add:bal_def)(*对称*)引理isin_rl_rot[rule_format]:“高度r=Suc(Suc(高度l))\bal r=左侧\isin x(rl_rot(n,l,r))=isin x“对不起的(*对称*)引理isin_l_rot[rule_format]:“高度r=Suc(Suc(高度l))\平衡(bal r)\左侧\isin x(l_rot(n,l,r))=isin x“对不起的(*插入*中)引理isin_insert:“isin y(insert_avl x t)=(y=x | isin y t)”证明(感应t)case Leaf因此“case”by(simp)下一个case节点因此为“case”由(简单添加:l_bal_def isin_lr_rot isin_rotr_bal_def isin_rl_rot isin_l_rot Let_def,爆炸)qed(质量工程师)(*******************监控程序************)(*轮换保留isord属性*)引理isord_lr_rot[规则格式]:“高度l=Suc(Suc(高度r))\bal l=右侧\isordP(节点n l r)P\isordP(lr_rot(n,l,r))P“证明(案例l,简单,简介impI)修复a::'a和t1::“'a树”和t2::“'a树”有simp1[simp]:“\a x n.a<n\(x<n\x<a)=(x<a有simp2[simp]:“\a x n问题a<n\(x<n\问\x<a)=(x<a\Q) “通过自动有simp3[simp]:“\a x n n<a\(n<x\a(x)=(a)“自动拥有并确认:“\a b.(a)\b) =(b)\a) “通过自动假设“l=节点a t1 t2”和“高度l=Suc(Suc(高度r))”“bal l=bal.右”和“isordP(节点n l r)P”因此“isordP(lr_rot(n,l,r))P”展开bal_defby(案例t2,simp_all,simp-add:and _commutes)qed(质量工程师)引理isord_r_rot[规则格式]:“高度l=Suc(Suc(高度r))\平衡\右侧\等值线P(节点n l r)P\isordP(r_rot(n,l,r))P“证明(案例l,简单,简介impI)固定t1 t2有simp1[simp]:“\a x n.a<n\(x<n\x<a)=(x<a有simp2[simp]:“\a x n问题a<n\(x<n\问\x<a)=(x<a\Q) “通过自动有simp3[simp]:“\a x n n<a\(n<x\a<x)=(a<x)“自动拥有并确认:“\a b.(a)\b) =(b)\a) “”\a b c(a)\b条\c) =(b)\一个\c) “通过自动假设“l=节点a t1 t2”和“高度l=Suc(Suc(高度r))”“巴尔\平衡。右“和”isordP(节点n l r)P“因此“isordP(r_rot(n,l,r))P”展开bal_defby(案例t2,simp_all,simp-add:and _commutes)qed(质量工程师)(*对称*)引理isord_rl_rot[rule_format]:“高度r=Suc(Suc(高度l))\bal r=左侧\等值线P(节点n l r)P\isordP(rl_rot(n,l,r))P“对不起的(*对称*)引理isord_l_rot[规则格式]:“高度r=Suc(Suc(高度l))\平衡(bal r)\左侧\isordP(节点n l r)P\isordP(l_rot(n,l,r))P“对不起的引理visrdP_insert[rule_format]:“P x\监控计划t P\isordP(insert_avl x t)P“证明(归纳任意:P,simp)案例(节点a l r)显示“?case”证明(impI简介)假设像素:“P x”假设isordnode:“isordP(Node a l r)P”显示“isordP(insert_avl x(Node a l r))P”证明(归纳规则:insert_node_cases)simp已使用isordnode显示“?case”的案例下一个带isordnode-px的大小写lrrot通过(intro isord_lr_rot,simp_all,intro Node.hyps(1)[rule_format],simp_all)显示“?case”下一个带有isordnode px的案例错误通过(intro isord_r_rot,simp_all,intro Node.hyps(1)[rule_format],simp_all)显示“?case”下一个带有isordnode px的案例lrot通过(intro isord_l_rot,simp_all,intro Node.hyps(2)[rule_format],simp_all,auto)显示“?case”下一个带有isordnode px的案例rlrot通过(intro isord_rl_rot,simp_all,intro Node.hyps(2)[rule_format],simp_all,auto)显示“?case”下一个带有isordnode px的案例linsert通过(simp,intro Node.hyps(1)[rule_format],simp_all)显示“?case”下一个带有isordnode px的箱子冲洗器通过(simp,intro Node.hyps(2)[rule_format],simp_all,auto)显示“?case”qed(质量工程师)qed(质量工程师)qed(质量工程师)引理isord_insert[rule_format]:“isord t\isord(插入avl x t)“通过(简单添加:isordP_insert isord_def)结束结束