src/HOL/Boogie/Tools/boogie_commands.ML
author wenzelm
Thu, 03 Mar 2011 18:42:12 +0100
changeset 41887 ececcbd08d35
parent 40627 becf5d5187cc
child 41944 b97091ae583a
permissions -rw-r--r--
simplified Thy_Info.check_file -- discontinued load path;
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
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    15
(* commands *)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    16
35125
acace7e30357 optionally localize assertion labels (based on user-defined offsets) to reduce the effort of label adaptions after changes to the source program
boehmes
parents: 34181
diff changeset
    17
fun boogie_open ((quiet, base_name), offsets) thy =
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    18
  let
40514
db5f14910dce let the theory formally depend on the Boogie output
boehmes
parents: 38756
diff changeset
    19
    val ext = "b2i"
40580
0592d3a39c08 require the b2i file ending in the boogie_open command (for consistency with the theory header)
boehmes
parents: 40540
diff changeset
    20
    fun check_ext path = snd (Path.split_ext path) = ext orelse
0592d3a39c08 require the b2i file ending in the boogie_open command (for consistency with the theory header)
boehmes
parents: 40540
diff changeset
    21
      error ("Bad file ending of file " ^ quote (Path.implode path) ^ ", " ^
0592d3a39c08 require the b2i file ending in the boogie_open command (for consistency with the theory header)
boehmes
parents: 40540
diff changeset
    22
        "expected file ending " ^ quote ext)
0592d3a39c08 require the b2i file ending in the boogie_open command (for consistency with the theory header)
boehmes
parents: 40540
diff changeset
    23
0592d3a39c08 require the b2i file ending in the boogie_open command (for consistency with the theory header)
boehmes
parents: 40540
diff changeset
    24
    val base_path = Path.explode base_name |> tap check_ext
40540
293f9f211be0 formal dependency on b2i files
boehmes
parents: 40514
diff changeset
    25
    val (full_path, _) =
41887
ececcbd08d35 simplified Thy_Info.check_file -- discontinued load path;
wenzelm
parents: 40627
diff changeset
    26
      Thy_Load.check_file (Thy_Load.master_directory thy) base_path
40514
db5f14910dce let the theory formally depend on the Boogie output
boehmes
parents: 38756
diff changeset
    27
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    28
    val _ = Boogie_VCs.is_closed thy orelse
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    29
      error ("Found the beginning of a new Boogie environment, " ^
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    30
        "but another Boogie environment is still open.")
40514
db5f14910dce let the theory formally depend on the Boogie output
boehmes
parents: 38756
diff changeset
    31
  in
db5f14910dce let the theory formally depend on the Boogie output
boehmes
parents: 38756
diff changeset
    32
    thy
40540
293f9f211be0 formal dependency on b2i files
boehmes
parents: 40514
diff changeset
    33
    |> Boogie_Loader.load_b2i (not quiet) offsets full_path
293f9f211be0 formal dependency on b2i files
boehmes
parents: 40514
diff changeset
    34
    |> Thy_Load.provide_file base_path
