doc-src/IsarAdvanced/Codegen/Thy/document/Program.tex
changeset 28562 4e74209f113e
parent 28462 6ec603695aaf
child 28564 1358b1ddd915
equal deleted inserted replaced
28561:056255ade52a 28562:4e74209f113e
    53 %
    53 %
    54 \endisadelimquoteme
    54 \endisadelimquoteme
    55 %
    55 %
    56 \isatagquoteme
    56 \isatagquoteme
    57 \isacommand{lemma}\isamarkupfalse%
    57 \isacommand{lemma}\isamarkupfalse%
    58 \ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
    58 \ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
    59 \ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
    59 \ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
    60 \ \ \ \ \ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ {\isacharparenleft}None{\isacharcomma}\ Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\isanewline
    60 \ \ \ \ \ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ {\isacharparenleft}None{\isacharcomma}\ Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\isanewline
    61 \ \ \ \ \ \ \ else\ dequeue\ {\isacharparenleft}Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
    61 \ \ \ \ \ \ \ else\ dequeue\ {\isacharparenleft}Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
    62 \ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
    62 \ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
    63 \ \ \ \ \ {\isacharparenleft}Some\ y{\isacharcomma}\ Queue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
    63 \ \ \ \ \ {\isacharparenleft}Some\ y{\isacharcomma}\ Queue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
    69 \isadelimquoteme
    69 \isadelimquoteme
    70 %
    70 %
    71 \endisadelimquoteme
    71 \endisadelimquoteme
    72 %
    72 %
    73 \begin{isamarkuptext}%
    73 \begin{isamarkuptext}%
    74 \noindent The annotation \isa{{\isacharbrackleft}code\ func{\isacharbrackright}} is an \isa{Isar}
    74 \noindent The annotation \isa{{\isacharbrackleft}code{\isacharbrackright}} is an \isa{Isar}
    75   \isa{attribute} which states that the given theorems should be
    75   \isa{attribute} which states that the given theorems should be
    76   considered as defining equations for a \isa{fun} statement --
    76   considered as defining equations for a \isa{fun} statement --
    77   the corresponding constant is determined syntactically.  The resulting code:%
    77   the corresponding constant is determined syntactically.  The resulting code:%
    78 \end{isamarkuptext}%
    78 \end{isamarkuptext}%
    79 \isamarkuptrue%
    79 \isamarkuptrue%
   285 \verb|class (Semigroup a) => Monoid a where {|\newline%
   285 \verb|class (Semigroup a) => Monoid a where {|\newline%
   286 \verb|  neutral :: a;|\newline%
   286 \verb|  neutral :: a;|\newline%
   287 \verb|};|\newline%
   287 \verb|};|\newline%
   288 \newline%
   288 \newline%
   289 \verb|pow :: forall a. (Monoid a) => Nat -> a -> a;|\newline%
   289 \verb|pow :: forall a. (Monoid a) => Nat -> a -> a;|\newline%
       
   290 \verb|pow Zero_nat a = neutral;|\newline%
   290 \verb|pow (Suc n) a = mult a (pow n a);|\newline%
   291 \verb|pow (Suc n) a = mult a (pow n a);|\newline%
   291 \verb|pow Zero_nat a = neutral;|\newline%
       
   292 \newline%
   292 \newline%
   293 \verb|plus_nat :: Nat -> Nat -> Nat;|\newline%
   293 \verb|plus_nat :: Nat -> Nat -> Nat;|\newline%
   294 \verb|plus_nat (Suc m) n = plus_nat m (Suc n);|\newline%
   294 \verb|plus_nat (Suc m) n = plus_nat m (Suc n);|\newline%
   295 \verb|plus_nat Zero_nat n = n;|\newline%
   295 \verb|plus_nat Zero_nat n = n;|\newline%
   296 \newline%
   296 \newline%
   297 \verb|neutral_nat :: Nat;|\newline%
   297 \verb|neutral_nat :: Nat;|\newline%
   298 \verb|neutral_nat = Suc Zero_nat;|\newline%
   298 \verb|neutral_nat = Suc Zero_nat;|\newline%
   299 \newline%
   299 \newline%
   300 \verb|mult_nat :: Nat -> Nat -> Nat;|\newline%
   300 \verb|mult_nat :: Nat -> Nat -> Nat;|\newline%
       
   301 \verb|mult_nat Zero_nat n = Zero_nat;|\newline%
   301 \verb|mult_nat (Suc m) n = plus_nat n (mult_nat m n);|\newline%
   302 \verb|mult_nat (Suc m) n = plus_nat n (mult_nat m n);|\newline%
   302 \verb|mult_nat Zero_nat n = Zero_nat;|\newline%
       
   303 \newline%
   303 \newline%
   304 \verb|instance Semigroup Nat where {|\newline%
   304 \verb|instance Semigroup Nat where {|\newline%
   305 \verb|  mult = mult_nat;|\newline%
   305 \verb|  mult = mult_nat;|\newline%
   306 \verb|};|\newline%
   306 \verb|};|\newline%
   307 \newline%
   307 \newline%
   348 \newline%
   348 \newline%
   349 \verb|type 'a monoid = {Program__semigroup_monoid : 'a semigroup, neutral : 'a};|\newline%
   349 \verb|type 'a monoid = {Program__semigroup_monoid : 'a semigroup, neutral : 'a};|\newline%
   350 \verb|fun semigroup_monoid (A_:'a monoid) = #Program__semigroup_monoid A_;|\newline%
   350 \verb|fun semigroup_monoid (A_:'a monoid) = #Program__semigroup_monoid A_;|\newline%
   351 \verb|fun neutral (A_:'a monoid) = #neutral A_;|\newline%
   351 \verb|fun neutral (A_:'a monoid) = #neutral A_;|\newline%
   352 \newline%
   352 \newline%
   353 \verb|fun pow A_ (Suc n) a = mult (semigroup_monoid A_) a (pow A_ n a)|\newline%
   353 \verb|fun pow A_ Zero_nat a = neutral A_|\newline%
   354 \verb|  |\verb,|,\verb| pow A_ Zero_nat a = neutral A_;|\newline%
   354 \verb|  |\verb,|,\verb| pow A_ (Suc n) a = mult (semigroup_monoid A_) a (pow A_ n a);|\newline%
   355 \newline%
   355 \newline%
   356 \verb|fun plus_nat (Suc m) n = plus_nat m (Suc n)|\newline%
   356 \verb|fun plus_nat (Suc m) n = plus_nat m (Suc n)|\newline%
   357 \verb|  |\verb,|,\verb| plus_nat Zero_nat n = n;|\newline%
   357 \verb|  |\verb,|,\verb| plus_nat Zero_nat n = n;|\newline%
   358 \newline%
   358 \newline%
   359 \verb|val neutral_nat : nat = Suc Zero_nat;|\newline%
   359 \verb|val neutral_nat : nat = Suc Zero_nat;|\newline%
   360 \newline%
   360 \newline%
   361 \verb|fun mult_nat (Suc m) n = plus_nat n (mult_nat m n)|\newline%
   361 \verb|fun mult_nat Zero_nat n = Zero_nat|\newline%
   362 \verb|  |\verb,|,\verb| mult_nat Zero_nat n = Zero_nat;|\newline%
   362 \verb|  |\verb,|,\verb| mult_nat (Suc m) n = plus_nat n (mult_nat m n);|\newline%
   363 \newline%
   363 \newline%
   364 \verb|val semigroup_nat = {mult = mult_nat} : nat semigroup;|\newline%
   364 \verb|val semigroup_nat = {mult = mult_nat} : nat semigroup;|\newline%
   365 \newline%
   365 \newline%
   366 \verb|val monoid_nat =|\newline%
   366 \verb|val monoid_nat =|\newline%
   367 \verb|  {Program__semigroup_monoid = semigroup_nat, neutral = neutral_nat} :|\newline%
   367 \verb|  {Program__semigroup_monoid = semigroup_nat, neutral = neutral_nat} :|\newline%
   573 %
   573 %
   574 \endisadelimquoteme
   574 \endisadelimquoteme
   575 %
   575 %
   576 \isatagquoteme
   576 \isatagquoteme
   577 \isacommand{lemma}\isamarkupfalse%
   577 \isacommand{lemma}\isamarkupfalse%
   578 \ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
   578 \ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
   579 \ \ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
   579 \ \ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
   580 \ \ {\isachardoublequoteopen}m\ {\isacharplus}\ {\isadigit{0}}\ {\isacharequal}\ m{\isachardoublequoteclose}\isanewline
   580 \ \ {\isachardoublequoteopen}m\ {\isacharplus}\ {\isadigit{0}}\ {\isacharequal}\ m{\isachardoublequoteclose}\isanewline
   581 \ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ n{\isachardoublequoteclose}\isanewline
   581 \ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ n{\isachardoublequoteclose}\isanewline
   582 \ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ {\isadigit{1}}\ {\isacharequal}\ Dig{\isadigit{1}}\ m{\isachardoublequoteclose}\isanewline
   582 \ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ {\isadigit{1}}\ {\isacharequal}\ Dig{\isadigit{1}}\ m{\isachardoublequoteclose}\isanewline
   583 \ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
   583 \ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
   627 %
   627 %
   628 \endisadelimquoteme
   628 \endisadelimquoteme
   629 %
   629 %
   630 \isatagquoteme
   630 \isatagquoteme
   631 \isacommand{lemma}\isamarkupfalse%
   631 \isacommand{lemma}\isamarkupfalse%
   632 \ Suc{\isacharunderscore}Dig\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
   632 \ Suc{\isacharunderscore}Dig\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
   633 \ \ {\isachardoublequoteopen}Suc\ n\ {\isacharequal}\ n\ {\isacharplus}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
   633 \ \ {\isachardoublequoteopen}Suc\ n\ {\isacharequal}\ n\ {\isacharplus}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
   634 \ \ \isacommand{by}\isamarkupfalse%
   634 \ \ \isacommand{by}\isamarkupfalse%
   635 \ simp\isanewline
   635 \ simp\isanewline
   636 \isanewline
   636 \isanewline
   637 \isacommand{declare}\isamarkupfalse%
   637 \isacommand{declare}\isamarkupfalse%
   638 \ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline\ del{\isacharbrackright}\isanewline
   638 \ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline\ del{\isacharbrackright}\isanewline
   639 \isacommand{declare}\isamarkupfalse%
   639 \isacommand{declare}\isamarkupfalse%
   640 \ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code\ func\ del{\isacharbrackright}%
   640 \ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code\ del{\isacharbrackright}%
   641 \endisatagquoteme
   641 \endisatagquoteme
   642 {\isafoldquoteme}%
   642 {\isafoldquoteme}%
   643 %
   643 %
   644 \isadelimquoteme
   644 \isadelimquoteme
   645 %
   645 %
   713 %
   713 %
   714 \isataginvisible
   714 \isataginvisible
   715 \isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
   715 \isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
   716 \ {\isachardoublequoteopen}{\isadigit{0}}{\isacharcolon}{\isacharcolon}nat{\isachardoublequoteclose}\ Suc\isanewline
   716 \ {\isachardoublequoteopen}{\isadigit{0}}{\isacharcolon}{\isacharcolon}nat{\isachardoublequoteclose}\ Suc\isanewline
   717 \isacommand{declare}\isamarkupfalse%
   717 \isacommand{declare}\isamarkupfalse%
   718 \ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code\ func\ del{\isacharbrackright}\isanewline
   718 \ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code\ del{\isacharbrackright}\isanewline
   719 \isacommand{declare}\isamarkupfalse%
   719 \isacommand{declare}\isamarkupfalse%
   720 \ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline{\isacharbrackright}\isanewline
   720 \ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline{\isacharbrackright}\isanewline
   721 \isacommand{declare}\isamarkupfalse%
   721 \isacommand{declare}\isamarkupfalse%
   722 \ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code\ func{\isacharbrackright}\ \isanewline
   722 \ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code{\isacharbrackright}\ \isanewline
   723 \isacommand{lemma}\isamarkupfalse%
   723 \isacommand{lemma}\isamarkupfalse%
   724 \ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ {\isacharparenleft}n\ {\isasymColon}\ nat{\isacharparenright}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
   724 \ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ {\isacharparenleft}n\ {\isasymColon}\ nat{\isacharparenright}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
   725 \ simp%
   725 \ simp%
   726 \endisataginvisible
   726 \endisataginvisible
   727 {\isafoldinvisible}%
   727 {\isafoldinvisible}%
   728 %
   728 %
   729 \isadeliminvisible
   729 \isadeliminvisible
   782 \verb|type 'a eq = {eq : 'a -> 'a -> bool};|\newline%
   782 \verb|type 'a eq = {eq : 'a -> 'a -> bool};|\newline%
   783 \verb|fun eq (A_:'a eq) = #eq A_;|\newline%
   783 \verb|fun eq (A_:'a eq) = #eq A_;|\newline%
   784 \newline%
   784 \newline%
   785 \verb|fun eqop A_ a b = eq A_ a b;|\newline%
   785 \verb|fun eqop A_ a b = eq A_ a b;|\newline%
   786 \newline%
   786 \newline%
   787 \verb|fun member A_ x (y :: ys) = eqop A_ x y orelse member A_ x ys|\newline%
   787 \verb|fun member A_ x [] = false|\newline%
   788 \verb|  |\verb,|,\verb| member A_ x [] = false;|\newline%
   788 \verb|  |\verb,|,\verb| member A_ x (y :: ys) = eqop A_ x y orelse member A_ x ys;|\newline%
   789 \newline%
   789 \newline%
   790 \verb|fun collect_duplicates A_ xs ys (z :: zs) =|\newline%
   790 \verb|fun collect_duplicates A_ xs ys [] = xs|\newline%
   791 \verb|  (if member A_ z xs|\newline%
   791 \verb|  |\verb,|,\verb| collect_duplicates A_ xs ys (z :: zs) =|\newline%
   792 \verb|    then (if member A_ z ys then collect_duplicates A_ xs ys zs|\newline%
   792 \verb|    (if member A_ z xs|\newline%
   793 \verb|           else collect_duplicates A_ xs (z :: ys) zs)|\newline%
   793 \verb|      then (if member A_ z ys then collect_duplicates A_ xs ys zs|\newline%
   794 \verb|    else collect_duplicates A_ (z :: xs) (z :: ys) zs)|\newline%
   794 \verb|             else collect_duplicates A_ xs (z :: ys) zs)|\newline%
   795 \verb|  |\verb,|,\verb| collect_duplicates A_ xs ys [] = xs;|\newline%
   795 \verb|      else collect_duplicates A_ (z :: xs) (z :: ys) zs);|\newline%
   796 \newline%
   796 \newline%
   797 \verb|end; (*struct Example*)|%
   797 \verb|end; (*struct Example*)|%
   798 \end{isamarkuptext}%
   798 \end{isamarkuptext}%
   799 \isamarkuptrue%
   799 \isamarkuptrue%
   800 %
   800 %
   833 \isacommand{instantiation}\isamarkupfalse%
   833 \isacommand{instantiation}\isamarkupfalse%
   834 \ {\isachardoublequoteopen}{\isacharasterisk}{\isachardoublequoteclose}\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}order{\isacharcomma}\ order{\isacharparenright}\ order\isanewline
   834 \ {\isachardoublequoteopen}{\isacharasterisk}{\isachardoublequoteclose}\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}order{\isacharcomma}\ order{\isacharparenright}\ order\isanewline
   835 \isakeyword{begin}\isanewline
   835 \isakeyword{begin}\isanewline
   836 \isanewline
   836 \isanewline
   837 \isacommand{definition}\isamarkupfalse%
   837 \isacommand{definition}\isamarkupfalse%
   838 \ {\isacharbrackleft}code\ func\ del{\isacharbrackright}{\isacharcolon}\isanewline
   838 \ {\isacharbrackleft}code\ del{\isacharbrackright}{\isacharcolon}\isanewline
   839 \ \ {\isachardoublequoteopen}x\ {\isasymle}\ y\ {\isasymlongleftrightarrow}\ fst\ x\ {\isacharless}\ fst\ y\ {\isasymor}\ fst\ x\ {\isacharequal}\ fst\ y\ {\isasymand}\ snd\ x\ {\isasymle}\ snd\ y{\isachardoublequoteclose}\isanewline
   839 \ \ {\isachardoublequoteopen}x\ {\isasymle}\ y\ {\isasymlongleftrightarrow}\ fst\ x\ {\isacharless}\ fst\ y\ {\isasymor}\ fst\ x\ {\isacharequal}\ fst\ y\ {\isasymand}\ snd\ x\ {\isasymle}\ snd\ y{\isachardoublequoteclose}\isanewline
   840 \isanewline
   840 \isanewline
   841 \isacommand{definition}\isamarkupfalse%
   841 \isacommand{definition}\isamarkupfalse%
   842 \ {\isacharbrackleft}code\ func\ del{\isacharbrackright}{\isacharcolon}\isanewline
   842 \ {\isacharbrackleft}code\ del{\isacharbrackright}{\isacharcolon}\isanewline
   843 \ \ {\isachardoublequoteopen}x\ {\isacharless}\ y\ {\isasymlongleftrightarrow}\ fst\ x\ {\isacharless}\ fst\ y\ {\isasymor}\ fst\ x\ {\isacharequal}\ fst\ y\ {\isasymand}\ snd\ x\ {\isacharless}\ snd\ y{\isachardoublequoteclose}\isanewline
   843 \ \ {\isachardoublequoteopen}x\ {\isacharless}\ y\ {\isasymlongleftrightarrow}\ fst\ x\ {\isacharless}\ fst\ y\ {\isasymor}\ fst\ x\ {\isacharequal}\ fst\ y\ {\isasymand}\ snd\ x\ {\isacharless}\ snd\ y{\isachardoublequoteclose}\isanewline
   844 \isanewline
   844 \isanewline
   845 \isacommand{instance}\isamarkupfalse%
   845 \isacommand{instance}\isamarkupfalse%
   846 \ \isacommand{proof}\isamarkupfalse%
   846 \ \isacommand{proof}\isamarkupfalse%
   847 \isanewline
   847 \isanewline
   850 \isanewline
   850 \isanewline
   851 \isacommand{end}\isamarkupfalse%
   851 \isacommand{end}\isamarkupfalse%
   852 \isanewline
   852 \isanewline
   853 \isanewline
   853 \isanewline
   854 \isacommand{lemma}\isamarkupfalse%
   854 \isacommand{lemma}\isamarkupfalse%
   855 \ order{\isacharunderscore}prod\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
   855 \ order{\isacharunderscore}prod\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
   856 \ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}order{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
   856 \ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}order{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
   857 \ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
   857 \ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
   858 \ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}order{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
   858 \ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}order{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
   859 \ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
   859 \ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
   860 \ \ \isacommand{by}\isamarkupfalse%
   860 \ \ \isacommand{by}\isamarkupfalse%
   882 %
   882 %
   883 \endisadelimquoteme
   883 \endisadelimquoteme
   884 %
   884 %
   885 \isatagquoteme
   885 \isatagquoteme
   886 \isacommand{lemma}\isamarkupfalse%
   886 \isacommand{lemma}\isamarkupfalse%
   887 \ order{\isacharunderscore}prod{\isacharunderscore}code\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
   887 \ order{\isacharunderscore}prod{\isacharunderscore}code\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
   888 \ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}order{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
   888 \ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}order{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
   889 \ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
   889 \ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
   890 \ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}order{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
   890 \ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}order{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
   891 \ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
   891 \ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
   892 \ \ \isacommand{by}\isamarkupfalse%
   892 \ \ \isacommand{by}\isamarkupfalse%
  1005 %
  1005 %
  1006 \endisadelimquoteme
  1006 \endisadelimquoteme
  1007 %
  1007 %
  1008 \isatagquoteme
  1008 \isatagquoteme
  1009 \isacommand{lemma}\isamarkupfalse%
  1009 \isacommand{lemma}\isamarkupfalse%
  1010 \ monotype{\isacharunderscore}eq{\isacharunderscore}list{\isacharunderscore}all{\isadigit{2}}\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
  1010 \ monotype{\isacharunderscore}eq{\isacharunderscore}list{\isacharunderscore}all{\isadigit{2}}\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
  1011 \ \ {\isachardoublequoteopen}eq{\isacharunderscore}class{\isachardot}eq\ {\isacharparenleft}Mono\ tyco{\isadigit{1}}\ typargs{\isadigit{1}}{\isacharparenright}\ {\isacharparenleft}Mono\ tyco{\isadigit{2}}\ typargs{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
  1011 \ \ {\isachardoublequoteopen}eq{\isacharunderscore}class{\isachardot}eq\ {\isacharparenleft}Mono\ tyco{\isadigit{1}}\ typargs{\isadigit{1}}{\isacharparenright}\ {\isacharparenleft}Mono\ tyco{\isadigit{2}}\ typargs{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
  1012 \ \ \ \ \ eq{\isacharunderscore}class{\isachardot}eq\ tyco{\isadigit{1}}\ tyco{\isadigit{2}}\ {\isasymand}\ list{\isacharunderscore}all{\isadigit{2}}\ eq{\isacharunderscore}class{\isachardot}eq\ typargs{\isadigit{1}}\ typargs{\isadigit{2}}{\isachardoublequoteclose}\isanewline
  1012 \ \ \ \ \ eq{\isacharunderscore}class{\isachardot}eq\ tyco{\isadigit{1}}\ tyco{\isadigit{2}}\ {\isasymand}\ list{\isacharunderscore}all{\isadigit{2}}\ eq{\isacharunderscore}class{\isachardot}eq\ typargs{\isadigit{1}}\ typargs{\isadigit{2}}{\isachardoublequoteclose}\isanewline
  1013 \ \ \isacommand{by}\isamarkupfalse%
  1013 \ \ \isacommand{by}\isamarkupfalse%
  1014 \ {\isacharparenleft}simp\ add{\isacharcolon}\ eq\ list{\isacharunderscore}all{\isadigit{2}}{\isacharunderscore}eq\ {\isacharbrackleft}symmetric{\isacharbrackright}{\isacharparenright}%
  1014 \ {\isacharparenleft}simp\ add{\isacharcolon}\ eq\ list{\isacharunderscore}all{\isadigit{2}}{\isacharunderscore}eq\ {\isacharbrackleft}symmetric{\isacharbrackright}{\isacharparenright}%
  1015 \endisatagquoteme
  1015 \endisatagquoteme
  1036 \verb|structure Example = |\newline%
  1036 \verb|structure Example = |\newline%
  1037 \verb|struct|\newline%
  1037 \verb|struct|\newline%
  1038 \newline%
  1038 \newline%
  1039 \verb|datatype nat = Suc of nat |\verb,|,\verb| Zero_nat;|\newline%
  1039 \verb|datatype nat = Suc of nat |\verb,|,\verb| Zero_nat;|\newline%
  1040 \newline%
  1040 \newline%
  1041 \verb|fun null (x :: xs) = false|\newline%
  1041 \verb|fun null [] = true|\newline%
  1042 \verb|  |\verb,|,\verb| null [] = true;|\newline%
  1042 \verb|  |\verb,|,\verb| null (x :: xs) = false;|\newline%
  1043 \newline%
  1043 \newline%
  1044 \verb|fun eq_nat (Suc a) Zero_nat = false|\newline%
  1044 \verb|fun eq_nat (Suc a) Zero_nat = false|\newline%
  1045 \verb|  |\verb,|,\verb| eq_nat Zero_nat (Suc a) = false|\newline%
  1045 \verb|  |\verb,|,\verb| eq_nat Zero_nat (Suc a) = false|\newline%
  1046 \verb|  |\verb,|,\verb| eq_nat (Suc nat) (Suc nat') = eq_nat nat nat'|\newline%
  1046 \verb|  |\verb,|,\verb| eq_nat (Suc nat) (Suc nat') = eq_nat nat nat'|\newline%
  1047 \verb|  |\verb,|,\verb| eq_nat Zero_nat Zero_nat = true;|\newline%
  1047 \verb|  |\verb,|,\verb| eq_nat Zero_nat Zero_nat = true;|\newline%