Quotient-Paper/Paper.thy
changeset 2240 6c4b54482396
parent 2239 ff997de1bd73
child 2241 2a98980f7499
--- a/Quotient-Paper/Paper.thy	Mon Jun 14 07:55:02 2010 +0200
+++ b/Quotient-Paper/Paper.thy	Mon Jun 14 08:25:03 2010 +0200
@@ -875,13 +875,18 @@
 text {*
 
   In this section we will show, a complete interaction with the quotient package
-  for lifting a theorem about integers. A user of our quotient package first
-  needs to define a relation on the raw type, by which the quotienting will be
-  performed. We give the same integer relation as the one presented in the
-  introduction:
+  for defining the type of integers by quotienting pairs of natural numbers and
+  lifting theorems to integers. Our quotient package is fully compatible with
+  Isabelle type classes, but for clarity we will not use them in this example.
+  In a larger formalization of integers using the type class mechanism would
+  provide many algebraic properties ``for free''.
 
-  \begin{isabelle}\ \ \ \ \ \ \ \ \ \ %%%
-  \isacommand{fun}~~@{text "\<approx>"}~~\isacommand{where}~~@{text "(x \<Colon> nat, y) \<approx> (u, v) = (x + v = u + y)"}
+  A user of our quotient package first needs to define a relation on
+  the raw type, by which the quotienting will be performed. We give
+  the same integer relation as the one presented in the introduction:
+
+  \begin{isabelle}\ \ \ \ \ \ \ \ \ \ %
+  \isacommand{fun}~~@{text "\<approx>"}~~\isacommand{where}~~@{text "(m \<Colon> nat, n) \<approx> (p, q) = (m + q = n + p)"}
   \end{isabelle}
 
   \noindent
@@ -889,37 +894,53 @@
   relation is an equivalence relation which is solved automatically using the
   definitions:
 
-  \begin{isabelle}\ \ \ \ \ \ \ \ \ \ %%%
+  \begin{isabelle}\ \ \ \ \ \ \ \ \ \ %
   \isacommand{quotient\_type}~~@{text "int"}~~\isacommand{=}~~@{text "(nat \<times> nat)"}~~\isacommand{/}~~@{text "\<approx>"}
   \end{isabelle}
 
   \noindent
   The user can then specify the constants on the quotient type:
 
-  @{text "quotient_definition 0 \<Colon> int is (0\<Colon>nat, 0\<Colon>nat)"}
-  @{text "fun plus_raw where plus_raw (x, y) (u, v) = (x + u, y + v)"}
-  @{text "quotient_definition (op +) \<Colon> (int \<Rightarrow> int \<Rightarrow> int) is plus_raw"}
+  \begin{isabelle}\ \ \ \ \ \ \ \ \ \ %
+  \begin{tabular}{@ {}l}
+  \isacommand{quotient\_definition}~~@{text "0 :: int"}~~\isacommand{is}~~@{text "(0::nat, 0::nat)"}\\
+  \isacommand{fun}~~@{text "plus_raw"}~~\isacommand{where}~~@{text "plus_raw (m :: nat, n) (p, q) = (m + p, n + q)"}\\
+  \isacommand{quotient\_definition}~~@{text "(op +) \<Colon> (int \<Rightarrow> int \<Rightarrow> int)"}~~\isacommand{is}~~@{text "plus_raw"}\\
+  \end{tabular}
+  \end{isabelle}
 
+  \noindent
   Lets first take a simple theorem about addition on the raw level:
 
-  @{text "lemma plus_zero_raw: plus_raw (0, 0) i \<approx> i"}
+  \begin{isabelle}\ \ \ \ \ \ \ \ \ \ %
+  \isacommand{lemma}~~@{text "plus_zero_raw: plus_raw (0, 0) x \<approx> x"}
+  \end{isabelle}
 
+  \noindent
   When the user tries to lift a theorem about integer addition, the respectfulness
   proof obligation is left, so let us prove it first:
-  
-  @{text "lemma (op \<approx> \<Longrightarrow> op \<approx> \<Longrightarrow> op \<approx>) plus_raw plus_raw"}
 
+  \begin{isabelle}\ \ \ \ \ \ \ \ \ \ %
+  \isacommand{lemma}~~@{text "[quot_respect]: (op \<approx> \<Longrightarrow> op \<approx> \<Longrightarrow> op \<approx>) plus_raw plus_raw"}
+  \end{isabelle}
+
+  \noindent
   Can be proved automatically by the system just by unfolding the definition
-  of @{term "op \<Longrightarrow>"}.
-
+  of @{text "op \<Longrightarrow>"}.
   Now the user can either prove a lifted lemma explicitly:
 
-  @{text "lemma 0 + i = i by lifting plus_zero_raw"}
+  \begin{isabelle}\ \ \ \ \ \ \ \ \ \ %
+  \isacommand{lemma}~~@{text "0 + (x :: int) = x"}~~\isacommand{by}~~@{text "lifting plus_zero_raw"}
+  \end{isabelle}
 
+  \noindent
   Or in this simple case use the automated translation mechanism:
 
-  @{text "thm plus_zero_raw[quot_lifted]"}
+  \begin{isabelle}\ \ \ \ \ \ \ \ \ \ %
+  \isacommand{thm}~~@{text "plus_zero_raw[quot_lifted]"}
+  \end{isabelle}
 
+  \noindent
   obtaining the same result.
 *}