src/HOL/Boogie/Tools/boogie_tactics.ML
author berghofe
Fri, 15 Jan 2010 13:37:41 +0100
changeset 34916 f625d8d6fcf3
parent 34181 003333ffa543
child 35356 5c937073e1d5
permissions -rw-r--r--
Eliminated is_open option of Rule_Cases.make_nested/make_common; use Rule_Cases.internalize_params to rename parameters instead.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
     1
(*  Title:      HOL/Boogie/Tools/boogie_tactics.ML
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
     2
    Author:     Sascha Boehme, TU Muenchen
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
     3
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
     4
Boogie tactics and Boogie methods.
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
     5
*)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
     6
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
     7
signature BOOGIE_TACTICS =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
     8
sig
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34068
diff changeset
     9
  val unfold_labels_tac: Proof.context -> int -> tactic
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    10
  val boogie_tac: Proof.context -> thm list -> int -> tactic
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    11
  val boogie_all_tac: Proof.context -> thm list -> tactic
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    12
  val setup: theory -> theory
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    13
end
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    14
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    15
structure Boogie_Tactics: BOOGIE_TACTICS =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    16
struct
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    17
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    18
fun as_meta_eq eq = eq RS @{thm eq_reflection}
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    19
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    20
val assert_at_def = as_meta_eq @{thm assert_at_def}
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    21
val block_at_def = as_meta_eq @{thm block_at_def}
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    22
val label_eqs = [assert_at_def, block_at_def]
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    23
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    24
fun unfold_labels_tac ctxt =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    25
  let val unfold = More_Conv.rewrs_conv label_eqs
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    26
  in CONVERSION (More_Conv.top_sweep_conv (K unfold) ctxt) end
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    27
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    28
fun boogie_tac ctxt rules =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    29
  unfold_labels_tac ctxt
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    30
  THEN' SMT_Solver.smt_tac ctxt (Boogie_Axioms.get ctxt @ rules)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    31
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    32
fun boogie_all_tac ctxt rules =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    33
  PARALLEL_GOALS (HEADGOAL (boogie_tac ctxt rules))
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    34
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    35
fun boogie_method all =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    36
  Scan.optional Attrib.thms [] >> (fn thms => fn ctxt => METHOD (fn facts =>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    37
    let val tac = if all then boogie_all_tac else HEADGOAL oo boogie_tac
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    38
    in tac ctxt (thms @ facts) end))
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    39
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    40
val setup_boogie = Method.setup @{binding boogie} (boogie_method false)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    41
  ("Applies an SMT solver to the current goal " ^
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    42
   "using the current set of Boogie background axioms")
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    43
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    44
val setup_boogie_all = Method.setup @{binding boogie_all} (boogie_method true)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    45
  ("Applies an SMT solver to all goals " ^
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    46
   "using the current set of Boogie background axioms")
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    47
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    48
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    49
local
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    50
  fun prep_tac facts =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    51
    Method.insert_tac facts
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    52
    THEN' REPEAT_ALL_NEW
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34068
diff changeset
    53
      (Tactic.resolve_tac [@{thm impI}, @{thm conjI}, @{thm TrueI}]
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34068
diff changeset
    54
       ORELSE' Tactic.etac @{thm conjE})
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    55
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    56
  val drop_assert_at = Conv.concl_conv ~1 (Conv.try_conv (Conv.arg_conv
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    57
    (Conv.rewr_conv assert_at_def)))
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    58
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    59
  fun case_name_of t =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    60
    (case HOLogic.dest_Trueprop (Logic.strip_imp_concl t) of
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    61
      @{term assert_at} $ Free (n, _) $ _ => n
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    62
    | _ => raise TERM ("case_name_of", [t]))
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    63
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    64
  fun boogie_cases ctxt = METHOD_CASES (fn facts =>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    65
    ALLGOALS (prep_tac facts) #>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    66
    Seq.maps (fn st =>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    67
      st
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    68
      |> ALLGOALS (CONVERSION drop_assert_at)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    69
      |> Seq.map (pair (map (rpair [] o case_name_of) (Thm.prems_of st)))) #>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    70
    Seq.maps (fn (names, st) =>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    71
      CASES
34916
f625d8d6fcf3 Eliminated is_open option of Rule_Cases.make_nested/make_common;
berghofe
parents: 34181
diff changeset
    72
        (Rule_Cases.make_common
f625d8d6fcf3 Eliminated is_open option of Rule_Cases.make_nested/make_common;
berghofe
parents: 34181
diff changeset
    73
          (ProofContext.theory_of ctxt,
f625d8d6fcf3 Eliminated is_open option of Rule_Cases.make_nested/make_common;
berghofe
parents: 34181
diff changeset
    74
           Thm.prop_of (Rule_Cases.internalize_params st)) names)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    75
        Tactical.all_tac st))
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    76
in
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    77
val setup_boogie_cases = Method.setup @{binding boogie_cases}
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    78
  (Scan.succeed boogie_cases)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    79
  "Prepares a set of Boogie assertions for case-based proofs"
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    80
end
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    81
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    82
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    83
val setup =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    84
  setup_boogie #>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    85
  setup_boogie_all #>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    86
  setup_boogie_cases
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    87
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    88
end