src/HOL/Hoare/Hoare_Syntax.thy
author wenzelm
Fri, 18 Oct 2024 16:37:39 +0200
changeset 81189 47a0dfee26ea
parent 80914 d97fdabd9e2b
permissions -rw-r--r--
more inner-syntax markup;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72987
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Hoare/Hoare_Syntax.thy
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
     2
    Author:     Leonor Prensa Nieto & Tobias Nipkow
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
     3
    Author:     Walter Guttmann (extension to total-correctness proofs)
72990
db8f94656024 tuned document, notably authors and sections;
wenzelm
parents: 72987
diff changeset
     4
*)
72987
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
     5
72990
db8f94656024 tuned document, notably authors and sections;
wenzelm
parents: 72987
diff changeset
     6
section \<open>Concrete syntax for Hoare logic, with translations for variables\<close>
72987
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
     7
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
     8
theory Hoare_Syntax
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
     9
  imports Main
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    10
begin
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    11
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    12
syntax
81189
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    13
  "_assign" :: "idt \<Rightarrow> 'b \<Rightarrow> 'com"
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    14
    (\<open>(\<open>indent notation=\<open>infix Hoare assignment\<close>\<close>_ :=/ _)\<close> [70, 65] 61)
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    15
  "_Seq" :: "'com \<Rightarrow> 'com \<Rightarrow> 'com"
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    16
    (\<open>(\<open>notation=\<open>infix Hoare sequential composition\<close>\<close>_;/ _)\<close> [61, 60] 60)
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    17
  "_Cond" :: "'bexp \<Rightarrow> 'com \<Rightarrow> 'com \<Rightarrow> 'com"
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    18
    (\<open>(\<open>notation=\<open>mixfix Hoare if expression\<close>\<close>IF _/ THEN _ / ELSE _/ FI)\<close> [0, 0, 0] 61)
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    19
  "_While" :: "'bexp \<Rightarrow> 'assn \<Rightarrow> 'var \<Rightarrow> 'com \<Rightarrow> 'com"
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    20
    (\<open>(\<open>notation=\<open>mixfix Hoare while expression\<close>\<close>WHILE _/ INV {(_)} / VAR {(_)} //DO _ /OD)\<close> [0, 0, 0, 0] 61)
72987
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    21
74503
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    22
text \<open>The \<open>VAR {_}\<close> syntax supports two variants:
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    23
\<^item> \<open>VAR {x = t}\<close> where \<open>t::nat\<close> is the decreasing expression,
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    24
  the variant, and \<open>x\<close> a variable that can be referred to from inner annotations.
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    25
  The \<open>x\<close> can be necessary for nested loops, e.g. to prove that the inner loops do not mess with \<open>t\<close>.
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    26
\<^item> \<open>VAR {t}\<close> where the variable is omitted because it is not needed.
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    27
\<close>
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    28
72987
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    29
syntax
81189
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    30
  "_While0" :: "'bexp \<Rightarrow> 'assn \<Rightarrow> 'com \<Rightarrow> 'com"
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    31
    (\<open>(\<open>indent=1 notation=\<open>mixfix Hoare while expression\<close>\<close>WHILE _/ INV (\<open>open_block notation=\<open>mixfix Hoare invariant\<close>\<close>{_}) //DO _ /OD)\<close> [0, 0, 0] 61)
74503
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    32
text \<open>The \<open>_While0\<close> syntax is translated into the \<open>_While\<close> syntax with the trivial variant 0.
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    33
This is ok because partial correctness proofs do not make use of the variant.\<close>
72987
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    34
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    35
syntax
81189
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    36
  "_hoare_vars" :: "[idts, 'assn,'com, 'assn] \<Rightarrow> bool"
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    37
    (\<open>(\<open>open_block notation=\<open>mixfix Hoare triple\<close>\<close>VARS _// (\<open>open_block notation=\<open>mixfix Hoare precondition\<close>\<close>{_}) // _ // (\<open>open_block notation=\<open>mixfix Hoare postcondition\<close>\<close>{_}))\<close> [0, 0, 55, 0] 50)
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    38
  "_hoare_vars_tc" :: "[idts, 'assn, 'com, 'assn] \<Rightarrow> bool"
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    39
    (\<open>(\<open>open_block notation=\<open>mixfix Hoare triple\<close>\<close>VARS _// (\<open>open_block notation=\<open>mixfix Hoare precondition\<close>\<close>[_]) // _ // (\<open>open_block notation=\<open>mixfix Hoare postcondition\<close>\<close>[_]))\<close> [0, 0, 55, 0] 50)
72987
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    40
syntax (output)
81189
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    41
  "_hoare" :: "['assn, 'com, 'assn] \<Rightarrow> bool"
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    42
    (\<open>(\<open>notation=\<open>mixfix Hoare triple\<close>\<close>(\<open>open_block notation=\<open>mixfix Hoare precondition\<close>\<close>{_})//_//(\<open>open_block notation=\<open>mixfix Hoare postcondition\<close>\<close>{_}))\<close> [0, 55, 0] 50)
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    43
  "_hoare_tc" :: "['assn, 'com, 'assn] \<Rightarrow> bool"
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    44
    (\<open>(\<open>notation=\<open>mixfix Hoare triple\<close>\<close>(\<open>open_block notation=\<open>mixfix Hoare precondition\<close>\<close>[_])//_//(\<open>open_block notation=\<open>mixfix Hoare postcondition\<close>\<close>[_]))\<close> [0, 55, 0] 50)
72987
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    45
74503
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    46
text \<open>Completeness requires(?) the ability to refer to an outer variant in an inner invariant.
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    47
Thus we need to abstract over a variable equated with the variant, the \<open>x\<close> in \<open>VAR {x = t}\<close>.
81189
47a0dfee26ea more inner-syntax markup;
wenzelm
parents: 80914
diff changeset
    48
But the \<open>x\<close> should only occur in invariants. To enforce this, syntax translations in \<^file>\<open>hoare_syntax.ML\<close>
74503
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    49
separate the program from its annotations and only the latter are abstracted over over \<open>x\<close>.
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    50
(Thus \<open>x\<close> can also occur in inner variants, but that neither helps nor hurts.)\<close>
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    51
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    52
datatype 'a anno =
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    53
  Abasic |
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    54
  Aseq "'a anno"  "'a anno" |
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    55
  Acond "'a anno" "'a anno" |
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    56
  Awhile "'a set" "'a \<Rightarrow> nat" "nat \<Rightarrow> 'a anno"
403ce50e6a2a separated commands from annotations to be able to abstract about the latter only
nipkow
parents: 72990
diff changeset
    57
72987
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    58
ML_file \<open>hoare_syntax.ML\<close>
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    59
b1be35908165 clarified modules: avoid multiple uses of the same ML file;
wenzelm
parents:
diff changeset
    60
end