src/HOL/Boogie/Tools/boogie_tactics.ML
author boehmes
Wed, 23 Dec 2009 17:35:56 +0100
changeset 34181 003333ffa543
parent 34068 a78307d72e58
child 34916 f625d8d6fcf3
permissions -rw-r--r--
merged verification condition structure and term representation in one datatype, extended the set of operations on verification conditions (retrieve more information, advanced splitting of paths), simplified discharging of verification conditions (due to improved datatype), added variantions of commands (extract different parts of verification conditions, scan until first "hard" assertion)
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
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    72
        (Rule_Cases.make_common false
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    73
          (ProofContext.theory_of ctxt, Thm.prop_of st) names)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    74
        Tactical.all_tac st))
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    75
in
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    76
val setup_boogie_cases = Method.setup @{binding boogie_cases}
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    77
  (Scan.succeed boogie_cases)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    78
  "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
    79
end
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    80
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
val setup =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    83
  setup_boogie #>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    84
  setup_boogie_all #>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    85
  setup_boogie_cases
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    86
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents:
diff changeset
    87
end