453 val delN = "del" |
453 val delN = "del" |
454 val elimN = "elim" |
454 val elimN = "elim" |
455 val any_keyword = keyword addN || keyword delN || simple_keyword elimN |
455 val any_keyword = keyword addN || keyword delN || simple_keyword elimN |
456 val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat; |
456 val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat; |
457 in |
457 in |
458 fn src => Method.syntax |
458 Scan.optional (simple_keyword elimN >> K false) true -- |
459 ((Scan.optional (simple_keyword elimN >> K false) true) -- |
459 Scan.optional (keyword addN |-- thms) [] -- |
460 (Scan.optional (keyword addN |-- thms) []) -- |
460 Scan.optional (keyword delN |-- thms) [] >> |
461 (Scan.optional (keyword delN |-- thms) [])) src |
461 (fn ((elim, add_ths), del_ths) => fn ctxt => |
462 #> (fn (((elim, add_ths), del_ths),ctxt) => |
462 SIMPLE_METHOD' (Presburger.cooper_tac elim add_ths del_ths ctxt)) |
463 SIMPLE_METHOD' (Presburger.cooper_tac elim add_ths del_ths ctxt)) |
|
464 end |
463 end |
465 *} "Cooper's algorithm for Presburger arithmetic" |
464 *} "Cooper's algorithm for Presburger arithmetic" |
466 |
465 |
467 lemma [presburger, algebra]: "m mod 2 = (1::nat) \<longleftrightarrow> \<not> 2 dvd m " by presburger |
466 lemma [presburger, algebra]: "m mod 2 = (1::nat) \<longleftrightarrow> \<not> 2 dvd m " by presburger |
468 lemma [presburger, algebra]: "m mod 2 = Suc 0 \<longleftrightarrow> \<not> 2 dvd m " by presburger |
467 lemma [presburger, algebra]: "m mod 2 = Suc 0 \<longleftrightarrow> \<not> 2 dvd m " by presburger |