Slight improvements of the layout

This commit is contained in:
Burkhart Wolff 2020-10-25 12:57:43 +01:00
parent 3c6197e6ca
commit 3ba9454ac7
1 changed files with 49 additions and 44 deletions

View File

@ -53,7 +53,8 @@ text*[abs::abstract,
chapter*[intro::introduction]\<open> Introduction \<close> chapter*[intro::introduction]\<open> Introduction \<close>
text\<open> While Isabelle @{cite "DBLP:books/sp/NipkowPW02"} is mostly known as part of Isabelle/HOL text\<open> \<^vs>\<open>-0.5cm\<close>
While Isabelle @{cite "DBLP:books/sp/NipkowPW02"} is mostly known as part of Isabelle/HOL
(an interactive theorem prover), it actually provides a system framework for developing a wide (an interactive theorem prover), it actually provides a system framework for developing a wide
spectrum of applications. A particular strength of the Isabelle framework is the combination spectrum of applications. A particular strength of the Isabelle framework is the combination
of text editing, formal verification, and code generation. This is a programming-tutorial of of text editing, formal verification, and code generation. This is a programming-tutorial of
@ -67,18 +68,17 @@ text\<open> While Isabelle @{cite "DBLP:books/sp/NipkowPW02"} is mostly known as
types, intermediate results of computations and checks can be repeated by the reader who is types, intermediate results of computations and checks can be repeated by the reader who is
invited to interact with this document. Moreover, the textual parts have been enriched with a invited to interact with this document. Moreover, the textual parts have been enriched with a
maximum of formal content which makes this text re-checkable at each load and easier maximum of formal content which makes this text re-checkable at each load and easier
maintainable.\<close> maintainable. \<close>
figure*[architecture::figure,relative_width="80",src="''figures/isabelle-architecture''"]\<open> figure*[architecture::figure,relative_width="70",src="''figures/isabelle-architecture''"]\<open>
The system architecture of Isabelle (left-hand side) and the The system architecture of Isabelle (left-hand side) and the asynchronous communication
asynchronous communication between the Isabelle system and between the Isabelle system and the IDE (right-hand side). \<close>
the IDE (right-hand side). \<close>
text\<open>This programming roughly follows the Isabelle system architecture shown in text\<open>This programming roughly follows the Isabelle system architecture shown in
\<^figure>\<open>architecture\<close>, and, to be more precise, more or less in the bottom-up order. \<^figure>\<open>architecture\<close>, and, to be more precise, more or less in the bottom-up order.
We start from the basic underlying SML platform over the Kernels to the tactical layer We start from the basic underlying SML platform over the Kernels to the tactical layer
and end with a discussion over the front-end technologies. and end with a discussion over the front-end technologies. \<^vs>\<open>-1.0cm\<close>
\<close> \<close>
chapter*[t1::technical]\<open> SML and Fundamental SML libraries \<close> chapter*[t1::technical]\<open> SML and Fundamental SML libraries \<close>
@ -91,7 +91,8 @@ text\<open>Isabelle is written in SML, the "Standard Meta-Language", which is is
of Isabelle directly. In the example, a mutable variable X is declared, initialized to 0 and of Isabelle directly. In the example, a mutable variable X is declared, initialized to 0 and
updated; and finally re-evaluated leading to output: \<close> updated; and finally re-evaluated leading to output: \<close>
ML\<open> val X = Unsynchronized.ref 0; ML\<open>
val X = Unsynchronized.ref 0;
X:= !X + 1; X:= !X + 1;
X X
\<close> \<close>
@ -102,11 +103,13 @@ text\<open>However, since Isabelle is a platform involving parallel execution, c
code-base @{cite "DBLP:conf/mkm/BarrasGHRTWW13"}. code-base @{cite "DBLP:conf/mkm/BarrasGHRTWW13"}.
The preferred programming style is purely functional: \<close> The preferred programming style is purely functional: \<close>
ML\<open> fun fac x = if x = 0 then 1 else x * fac(x-1) ; ML\<open>
fun fac x = if x = 0 then 1 else x * fac(x-1) ;
fac 10; fac 10;
\<close> \<close>
text\<open>or:\<close> text\<open>or:\<close>
ML\<open> type state = { a : int, b : string} ML\<open>
type state = { a : int, b : string}
fun incr_state ({a, b}:state) = {a=a+1, b=b} fun incr_state ({a, b}:state) = {a=a+1, b=b}
\<close> \<close>
@ -130,18 +133,18 @@ text\<open>So: the text command for:\<close>
text\<open>\<^emph>\<open>This is a text.\<close>\<close> text\<open>\<^emph>\<open>This is a text.\<close>\<close>
text\<open>... is represented in an \<^verbatim>\<open>.thy\<close> file by:\<close> text\<open>... is represented in the integrated source (the \<^verbatim>\<open>.thy\<close> file) by:\<close>
text\<open>\verb+text\<open>\<^emph>\<open>This is a text.\<close>\<close>+\<close> text\<open> *\<open>\<open>\<close>This is a text.\<open>\<close>\<close>\<close>
text\<open>and desplayed in the Isabelle/jedit front-end at the sceen by:\<close> text\<open>and displayed in the Isabelle/jedit front-end at the sceen by:\<close>
figure*[fig2::figure, relative_width="100",src="''figures/text-element''"] figure*[fig2::figure, relative_width="60", placement="pl_h", src="''figures/text-element''"]
\<open>A text-element as presented in Isabelle/jedit.\<close> \<open>A text-element as presented in Isabelle/jedit.\<close>
text\<open> text-commands, ML- commands (and in principle any other command) can be seen as text\<open>The text-commands, ML- commands (and in principle any other command) can be seen as
\<^emph>\<open>quotations\<close> over the underlying SML environment (similar to OCaml or Haskell). \<^emph>\<open>quotations\<close> over the underlying SML environment (similar to OCaml or Haskell).
Linking these different sorts of quotations with each other and the underlying SML-envirnment Linking these different sorts of quotations with each other and the underlying SML-environment
is supported via \<^emph>\<open>antiquotations\<close>'s. Generally speaking, antiquotations are a kind of semantic is supported via \<^emph>\<open>antiquotations\<close>'s. Generally speaking, antiquotations are a kind of semantic
macro whose arguments were checked, interpreted and expanded using the underlying system macro whose arguments were checked, interpreted and expanded using the underlying system
state. This paves the way for a programming technique to specify expressions or patterns in an state. This paves the way for a programming technique to specify expressions or patterns in an
@ -149,8 +152,9 @@ text\<open> text-commands, ML- commands (and in principle any other command) can
Anti-quotations as "semantic macros" can produce a value for the surrounding context Anti-quotations as "semantic macros" can produce a value for the surrounding context
(ML, text, HOL, whatever) depending on local arguments and the underlying logical context. (ML, text, HOL, whatever) depending on local arguments and the underlying logical context.
The way an antiquotation is specified depends on the quotation expander: typically, this is a specific The way an antiquotation is specified depends on the quotation expander: typically, this is a
character and an identifier, or specific parentheses and a complete expression or pattern.\<close> specific character and an identifier, or specific parentheses and a complete expression or
pattern.\<close>
text\<open> In Isabelle documentations, antiquotation's were heavily used to enrich literate explanations text\<open> In Isabelle documentations, antiquotation's were heavily used to enrich literate explanations
and documentations by "formal content", i.e. machine-checked, typed references and documentations by "formal content", i.e. machine-checked, typed references
@ -162,7 +166,7 @@ text\<open> In Isabelle documentations, antiquotation's were heavily used to enr
\<^item> \<^theory_text>\<open>text\<open>@{footnote \<open>sdf\<close>}, @{file "$ISABELLE_HOME/src/Pure/ROOT.ML"}\<close>\<close> \<^item> \<^theory_text>\<open>text\<open>@{footnote \<open>sdf\<close>}, @{file "$ISABELLE_HOME/src/Pure/ROOT.ML"}\<close>\<close>
\<^item> @{theory_text [display] \<^item> @{theory_text [display]
\<open> val x = @{thm refl}; \<open> val x = @{thm refl};
val y = @{term "A \<longrightarrow> B"} val _ = @{term "A \<longrightarrow> B"}
val y = @{typ "'a list"} val y = @{typ "'a list"}
\<close> \<close>
} }
@ -170,13 +174,14 @@ text\<open> In Isabelle documentations, antiquotation's were heavily used to enr
(*<*) (* example to execute: *) (*<*) (* example to execute: *)
text\<open> @{footnote \<open>sdf\<close>}, @{file "$ISABELLE_HOME/src/Pure/ROOT.ML"}\<close> text\<open> @{footnote \<open>sdf\<close>}, @{file "$ISABELLE_HOME/src/Pure/ROOT.ML"}\<close>
ML\<open> val x = @{thm refl}; ML\<open>
val y = @{term "A \<longrightarrow> B"} val x = @{thm refl};
val _ = @{term "A \<longrightarrow> B"}
val y = @{typ "'a list"} val y = @{typ "'a list"}
\<close> \<close>
(*>*) (*>*)
text\<open>... which we will describe in more detail later. \<close> text\<open>\<^vs>\<open>-1,0cm\<close>... which we will describe in more detail later. \<close>
text\<open>In a way, anti-quotations implement a kind of text\<open>In a way, anti-quotations implement a kind of
literate specification style in text, models, code, proofs, etc., which become alltogether literate specification style in text, models, code, proofs, etc., which become alltogether
@ -478,28 +483,28 @@ text\<open>Note, furthermore, that there is a programming API for the HOL-instan
operators of the HOL logic specific constructors and destructors:\<close> operators of the HOL logic specific constructors and destructors:\<close>
text*[T2::technical]\<open> text*[T2::technical]\<open>
\<^enum> \<^ML>\<open>HOLogic.boolT : typ\<close> \<^enum> \<^ML>\<open>HOLogic.boolT : typ\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.mk_Trueprop : term -> term\<close>, the embedder of bool to prop fundamental for HOL \<^enum> \<^ML>\<open>HOLogic.mk_Trueprop : term -> term\<close>, the embedder of bool to prop fundamental for HOL \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.dest_Trueprop : term -> term\<close> \<^enum> \<^ML>\<open>HOLogic.dest_Trueprop : term -> term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.Trueprop_conv : conv -> conv\<close> \<^enum> \<^ML>\<open>HOLogic.Trueprop_conv : conv -> conv\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.mk_setT : typ -> typ\<close>, the ML level type constructor set \<^enum> \<^ML>\<open>HOLogic.mk_setT : typ -> typ\<close>, the ML level type constructor set \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.dest_setT : typ -> typ\<close>, the ML level type destructor for set \<^enum> \<^ML>\<open>HOLogic.dest_setT : typ -> typ\<close>, the ML level type destructor for set \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.Collect_const : typ -> term\<close> \<^enum> \<^ML>\<open>HOLogic.Collect_const : typ -> term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.mk_Collect : string * typ * term -> term\<close> \<^enum> \<^ML>\<open>HOLogic.mk_Collect : string * typ * term -> term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.mk_mem : term * term -> term\<close> \<^enum> \<^ML>\<open>HOLogic.mk_mem : term * term -> term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.dest_mem : term -> term * term\<close> \<^enum> \<^ML>\<open>HOLogic.dest_mem : term -> term * term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.mk_set : typ -> term list -> term\<close> \<^enum> \<^ML>\<open>HOLogic.mk_set : typ -> term list -> term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.conj_intr : Proof.context -> thm -> thm -> thm\<close>, some HOL-level derived-inferences \<^enum> \<^ML>\<open>HOLogic.conj_intr : Proof.context -> thm -> thm -> thm\<close>, some HOL-level derived-inferences \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.conj_elim : Proof.context -> thm -> thm * thm\<close> \<^enum> \<^ML>\<open>HOLogic.conj_elim : Proof.context -> thm -> thm * thm\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.conj_elims : Proof.context -> thm -> thm list\<close> \<^enum> \<^ML>\<open>HOLogic.conj_elims : Proof.context -> thm -> thm list\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.conj : term\<close> , some ML level logical constructors \<^enum> \<^ML>\<open>HOLogic.conj : term\<close> , some ML level logical constructors \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.disj : term\<close> \<^enum> \<^ML>\<open>HOLogic.disj : term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.imp : term\<close> \<^enum> \<^ML>\<open>HOLogic.imp : term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.Not : term\<close> \<^enum> \<^ML>\<open>HOLogic.Not : term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.mk_not : term -> term\<close> \<^enum> \<^ML>\<open>HOLogic.mk_not : term -> term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.mk_conj : term * term -> term\<close> \<^enum> \<^ML>\<open>HOLogic.mk_conj : term * term -> term\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.dest_conj : term -> term list\<close> \<^enum> \<^ML>\<open>HOLogic.dest_conj : term -> term list\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> \<^ML>\<open>HOLogic.conjuncts : term -> term list\<close> \<^enum> \<^ML>\<open>HOLogic.conjuncts : term -> term list\<close> \<^vs>\<open>-0,2cm\<close>
\<^enum> ... \<^enum> ...
\<close> \<close>