40514
db5f14910dce let the theory formally depend on the Boogie output
boehmes
parents: 38756
diff changeset
    35
  end
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    36
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    37
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    38
datatype vc_opts =
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    39
  VC_Complete |
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    40
  VC_Take of int list * (bool * string list) option |
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    41
  VC_Only of string list |
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    42
  VC_Without of string list |
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    43
  VC_Examine of string list |
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    44
  VC_Single of string
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    45
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    46
fun get_vc thy vc_name =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    47
  (case Boogie_VCs.lookup thy vc_name of
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    48
    SOME vc => vc
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    49
  | NONE => 
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    50
      (case AList.lookup (op =) (Boogie_VCs.state_of thy) vc_name of
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    51
        SOME Boogie_VCs.Proved => error ("The verification condition " ^
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    52
          quote vc_name ^ " has already been proved.")
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    53
      | _ => error ("There is no verification condition " ^
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    54
          quote vc_name ^ ".")))
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    55
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    56
local
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    57
  fun split_goal t =
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    58
    (case Boogie_Tactics.split t of
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    59
      [tp] => tp
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    60
    | _ => error "Multiple goals.")
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    61
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    62
  fun single_prep t =
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    63
    let
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    64
      val (us, u) = split_goal t
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    65
      val assms = [((@{binding vc_trace}, []), map (rpair []) us)]
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    66
    in
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    67
      pair [u] o snd o ProofContext.add_assms_i Assumption.assume_export assms
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    68
    end
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    69
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    70
  fun single_prove goal ctxt thm =
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    71
    Goal.prove ctxt [] [] goal (fn {context, ...} => HEADGOAL (
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    72
      Boogie_Tactics.split_tac
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    73
      THEN' Boogie_Tactics.drop_assert_at_tac
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    74
      THEN' SUBPROOF (fn _ => Tactic.rtac thm 1) context))
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    75
in
35864
d82c0dd51794 use a proof context instead of a local theory
boehmes
parents: 35356
diff changeset
    76
fun boogie_vc (vc_name, vc_opts) thy =
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    77
  let
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    78
    val vc = get_vc thy vc_name
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    79
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    80
    fun extract vc l =
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    81
      (case Boogie_VCs.extract vc l of
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    82
        SOME vc' => vc'
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    83
      | NONE => error ("There is no assertion to be proved with label " ^
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    84
          quote l ^ "."))
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    85
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    86
    val vcs =
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    87
      (case vc_opts of
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    88
        VC_Complete => [vc]
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    89
      | VC_Take (ps, NONE) => [Boogie_VCs.paths_and ps [] vc]
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    90
      | VC_Take (ps, SOME (true, ls)) => [Boogie_VCs.paths_and ps ls vc]
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    91
      | VC_Take (ps, SOME (false, ls)) => [Boogie_VCs.paths_without ps ls vc]
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    92
      | VC_Only ls => [Boogie_VCs.only ls vc]
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    93
      | VC_Without ls => [Boogie_VCs.without ls vc]
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    94
      | VC_Examine ls => map (extract vc) ls
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    95
      | VC_Single l => [extract vc l])
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
    96
    val ts = map Boogie_VCs.prop_of_vc vcs
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
    97
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    98
    val (prepare, finish) =
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
    99
      (case vc_opts of
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   100
         VC_Single _ => (single_prep (hd ts), single_prove (hd ts))
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   101
      | _ => (pair ts, K I))
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   102
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   103
    val discharge = fold (Boogie_VCs.discharge o pair vc_name)
38756
d07959fabde6 renamed ProofContext.theory(_result) to ProofContext.background_theory(_result) to emphasize that this belongs to the infrastructure and is rarely appropriate in user-space tools;
wenzelm
parents: 37944
diff changeset
   104
    fun after_qed [thms] = ProofContext.background_theory (discharge (vcs ~~ thms))
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   105
      | after_qed _ = I
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   106
  in
36610
bafd82950e24 renamed ProofContext.init to ProofContext.init_global to emphasize that this is not the real thing;
wenzelm
parents: 36323
diff changeset
   107
    ProofContext.init_global thy
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   108
    |> fold Variable.auto_fixes ts
35864
d82c0dd51794 use a proof context instead of a local theory
boehmes
parents: 35356
diff changeset
   109
    |> (fn ctxt1 => ctxt1
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   110
    |> prepare
35864
d82c0dd51794 use a proof context instead of a local theory
boehmes
parents: 35356
diff changeset
   111
    |-> (fn us => fn ctxt2 => ctxt2
36323
655e2d74de3a modernized naming conventions of main Isar proof elements;
wenzelm
parents: 35864
diff changeset
   112
    |> Proof.theorem NONE (fn thmss => fn ctxt =>
35864
d82c0dd51794 use a proof context instead of a local theory
boehmes
parents: 35356
diff changeset
   113
         let val export = map (finish ctxt1) o ProofContext.export ctxt ctxt2
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   114
         in after_qed (map export thmss) ctxt end) [map (rpair []) us]))
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   115
  end
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   116
end
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   117
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   118
fun write_list head =
40627
becf5d5187cc renamed raw "explode" function to "raw_explode" to emphasize its meaning;
wenzelm
parents: 40580
diff changeset
   119
  map Pretty.str o sort (dict_ord string_ord o pairself raw_explode) #>
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   120
  Pretty.writeln o Pretty.big_list head
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   121
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   122
fun parens s = "(" ^ s ^ ")"
34079
3edfefaaf355 print assertions in a more natural order
boehmes
parents: 34068
diff changeset
   123
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   124
fun boogie_status thy =
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   125
  let
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   126
    fun string_of_state Boogie_VCs.Proved = "proved"
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   127
      | string_of_state Boogie_VCs.NotProved = "not proved"
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   128
      | string_of_state Boogie_VCs.PartiallyProved = "partially proved"
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   129
  in
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   130
    Boogie_VCs.state_of thy
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   131
    |> map (fn (name, proved) => name ^ " " ^ parens (string_of_state proved))
34080
a36d80e4e42e also sort verification conditions before printing
boehmes
parents: 34079
diff changeset
   132
    |> write_list "Boogie verification conditions:"
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   133
  end
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   134
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   135
fun boogie_status_vc full vc_name thy =
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   136
  let
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   137
    fun pretty tag s = s ^ " " ^ parens tag
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   138
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   139
    val (not_proved, proved) = Boogie_VCs.state_of_vc thy vc_name
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   140
  in
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   141
    if full
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   142
    then write_list ("Assertions of Boogie verification condition " ^
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   143
      quote vc_name ^ ":")
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   144
      (map (pretty "proved") proved @ map (pretty "not proved") not_proved)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   145
    else write_list ("Unproved assertions of Boogie verification condition " ^
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   146
      quote vc_name ^ ":") not_proved
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   147
  end
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   148
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   149
fun boogie_status_vc_paths full vc_name thy =
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   150
  let
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   151
    fun labels ls = Pretty.blk (0, Pretty.breaks (map Pretty.str ls))
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   152
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   153
    fun pp (i, ns) =
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   154
      if full
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   155
      then
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   156
        [Pretty.big_list ("Path " ^ string_of_int (i+1) ^ ":")
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   157
          [labels (map (fn (n, true) => n | (n, _) => parens n) ns)]]
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   158
      else
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   159
        let val ns' = map_filter (fn (n, true) => SOME n | _ => NONE) ns
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   160
        in
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   161
          if null ns' then []
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   162
          else
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   163
            [Pretty.big_list ("Unproved assertions of path " ^
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   164
              string_of_int (i+1) ^ ":") [labels ns']]
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   165
        end
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   166
  in
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   167
    Pretty.writeln
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   168
      (Pretty.big_list
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   169
        ("Paths of Boogie verification condition " ^ quote vc_name ^ ":")
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   170
        (flat (map_index pp (Boogie_VCs.path_names_of (get_vc thy vc_name)))))
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   171
  end
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   172
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   173
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   174
local
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   175
  fun trying s = tracing ("Trying " ^ s ^ " ...")
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   176
  fun success_on s = tracing ("Succeeded on " ^ s ^ ".")
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   177
  fun failure_on s c = tracing ("Failed on " ^ s ^ c)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   178
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   179
  fun string_of_asserts vc = space_implode ", " (fst (Boogie_VCs.names_of vc))
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   180
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   181
  fun string_of_path (i, n) =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   182
    "path " ^ string_of_int i ^ " of " ^ string_of_int n
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   183
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   184
  fun itemize_paths ps =
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   185
    let val n = length ps
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   186
    in fst (fold_map (fn p => fn i => (((i, n), p), i+1)) ps 1) end
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   187
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   188
  fun par_map f = flat o Par_List.map f
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   189
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   190
  fun divide f vc =
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   191
    let val n = Boogie_VCs.size_of vc
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   192
    in
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   193
      if n <= 1 then fst (Boogie_VCs.names_of vc)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   194
      else
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   195
        let val (vc1, vc2) = the (Boogie_VCs.split_path (n div 2) vc)
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   196
        in par_map f [vc1, vc2] end
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   197
    end
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   198
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   199
  fun prove thy meth vc =
36610
bafd82950e24 renamed ProofContext.init to ProofContext.init_global to emphasize that this is not the real thing;
wenzelm
parents: 36323
diff changeset
   200
    ProofContext.init_global thy
36323
655e2d74de3a modernized naming conventions of main Isar proof elements;
wenzelm
parents: 35864
diff changeset
   201
    |> Proof.theorem NONE (K I) [[(Boogie_VCs.prop_of_vc vc, [])]]
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   202
    |> Proof.apply meth
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   203
    |> Seq.hd
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   204
    |> Proof.global_done_proof
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   205
in
35323
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   206
fun boogie_narrow_vc (quick, timeout) vc_name meth thy =
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   207
  let
35323
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   208
    fun tp t = TimeLimit.timeLimit (Time.fromSeconds t) (prove thy meth)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   209
35323
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   210
    fun try_vc t (tag, split_tag) split vc = (trying tag;
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   211
      (case try (tp t) vc of
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   212
        SOME _ => (success_on tag; [])
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   213
      | NONE => (failure_on tag split_tag; split vc)))
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   214
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   215
    fun some_asserts vc =
35323
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   216
      let
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   217
        val (t, sep) = if Boogie_VCs.size_of vc = 1 then (timeout, ".")
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   218
          else (quick, ", further splitting ...")
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   219
      in try_vc t (string_of_asserts vc, sep) (divide some_asserts) vc end
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   220
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   221
    fun single_path p =
35323
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   222
      try_vc quick (string_of_path p, ", splitting into assertions ...")
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   223
        (divide some_asserts)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   224
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   225
    val complete_vc =
35323
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   226
      try_vc quick ("full goal", ", splitting into paths ...")
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   227
        (par_map (uncurry single_path) o itemize_paths o Boogie_VCs.paths_of)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   228
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   229
    val unsolved = complete_vc (get_vc thy vc_name)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   230
  in
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   231
    if null unsolved
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   232
    then writeln ("Completely solved Boogie verification condition " ^
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   233
      quote vc_name ^ ".")
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   234
    else write_list ("Unsolved assertions of Boogie verification condition " ^
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   235
      quote vc_name ^ ":") unsolved
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   236
  end
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   237
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   238
fun boogie_scan_vc timeout vc_name meth thy =
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   239
  let
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   240
    val tp = TimeLimit.timeLimit (Time.fromSeconds timeout) (prove thy meth)
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   241
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   242
    val vc = get_vc thy vc_name
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   243
    fun prove_assert name =
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   244
      (trying name; tp (the (Boogie_VCs.extract vc name)))
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   245
    val find_first_failure = find_first (is_none o try prove_assert)
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   246
  in
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   247
    (case find_first_failure (fst (Boogie_VCs.names_of vc)) of
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   248
      SOME name => writeln ("failed on " ^ quote name)
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   249
    | NONE => writeln "succeeded")
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   250
  end
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   251
end
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   252
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   253
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   254
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   255
fun boogie_end thy =
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   256
  let
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   257
    fun not_proved (_, Boogie_VCs.Proved) = NONE
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   258
      | not_proved (name, _) = SOME name
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   259
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   260
    val unproved = map_filter not_proved (Boogie_VCs.state_of thy)
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   261
  in
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   262
    if null unproved then Boogie_VCs.close thy
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   263
    else error (Pretty.string_of (Pretty.big_list 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   264
      "The following verification conditions have not been proved:"
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   265
      (map Pretty.str unproved)))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   266
  end
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   267
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   268
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   269
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   270
(* syntax and setup *)
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   271
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   272
fun scan_val n f = Args.$$$ n -- Args.colon |-- f
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   273
fun scan_arg f = Args.parens f
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   274
fun scan_opt n = Scan.optional (scan_arg (Args.$$$ n >> K true)) false
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   275
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   276
val vc_offsets = Scan.optional (Args.bracks (Parse.list1
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   277
  (Parse.string --| Args.colon -- Parse.nat))) []
35125
acace7e30357 optionally localize assertion labels (based on user-defined offsets) to reduce the effort of label adaptions after changes to the source program
boehmes
parents: 34181
diff changeset
   278
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   279
val _ =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   280
  Outer_Syntax.command "boogie_open"
37944
4b7afae88c57 observe standard conventions for doc-strings;
wenzelm
parents: 36960
diff changeset
   281
    "open a new Boogie environment and load a Boogie-generated .b2i file"
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   282
    Keyword.thy_decl
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   283
    (scan_opt "quiet" -- Parse.name -- vc_offsets >> 
35125
acace7e30357 optionally localize assertion labels (based on user-defined offsets) to reduce the effort of label adaptions after changes to the source program
boehmes
parents: 34181
diff changeset
   284
      (Toplevel.theory o boogie_open))
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   285
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   286
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   287
val vc_name = Parse.name
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   288
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   289
val vc_label = Parse.name
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   290
val vc_labels = Scan.repeat1 vc_label
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   291
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   292
val vc_paths =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   293
  Parse.nat -- (Args.$$$ "-" |-- Parse.nat) >> (op upto) ||
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   294
  Parse.nat >> single
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   295
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   296
val vc_opts =
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   297
  scan_arg
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   298
   (scan_val "assertion" vc_label >> VC_Single ||
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   299
    scan_val "examine" vc_labels >> VC_Examine ||
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   300
    scan_val "take" ((Parse.list vc_paths >> flat) -- Scan.option (
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   301
      scan_val "without" vc_labels >> pair false ||
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   302
      scan_val "and_also" vc_labels >> pair true) >> VC_Take) ||
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   303
    scan_val "only" vc_labels >> VC_Only ||
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   304
    scan_val "without" vc_labels >> VC_Without) ||
35356
5c937073e1d5 added variant of boogie_vc to prove a single assertion: keep premises (i.e. the trace up this assertion) as facts in the context (and not as part of the goal) to increase performance when dealing with large goals
boehmes
parents: 35323
diff changeset
   305
  Scan.succeed VC_Complete
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   306
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   307
val _ =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   308
  Outer_Syntax.command "boogie_vc"
37944
4b7afae88c57 observe standard conventions for doc-strings;
wenzelm
parents: 36960
diff changeset
   309
    "enter into proof mode for a specific verification condition"
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   310
    Keyword.thy_goal
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   311
    (vc_name -- vc_opts >> (fn args =>
35864
d82c0dd51794 use a proof context instead of a local theory
boehmes
parents: 35356
diff changeset
   312
      (Toplevel.print o Toplevel.theory_to_proof (boogie_vc args))))
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   313
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   314
35323
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   315
val quick_timeout = 5
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   316
val default_timeout = 20
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   317
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   318
fun timeout name = Scan.optional (scan_val name Parse.nat)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   319
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   320
val status_test =
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   321
  scan_arg (
35323
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   322
    Args.$$$ "scan" |-- timeout "timeout" quick_timeout >> boogie_scan_vc ||
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   323
    Args.$$$ "narrow" |-- timeout "step_timeout" quick_timeout --
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   324
      timeout "final_timeout" default_timeout >> boogie_narrow_vc) --
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   325
  vc_name -- Method.parse >>
35323
259931828ecc separated narrowing timeouts for intermediate and final steps
boehmes
parents: 35125
diff changeset
   326
  (fn ((f, vc_name), meth) => f vc_name meth)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   327
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   328
val status_vc =
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   329
  (scan_arg
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   330
    (Args.$$$ "full" |--
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   331
      (Args.$$$ "paths" >> K (boogie_status_vc_paths true) ||
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   332
       Scan.succeed (boogie_status_vc true)) ||
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   333
     Args.$$$ "paths" >> K (boogie_status_vc_paths false)) ||
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   334
   Scan.succeed (boogie_status_vc false)) --
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   335
  vc_name >> (fn (f, vc_name) => f vc_name)
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   336
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   337
fun status_cmd f = Toplevel.no_timing o Toplevel.keep (fn state =>
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   338
  f (Toplevel.theory_of state))
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   339
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   340
val _ =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   341
  Outer_Syntax.improper_command "boogie_status"
37944
4b7afae88c57 observe standard conventions for doc-strings;
wenzelm
parents: 36960
diff changeset
   342
    "show the name and state of all loaded verification conditions"
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   343
    Keyword.diag
34181
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   344
    (status_test >> status_cmd ||
003333ffa543 merged verification condition structure and term representation in one datatype,
boehmes
parents: 34080
diff changeset
   345
     status_vc >> status_cmd ||
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   346
     Scan.succeed (status_cmd boogie_status))
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   347
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   348
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   349
val _ =
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   350
  Outer_Syntax.command "boogie_end"
37944
4b7afae88c57 observe standard conventions for doc-strings;
wenzelm
parents: 36960
diff changeset
   351
    "close the current Boogie environment"
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36610
diff changeset
   352
    Keyword.thy_decl
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   353
    (Scan.succeed (Toplevel.theory boogie_end))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   354
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33671
diff changeset
   355
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   356
val setup = Theory.at_end (fn thy =>
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   357
  let
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   358
    val _ = Boogie_VCs.is_closed thy
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   359
      orelse error ("Found the end of the theory, " ^ 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   360
        "but the last Boogie environment is still open.")
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   361
  in NONE end)
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   362
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
   363
end