153 val lf_dvd = thm "lf_dvd"; |
153 val lf_dvd = thm "lf_dvd"; |
154 |
154 |
155 |
155 |
156 (* ------------------------------------------------------------------------- *) |
156 (* ------------------------------------------------------------------------- *) |
157 (*This function norm_zero_one replaces the occurences of Numeral1 and Numeral0*) |
157 (*This function norm_zero_one replaces the occurences of Numeral1 and Numeral0*) |
158 (*Respectively by their abstract representation Const("1",..) and COnst("0",..)*) |
158 (*Respectively by their abstract representation Const("HOL.one",..) and Const("HOL.zero",..)*) |
159 (*this is necessary because the theorems use this representation.*) |
159 (*this is necessary because the theorems use this representation.*) |
160 (* This function should be elminated in next versions...*) |
160 (* This function should be elminated in next versions...*) |
161 (* ------------------------------------------------------------------------- *) |
161 (* ------------------------------------------------------------------------- *) |
162 |
162 |
163 fun norm_zero_one fm = case fm of |
163 fun norm_zero_one fm = case fm of |
249 (*==================================================*) |
249 (*==================================================*) |
250 (* Compact Version for adjustcoeffeq *) |
250 (* Compact Version for adjustcoeffeq *) |
251 (*==================================================*) |
251 (*==================================================*) |
252 |
252 |
253 fun decomp_adjustcoeffeq sg x l fm = case fm of |
253 fun decomp_adjustcoeffeq sg x l fm = case fm of |
254 (Const("Not",_)$(Const("Orderings.less",_) $(Const("0",_)) $(rt as (Const ("HOL.plus", _)$(Const ("HOL.times",_) $ c $ y ) $z )))) => |
254 (Const("Not",_)$(Const("Orderings.less",_) $(Const("HOL.zero",_)) $(rt as (Const ("HOL.plus", _)$(Const ("HOL.times",_) $ c $ y ) $z )))) => |
255 let |
255 let |
256 val m = l div (dest_numeral c) |
256 val m = l div (dest_numeral c) |
257 val n = if (x = y) then abs (m) else 1 |
257 val n = if (x = y) then abs (m) else 1 |
258 val xtm = (HOLogic.mk_binop "HOL.times" ((mk_numeral ((m div n)*l) ), x)) |
258 val xtm = (HOLogic.mk_binop "HOL.times" ((mk_numeral ((m div n)*l) ), x)) |
259 val rs = if (x = y) |
259 val rs = if (x = y) |
262 val ck = cterm_of sg (mk_numeral n) |
262 val ck = cterm_of sg (mk_numeral n) |
263 val cc = cterm_of sg c |
263 val cc = cterm_of sg c |
264 val ct = cterm_of sg z |
264 val ct = cterm_of sg z |
265 val cx = cterm_of sg y |
265 val cx = cterm_of sg y |
266 val pre = prove_elementar sg "lf" |
266 val pre = prove_elementar sg "lf" |
267 (HOLogic.mk_binrel "Orderings.less" (Const("0",HOLogic.intT),(mk_numeral n))) |
267 (HOLogic.mk_binrel "Orderings.less" (Const("HOL.zero",HOLogic.intT),(mk_numeral n))) |
268 val th1 = (pre RS (instantiate' [] [SOME ck,SOME cc, SOME cx, SOME ct] (ac_pi_eq))) |
268 val th1 = (pre RS (instantiate' [] [SOME ck,SOME cc, SOME cx, SOME ct] (ac_pi_eq))) |
269 in ([], fn [] => [th1,(prove_elementar sg "sa" (HOLogic.mk_eq (snd (qe_get_terms th1) ,rs)))] MRS trans) |
269 in ([], fn [] => [th1,(prove_elementar sg "sa" (HOLogic.mk_eq (snd (qe_get_terms th1) ,rs)))] MRS trans) |
270 end |
270 end |
271 |
271 |
272 |(Const(p,_) $a $( Const ("HOL.plus", _)$(Const ("HOL.times",_) $ |
272 |(Const(p,_) $a $( Const ("HOL.plus", _)$(Const ("HOL.times",_) $ |
286 |
286 |
287 in |
287 in |
288 case p of |
288 case p of |
289 "Orderings.less" => |
289 "Orderings.less" => |
290 let val pre = prove_elementar sg "lf" |
290 let val pre = prove_elementar sg "lf" |
291 (HOLogic.mk_binrel "Orderings.less" (Const("0",HOLogic.intT),(mk_numeral k))) |
291 (HOLogic.mk_binrel "Orderings.less" (Const("HOL.zero",HOLogic.intT),(mk_numeral k))) |
292 val th1 = (pre RS (instantiate' [] [SOME ck,SOME ca,SOME cc, SOME cx, SOME ct] (ac_lt_eq))) |
292 val th1 = (pre RS (instantiate' [] [SOME ck,SOME ca,SOME cc, SOME cx, SOME ct] (ac_lt_eq))) |
293 in ([], fn [] => [th1,(prove_elementar sg "lf" (HOLogic.mk_eq (snd (qe_get_terms th1) ,rs)))] MRS trans) |
293 in ([], fn [] => [th1,(prove_elementar sg "lf" (HOLogic.mk_eq (snd (qe_get_terms th1) ,rs)))] MRS trans) |
294 end |
294 end |
295 |
295 |
296 |"op =" => |
296 |"op =" => |
297 let val pre = prove_elementar sg "lf" |
297 let val pre = prove_elementar sg "lf" |
298 (HOLogic.Not $ (HOLogic.mk_binrel "op =" (Const("0",HOLogic.intT),(mk_numeral k)))) |
298 (HOLogic.Not $ (HOLogic.mk_binrel "op =" (Const("HOL.zero",HOLogic.intT),(mk_numeral k)))) |
299 val th1 = (pre RS(instantiate' [] [SOME ck,SOME ca,SOME cc, SOME cx, SOME ct] (ac_eq_eq))) |
299 val th1 = (pre RS(instantiate' [] [SOME ck,SOME ca,SOME cc, SOME cx, SOME ct] (ac_eq_eq))) |
300 in ([], fn [] => [th1,(prove_elementar sg "lf" (HOLogic.mk_eq (snd (qe_get_terms th1) ,rs)))] MRS trans) |
300 in ([], fn [] => [th1,(prove_elementar sg "lf" (HOLogic.mk_eq (snd (qe_get_terms th1) ,rs)))] MRS trans) |
301 end |
301 end |
302 |
302 |
303 |"Divides.op dvd" => |
303 |"Divides.op dvd" => |
304 let val pre = prove_elementar sg "lf" |
304 let val pre = prove_elementar sg "lf" |
305 (HOLogic.Not $ (HOLogic.mk_binrel "op =" (Const("0",HOLogic.intT),(mk_numeral k)))) |
305 (HOLogic.Not $ (HOLogic.mk_binrel "op =" (Const("HOL.zero",HOLogic.intT),(mk_numeral k)))) |
306 val th1 = (pre RS (instantiate' [] [SOME ck,SOME ca,SOME cc, SOME cx, SOME ct]) (ac_dvd_eq)) |
306 val th1 = (pre RS (instantiate' [] [SOME ck,SOME ca,SOME cc, SOME cx, SOME ct]) (ac_dvd_eq)) |
307 in ([], fn [] => [th1,(prove_elementar sg "lf" (HOLogic.mk_eq (snd (qe_get_terms th1) ,rs)))] MRS trans) |
307 in ([], fn [] => [th1,(prove_elementar sg "lf" (HOLogic.mk_eq (snd (qe_get_terms th1) ,rs)))] MRS trans) |
308 |
308 |
309 end |
309 end |
310 end |
310 end |
565 case at of |
565 case at of |
566 (Const ("Not", _) $ (Const("op =",Type ("fun",[Type ("IntDef.int", []),_])) $ c1 $ (Const ("HOL.plus", _) $(Const ("HOL.times",_) $ c2 $ y) $z))) => |
566 (Const ("Not", _) $ (Const("op =",Type ("fun",[Type ("IntDef.int", []),_])) $ c1 $ (Const ("HOL.plus", _) $(Const ("HOL.times",_) $ c2 $ y) $z))) => |
567 if (x=y) andalso (c1=zero) andalso (c2=one) |
567 if (x=y) andalso (c1=zero) andalso (c2=one) |
568 then let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ (norm_zero_one (linear_cmul ~1 z)) $ B) |
568 then let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ (norm_zero_one (linear_cmul ~1 z)) $ B) |
569 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq ((norm_zero_one (linear_cmul ~1 z)),Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z))) |
569 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq ((norm_zero_one (linear_cmul ~1 z)),Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z))) |
570 val th3 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("0",HOLogic.intT),dlcm)) |
570 val th3 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("HOL.zero",HOLogic.intT),dlcm)) |
571 in (instantiate' [] [SOME cfma]([th3,th1,th2] MRS (not_bst_p_ne))) |
571 in (instantiate' [] [SOME cfma]([th3,th1,th2] MRS (not_bst_p_ne))) |
572 end |
572 end |
573 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cB,SOME cat] (not_bst_p_fm)) |
573 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cB,SOME cat] (not_bst_p_fm)) |
574 |
574 |
575 |(Const("op =",Type ("fun",[Type ("IntDef.int", []),_])) $ c1 $(Const ("HOL.plus", T) $(Const ("HOL.times",_) $ c2 $ y) $z)) => |
575 |(Const("op =",Type ("fun",[Type ("IntDef.int", []),_])) $ c1 $(Const ("HOL.plus", T) $(Const ("HOL.times",_) $ c2 $ y) $z)) => |
576 if (is_arith_rel at) andalso (x=y) |
576 if (is_arith_rel at) andalso (x=y) |
577 then let val bst_z = norm_zero_one (linear_neg (linear_add [] z (mk_numeral 1))) |
577 then let val bst_z = norm_zero_one (linear_neg (linear_add [] z (mk_numeral 1))) |
578 in let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ bst_z $ B) |
578 in let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ bst_z $ B) |
579 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq (bst_z,Const("HOL.minus",T) $ (Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z)) $ (Const("1",HOLogic.intT)))) |
579 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq (bst_z,Const("HOL.minus",T) $ (Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z)) $ (Const("HOL.one",HOLogic.intT)))) |
580 val th3 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("0",HOLogic.intT),dlcm)) |
580 val th3 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("HOL.zero",HOLogic.intT),dlcm)) |
581 in (instantiate' [] [SOME cfma] ([th3,th1,th2] MRS (not_bst_p_eq))) |
581 in (instantiate' [] [SOME cfma] ([th3,th1,th2] MRS (not_bst_p_eq))) |
582 end |
582 end |
583 end |
583 end |
584 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cB,SOME cat] (not_bst_p_fm)) |
584 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cB,SOME cat] (not_bst_p_fm)) |
585 |
585 |
588 if pm1 = one then |
588 if pm1 = one then |
589 let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ (norm_zero_one (linear_cmul ~1 z)) $ B) |
589 let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ (norm_zero_one (linear_cmul ~1 z)) $ B) |
590 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq ((norm_zero_one (linear_cmul ~1 z)),Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z))) |
590 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq ((norm_zero_one (linear_cmul ~1 z)),Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z))) |
591 in (instantiate' [] [SOME cfma, SOME cdlcm]([th1,th2] MRS (not_bst_p_gt))) |
591 in (instantiate' [] [SOME cfma, SOME cdlcm]([th1,th2] MRS (not_bst_p_gt))) |
592 end |
592 end |
593 else let val th1 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("0",HOLogic.intT),dlcm)) |
593 else let val th1 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("HOL.zero",HOLogic.intT),dlcm)) |
594 in (instantiate' [] [SOME cfma, SOME cB,SOME (cterm_of sg (norm_zero_one z))] (th1 RS (not_bst_p_lt))) |
594 in (instantiate' [] [SOME cfma, SOME cB,SOME (cterm_of sg (norm_zero_one z))] (th1 RS (not_bst_p_lt))) |
595 end |
595 end |
596 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cB,SOME cat] (not_bst_p_fm)) |
596 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cB,SOME cat] (not_bst_p_fm)) |
597 |
597 |
598 |Const ("Not",_) $ (Const("Divides.op dvd",_)$ d $ (Const ("HOL.plus",_) $ (Const ("HOL.times",_) $ c $ y ) $ z)) => |
598 |Const ("Not",_) $ (Const("Divides.op dvd",_)$ d $ (Const ("HOL.plus",_) $ (Const ("HOL.times",_) $ c $ y ) $ z)) => |
656 case at of |
656 case at of |
657 (Const ("Not", _) $ (Const("op =",Type ("fun",[Type ("IntDef.int", []),_])) $ c1 $ (Const ("HOL.plus", _) $(Const ("HOL.times",_) $ c2 $ y) $z))) => |
657 (Const ("Not", _) $ (Const("op =",Type ("fun",[Type ("IntDef.int", []),_])) $ c1 $ (Const ("HOL.plus", _) $(Const ("HOL.times",_) $ c2 $ y) $z))) => |
658 if (x=y) andalso (c1=zero) andalso (c2=one) |
658 if (x=y) andalso (c1=zero) andalso (c2=one) |
659 then let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ (norm_zero_one (linear_cmul ~1 z)) $ A) |
659 then let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ (norm_zero_one (linear_cmul ~1 z)) $ A) |
660 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq ((norm_zero_one (linear_cmul ~1 z)),Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z))) |
660 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq ((norm_zero_one (linear_cmul ~1 z)),Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z))) |
661 val th3 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("0",HOLogic.intT),dlcm)) |
661 val th3 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("HOL.zero",HOLogic.intT),dlcm)) |
662 in (instantiate' [] [SOME cfma]([th3,th1,th2] MRS (not_ast_p_ne))) |
662 in (instantiate' [] [SOME cfma]([th3,th1,th2] MRS (not_ast_p_ne))) |
663 end |
663 end |
664 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cA,SOME cat] (not_ast_p_fm)) |
664 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cA,SOME cat] (not_ast_p_fm)) |
665 |
665 |
666 |(Const("op =",Type ("fun",[Type ("IntDef.int", []),_])) $ c1 $(Const ("HOL.plus", T) $(Const ("HOL.times",_) $ c2 $ y) $z)) => |
666 |(Const("op =",Type ("fun",[Type ("IntDef.int", []),_])) $ c1 $(Const ("HOL.plus", T) $(Const ("HOL.times",_) $ c2 $ y) $z)) => |
667 if (is_arith_rel at) andalso (x=y) |
667 if (is_arith_rel at) andalso (x=y) |
668 then let val ast_z = norm_zero_one (linear_sub [] one z ) |
668 then let val ast_z = norm_zero_one (linear_sub [] one z ) |
669 val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ ast_z $ A) |
669 val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ ast_z $ A) |
670 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq (ast_z,Const("HOL.plus",T) $ (Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z)) $ (Const("1",HOLogic.intT)))) |
670 val th2 = prove_elementar sg "ss" (HOLogic.mk_eq (ast_z,Const("HOL.plus",T) $ (Const("HOL.uminus",HOLogic.intT --> HOLogic.intT) $(norm_zero_one z)) $ (Const("HOL.one",HOLogic.intT)))) |
671 val th3 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("0",HOLogic.intT),dlcm)) |
671 val th3 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("HOL.zero",HOLogic.intT),dlcm)) |
672 in (instantiate' [] [SOME cfma] ([th3,th1,th2] MRS (not_ast_p_eq))) |
672 in (instantiate' [] [SOME cfma] ([th3,th1,th2] MRS (not_ast_p_eq))) |
673 end |
673 end |
674 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cA,SOME cat] (not_ast_p_fm)) |
674 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cA,SOME cat] (not_ast_p_fm)) |
675 |
675 |
676 |(Const("Orderings.less",_) $ c1 $(Const ("HOL.plus", _) $(Const ("HOL.times",_) $ pm1 $ y ) $ z )) => |
676 |(Const("Orderings.less",_) $ c1 $(Const ("HOL.plus", _) $(Const ("HOL.times",_) $ pm1 $ y ) $ z )) => |
678 if pm1 = (mk_numeral ~1) then |
678 if pm1 = (mk_numeral ~1) then |
679 let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ (norm_zero_one z) $ A) |
679 let val th1 = prove_elementar sg "ss" (Const ("op :",HOLogic.intT --> (HOLogic.mk_setT HOLogic.intT) --> HOLogic.boolT) $ (norm_zero_one z) $ A) |
680 val th2 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (zero,dlcm)) |
680 val th2 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (zero,dlcm)) |
681 in (instantiate' [] [SOME cfma]([th2,th1] MRS (not_ast_p_lt))) |
681 in (instantiate' [] [SOME cfma]([th2,th1] MRS (not_ast_p_lt))) |
682 end |
682 end |
683 else let val th1 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("0",HOLogic.intT),dlcm)) |
683 else let val th1 = prove_elementar sg "ss" (HOLogic.mk_binrel "Orderings.less" (Const("HOL.zero",HOLogic.intT),dlcm)) |
684 in (instantiate' [] [SOME cfma, SOME cA,SOME (cterm_of sg (norm_zero_one z))] (th1 RS (not_ast_p_gt))) |
684 in (instantiate' [] [SOME cfma, SOME cA,SOME (cterm_of sg (norm_zero_one z))] (th1 RS (not_ast_p_gt))) |
685 end |
685 end |
686 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cA,SOME cat] (not_ast_p_fm)) |
686 else (instantiate' [] [SOME cfma, SOME cdlcm, SOME cA,SOME cat] (not_ast_p_fm)) |
687 |
687 |
688 |Const ("Not",_) $ (Const("Divides.op dvd",_)$ d $ (Const ("HOL.plus",_) $ (Const ("HOL.times",_) $ c $ y ) $ z)) => |
688 |Const ("Not",_) $ (Const("Divides.op dvd",_)$ d $ (Const ("HOL.plus",_) $ (Const ("HOL.times",_) $ c $ y ) $ z)) => |