src/HOL/Boogie/Tools/boogie_commands.ML
author haftmann
Mon, 16 Nov 2009 10:16:40 +0100
changeset 33708 b45d3b8cc74e
parent 33671 4b0f2599ed48
child 34068 a78307d72e58
permissions -rw-r--r--
proper purge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     1
(*  Title:      HOL/Boogie/Tools/boogie_commands.ML
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     2
    Author:     Sascha Boehme, TU Muenchen
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     3
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     4
Isar commands to create a Boogie environment simulation.
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     5
*)
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     6
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     7
signature BOOGIE_COMMANDS =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     8
sig
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     9
  val setup: theory -> theory
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    10
end
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    11
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    12
structure Boogie_Commands: BOOGIE_COMMANDS =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    13
struct
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    14
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    15
fun boogie_load (verbose, base_name) thy =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    16
  let
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    17
    val path = Path.explode (base_name ^ ".b2i")
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    18
    val _ = File.exists path orelse
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    19
      error ("Unable to find file " ^ quote (Path.implode path))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    20
    val _ = Boogie_VCs.is_closed thy orelse
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    21
      error ("Found the beginning of a new Boogie environment, " ^
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    22
        "but another Boogie environment is still open.")
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    23
  in Boogie_Loader.load_b2i verbose path thy end
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    24
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    25
fun boogie_status thy =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    26
  let 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    27
    fun pretty_vc_name (name, _, proved) = 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    28
      let val s = if proved then "proved" else "not proved"
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    29
      in Pretty.str (name ^ " (" ^ s ^ ")") end
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    30
  in
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    31
    Pretty.writeln (Pretty.big_list "Boogie verification conditions:"
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    32
      (map pretty_vc_name (Boogie_VCs.as_list thy)))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    33
  end
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    34
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    35
fun boogie_vc name lthy =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    36
  (case Boogie_VCs.lookup (ProofContext.theory_of lthy) name of
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    37
    NONE => error ("There is no verification condition " ^ quote name ^ ".")
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    38
  | SOME vc =>
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    39
      let
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    40
        fun store thm = Boogie_VCs.discharge (name, thm)
33671
4b0f2599ed48 modernized structure Local_Theory;
wenzelm
parents: 33445
diff changeset
    41
        fun after_qed [[thm]] = Local_Theory.theory (store thm)
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    42
          | after_qed _ = I
33445
f0c78a28e18e shorter names for variables and verification conditions,
boehmes
parents: 33419
diff changeset
    43
      in
f0c78a28e18e shorter names for variables and verification conditions,
boehmes
parents: 33419
diff changeset
    44
        lthy
f0c78a28e18e shorter names for variables and verification conditions,
boehmes
parents: 33419
diff changeset
    45
        |> Variable.auto_fixes vc
f0c78a28e18e shorter names for variables and verification conditions,
boehmes
parents: 33419
diff changeset
    46
        |> Proof.theorem_i NONE after_qed [[(vc, [])]]
f0c78a28e18e shorter names for variables and verification conditions,
boehmes
parents: 33419
diff changeset
    47
      end)
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    48
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    49
fun boogie_end thy =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    50
  let
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    51
    fun not_proved (name, _, proved) = if not proved then SOME name else NONE
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    52
    val unproved = map_filter not_proved (Boogie_VCs.as_list thy)
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    53
  in
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    54
    if null unproved then Boogie_VCs.close thy
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    55
    else error (Pretty.string_of (Pretty.big_list 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    56
      "The following verification conditions have not been proved:"
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    57
      (map Pretty.str unproved)))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    58
  end
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    59
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    60
val _ =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    61
  OuterSyntax.command "boogie_open"
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    62
    "Open a new Boogie environment and load a Boogie-generated .b2i file."
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    63
    OuterKeyword.thy_decl
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    64
    (Scan.optional (Args.parens (Args.$$$ "quiet") >> K false) true --
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    65
     OuterParse.name >> (Toplevel.theory o boogie_load))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    66
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    67
val _ =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    68
  OuterSyntax.improper_command "boogie_status"
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    69
    "Show the name and state of all loaded verification conditions."
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    70
    OuterKeyword.diag
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    71
    (Scan.succeed (Toplevel.no_timing o Toplevel.keep (fn state =>
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    72
      boogie_status (Toplevel.theory_of state))))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    73
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    74
val _ =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    75
  OuterSyntax.command "boogie_vc"
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    76
    "Enter the proof mode for a specific verification condition."
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    77
    OuterKeyword.thy_goal
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    78
    (OuterParse.name >> (fn name => Toplevel.print o
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    79
      Toplevel.local_theory_to_proof NONE (boogie_vc name)))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    80
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    81
val _ =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    82
  OuterSyntax.command "boogie_end"
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    83
    "Close the current Boogie environment."
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    84
    OuterKeyword.thy_decl
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    85
    (Scan.succeed (Toplevel.theory boogie_end))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    86
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    87
val setup = Theory.at_end (fn thy =>
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    88
  let
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    89
    val _ = Boogie_VCs.is_closed thy
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    90
      orelse error ("Found the end of the theory, " ^ 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    91
        "but the last Boogie environment is still open.")
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    92
  in NONE end)
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    93
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    94
end