src/HOL/Integ/presburger.ML
changeset 18155 e5ab63ca6b0f
parent 17465 93fc1211603f
child 18202 46af82efd311
equal deleted inserted replaced
18154:0c05abaf6244 18155:e5ab63ca6b0f
   293   end handle Subscript => no_tac st | CooperDec.COOPER => no_tac st);
   293   end handle Subscript => no_tac st | CooperDec.COOPER => no_tac st);
   294 
   294 
   295 fun presburger_args meth =
   295 fun presburger_args meth =
   296  let val parse_flag = 
   296  let val parse_flag = 
   297          Args.$$$ "no_quantify" >> K (apfst (K false))
   297          Args.$$$ "no_quantify" >> K (apfst (K false))
   298       || Args.$$$ "abs" >> K (apsnd (K true));
   298       || Args.$$$ "no_abs" >> K (apsnd (K false));
   299  in
   299  in
   300    Method.simple_args 
   300    Method.simple_args 
   301   (Scan.optional (Args.$$$ "(" |-- Scan.repeat1 parse_flag --| Args.$$$ ")") [] >>
   301   (Scan.optional (Args.$$$ "(" |-- Scan.repeat1 parse_flag --| Args.$$$ ")") [] >>
   302     curry (Library.foldl op |>) (true, false))
   302     curry (Library.foldl op |>) (true, true))
   303     (fn (q,a) => fn _ => meth q a 1)
   303     (fn (q,a) => fn _ => meth q a 1)
   304   end;
   304   end;
   305 
   305 
   306 fun presburger_method q a i = Method.METHOD (fn facts =>
   306 fun presburger_method q a i = Method.METHOD (fn facts =>
   307   Method.insert_tac facts 1 THEN presburger_tac q a i)
   307   Method.insert_tac facts 1 THEN presburger_tac q a i)
   310   [Method.add_method ("presburger",
   310   [Method.add_method ("presburger",
   311      presburger_args presburger_method,
   311      presburger_args presburger_method,
   312      "decision procedure for Presburger arithmetic"),
   312      "decision procedure for Presburger arithmetic"),
   313    ArithTheoryData.map (fn {splits, inj_consts, discrete, presburger} =>
   313    ArithTheoryData.map (fn {splits, inj_consts, discrete, presburger} =>
   314      {splits = splits, inj_consts = inj_consts, discrete = discrete,
   314      {splits = splits, inj_consts = inj_consts, discrete = discrete,
   315       presburger = SOME (presburger_tac true false)})];
   315       presburger = SOME (presburger_tac true true)})];
   316 
   316 
   317 end;
   317 end;
   318 
   318 
   319 val presburger_tac = Presburger.presburger_tac true false;
   319 val presburger_tac = Presburger.presburger_tac true true;