doc-src/isac/mat-eng-de.tex
author ahirn@asparagus.ist.intra
Fri, 23 Jul 2010 11:45:15 +0200
branchlatex-isac-doc
changeset 37877 3b63f6bcf05f
child 37882 d354cdcc0a5d
permissions -rw-r--r--
started branch latex-isac-doc by alexandra & eva
ahirn@37877
     1
\documentclass[11pt,a4paper,headline,headcount,towside,nocenter]{report}
ahirn@37877
     2
\usepackage{latexsym} 
ahirn@37877
     3
%\usepackage{ngerman}
ahirn@37877
     4
%\grmn@dq@error ...and \dq \string #1 is undefined}
ahirn@37877
     5
%l.989 ...tch the problem type \\{\tt["squareroot",
ahirn@37877
     6
%                                                  "univ
ahirn@37877
     7
\bibliographystyle{alpha}
ahirn@37877
     8
ahirn@37877
     9
\def\isac{${\cal I}\mkern-2mu{\cal S}\mkern-5mu{\cal AC}$}
ahirn@37877
    10
ahirn@37877
    11
\title{\isac --- Interface for\\
ahirn@37877
    12
  Developers of Math Knowledge\\[1.0ex]
ahirn@37877
    13
  and\\[1.0ex]
ahirn@37877
    14
  Tools for Experiments in\\
ahirn@37877
    15
  Symbolic Computation\\[1.0ex]}
ahirn@37877
    16
\author{The \isac-Team\\
ahirn@37877
    17
  \tt isac-users@ist.tugraz.at\\[1.0ex]}
ahirn@37877
    18
\date{\today}
ahirn@37877
    19
ahirn@37877
    20
\begin{document}
ahirn@37877
    21
\maketitle
ahirn@37877
    22
\newpage
ahirn@37877
    23
\tableofcontents
ahirn@37877
    24
\newpage
ahirn@37877
    25
\listoftables
ahirn@37877
    26
\newpage
ahirn@37877
    27
ahirn@37877
    28
\chapter{Einleitung}
ahirn@37877
    29
\section{``Authoring'' und ``Tutoring''}
ahirn@37877
    30
{TO DO} Mathematik lernen -- verschiedene Autoren -- Isabelle
ahirn@37877
    31
Die Grundlage f\"ur \isac{} bildet Isabelle. Dies ist ein ``theorem prover'', der von L. Paulson und T. Nipkow entwickelt wird und Hard- und Software pr\"uft.
ahirn@37877
    32
\section{Der Inhalt des Dokuments}
ahirn@37877
    33
\paragraph{TO DO} {Als Anleitung:} Dieses Dokument beschreibt das Kerngebiet (KE) von \isac{}, das Gebiet der mathematics engine (ME) im Kerngebiet und die verschiedenen Funktionen wie das Umschreiben und der Vergleich.
ahirn@37877
    34
ahirn@37877
    35
\isac{} und KE wurden in SML geschrieben, die Sprache in Verbindung mit dem Vorg\"anger des Theorem Provers Isabelle entwickelt. So kam es, dass in diesem Dokument die Ebene ASCII als SML Code pr\"asentiert wird. Der Leser wird vermutlich erkennen, dass der \isac{} Benutzer eine vollkommen andere Sichtweise auf eine grafische Benutzeroberfl\"ache bekommt.
ahirn@37877
    36
ahirn@37877
    37
Das Dokument ist eigenst\"andig; Basiswissen \"uber SML (für eine Einf\"uhrung siehe \cite{Paulson:91}), Terme und Umschreibung wird vorrausgesetzt.
ahirn@37877
    38
ahirn@37877
    39
%The interfaces will be moderately exended during the first phase of development of the mathematics knowledge. The work on the subprojects defined should {\em not} create interfaces of any interest to a user or another author of knowledge except identifiers (of type string) for theorems, rulesets etc.
ahirn@37877
    40
ahirn@37877
    41
Hinweis: SML Code, Verzeichnis, Dateien sind {\tt in 'tt' geschrieben}; besonders in {\tt ML>} ist das Kerngebiet schnell.
ahirn@37877
    42
ahirn@37877
    43
\paragraph{Versuchen Sie es!}  Ein weiteres Anliegen dieses Textes ist, dem Leser Tipps f\"ur Versuche mit den Anwendungen zu geben.
ahirn@37877
    44
ahirn@37877
    45
\section{Gleich am Computer ausprobieren!}\label{get-started}
ahirn@37877
    46
\paragraph{TO DO screenshot} Bevor Sie mit Ihren Versuchen beginnen, m\"ochten wir Ihnen noch einige Hinweise geben.
ahirn@37877
    47
\begin{itemize}
ahirn@37877
    48
 \item System starten
ahirn@37877
    49
 \item Shell aufmachen und die Datei mat-eng-de.sml \"offnen.
ahirn@37877
    50
 \item $>$  :  Hinter diesem Zeichen (``Prompt'') stehen jene, die Sie selbst eingeben bzw. mit Copy und Paste aus der Datei kopieren.
ahirn@37877
    51
 \item Die Eingabe wird mit ``;'' und ``Enter'' abgeschlossen.
ahirn@37877
    52
 \item Zeilen, die nicht mit Prompt beginnen, werden vom Computer ausgegeben.
ahirn@37877
    53
 
ahirn@37877
    54
\end{itemize}
ahirn@37877
    55
ahirn@37877
    56
\part{Experimentelle Ann\"aherung}
ahirn@37877
    57
ahirn@37877
    58
\chapter{Terme und Theorien}
ahirn@37877
    59
Wie bereits erw\"ahnt, geht es um Computer-Mathematik. In den letzten Jahren hat die ``computer science'' grosse Fortschritte darin gemacht, Mathematik auf dem Computer verst\"andlich darzustellen. Dies gilt f\"ur mathematische Formeln, f\"ur die Beschreibung von Problem (behandelt in Abs.\ref{pbl}), f\"ur L\"osungsmethoden (behandelt in Abs.\ref{met}) etc. Wir beginnen mit mathematischen Formeln --- gleich zum Ausprobieren wie in Abs.\ref{get-started} oben vorbereitet.
ahirn@37877
    60
ahirn@37877
    61
\section{Von der Formel zum Term}
ahirn@37877
    62
Um ein Beispiel zu nennen: Die Formel $a+b\cdot 3$ l\"asst sich in lesbarer Form so eingeben:
ahirn@37877
    63
{\footnotesize\begin{verbatim}
ahirn@37877
    64
  > "a + b * 3";
ahirn@37877
    65
  val it = "a + b * 3" : string
ahirn@37877
    66
\end{verbatim}}
ahirn@37877
    67
\noindent ``a + b * 3'' ist also ein String (=Zeichenfolge). In dieser Form weiss der Computer nicht, dass z.B. eine Multiplikation {\em vor} einer Addition zu rechnen ist. Isabelle braucht Formeln in einer anderen Form; Diese kann man mit der Funktion ``str2term'' (= string to term) umrechnen:
ahirn@37877
    68
{\footnotesize\begin{verbatim}
ahirn@37877
    69
  > str2term "a + b * 3";
ahirn@37877
    70
  val it =
ahirn@37877
    71
     Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
    72
           Free ("a", "RealDef.real") $
ahirn@37877
    73
        (Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
ahirn@37877
    74
           ...) : Term.term
ahirn@37877
    75
\end{verbatim}}
ahirn@37877
    76
\noindent Jene Form braucht Isabelle intern zum rechnen. Sie heisst Term und ist nicht lesbar, daf\"ur aber speicherbar mit Hilfe von ``val'' (=value) 
ahirn@37877
    77
{\footnotesize\begin{verbatim}
ahirn@37877
    78
  > val term = str2term "a + b * 3";
ahirn@37877
    79
  val term =  
ahirn@37877
    80
     Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
    81
           Free ("a", "RealDef.real") $
ahirn@37877
    82
        (Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
ahirn@37877
    83
           ...) : Term.term
ahirn@37877
    84
\end{verbatim}
ahirn@37877
    85
Der gespeicherte Term kann einer Funktion ``atomty'' \"ubergeben werden, die jenen in einer abstrakten Struktur zeigt:
ahirn@37877
    86
{\footnotesize\begin{verbatim}
ahirn@37877
    87
  > atomty term;
ahirn@37877
    88
 
ahirn@37877
    89
  ***
ahirn@37877
    90
  *** Const (op +, [real, real] => real)
ahirn@37877
    91
  *** . Free (a, real)
ahirn@37877
    92
  *** . Const (op *, [real, real] => real)
ahirn@37877
    93
  *** . . Free (b, real)
ahirn@37877
    94
  *** . . Free (3, real)
ahirn@37877
    95
  ***
ahirn@37877
    96
 
ahirn@37877
    97
  val it = () : unit
ahirn@37877
    98
\end{verbatim}%size
ahirn@37877
    99
ahirn@37877
   100
ahirn@37877
   101
\section{``Theory'' und ``Parsing``}
ahirn@37877
   102
Die theory gibt an, welcher Ausdruck wo steht. Eine derzeitige theory wird intern als \texttt{thy} gekennzeichnet. Jene theory, die alles Wissen ent\"ahlt ist \isac{}. 
ahirn@37877
   103
ahirn@37877
   104
{\footnotesize\begin{verbatim}
ahirn@37877
   105
  > Isac.thy;
ahirn@37877
   106
       val it =
ahirn@37877
   107
          {ProtoPure, CPure, HOL, Set, Typedef, Fun, Product_Type, Lfp, Gfp,
ahirn@37877
   108
          Sum_Type, Relation, Record, Inductive, Transitive_Closure,
ahirn@37877
   109
          Wellfounded_Recursion, NatDef, Nat, NatArith, Divides, Power,
ahirn@37877
   110
          SetInterval, Finite_Set, Equiv, IntDef, Int, Datatype_Universe,
ahirn@37877
   111
          Datatype, Numeral, Bin, IntArith, Wellfounded_Relations, Recdef, IntDiv,
ahirn@37877
   112
          IntPower, NatBin, NatSimprocs, Relation_Power, PreList, List, Map,
ahirn@37877
   113
          Hilbert_Choice, Main, Lubs, PNat, PRat, PReal, RealDef, RealOrd,
ahirn@37877
   114
          RealInt, RealBin, RealArith0, RealArith, RComplete, RealAbs, RealPow,
ahirn@37877
   115
          Ring_and_Field, Complex_Numbers, Real, ListG, Tools, Script, Typefix,
ahirn@37877
   116
          Float, ComplexI, Descript, Atools, Simplify, Poly, Rational, PolyMinus,
ahirn@37877
   117
          Equation, LinEq, Root, RootEq, RatEq, RootRat, RootRatEq, PolyEq, Vect,
ahirn@37877
   118
          Calculus, Trig, LogExp, Diff, DiffApp, Integrate, EqSystem, Biegelinie,
ahirn@37877
   119
          AlgEin, Test, Isac} : Theory.theory
ahirn@37877
   120
\end{verbatim}
ahirn@37877
   121
Die, die ein Mal enth\"alt ist groups.thy. Suchen Sie nach '*' unter der Adresse:
ahirn@37877
   122
ahirn@37877
   123
http://www.cl.cam.ac.uk/research/hvg/Isabelle/dist/library/HOL/Groups.html
ahirn@37877
   124
Hier wird Ihnen erkl\"art, wie das Mal vom Computer gelesen wird.
ahirn@37877
   125
{\footnotesize\begin{verbatim}
ahirn@37877
   126
  > Group.thy
ahirn@37877
   127
      fixes f :: "'a => 'a => 'a" (infixl "*" 70)
ahirn@37877
   128
      assumes assoc [ac_simps]: "a * b * c = a * (b * c)"
ahirn@37877
   129
\end{verbatim}
ahirn@37877
   130
Der ''infix`` ist der Operator, der zwischen zwei Argumenten steht. 70 bedeutet, dass Mal eine hohe Priorit\"at hat (bei einem Plus liegt der Wert bei 50 oder 60). 
ahirn@37877
   131
ahirn@37877
   132
Parsing entsteht durch einen string und eine theory. Es verwendet Informationen, die in der theory von Isabelle enthalten sind.
ahirn@37877
   133
{\footnotesize\begin{verbatim}
ahirn@37877
   134
  > parse;
ahirn@37877
   135
       val it = fn : Theory.theory -> string -> Thm.cterm Library.option
ahirn@37877
   136
\end{verbatim}
ahirn@37877
   137
Dieser term kann wieder in seine einzelnen Teile zerlegt werden.
ahirn@37877
   138
{\footnotesize\begin{verbatim}
ahirn@37877
   139
   > val it = (term_of o the) it;
ahirn@37877
   140
        val it =
ahirn@37877
   141
           Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
   142
               Free ("a", "RealDef.real") $
ahirn@37877
   143
           (Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
ahirn@37877
   144
               ...) : Term.term
ahirn@37877
   145
\end{verbatim}
ahirn@37877
   146
ahirn@37877
   147
\paragraph{Versuchen Sie es!} Das mathematische Wissen w\"achst, indem man zu den Urspr\"ungen schaut. In den folgenden Beispielen werden verschiedene Meldungen genauer erkl\"art.
ahirn@37877
   148
ahirn@37877
   149
{\footnotesize\begin{verbatim}
ahirn@37877
   150
   > (*-1-*);
ahirn@37877
   151
   > parse HOL.thy "2^^^3";
ahirn@37877
   152
      *** Inner lexical error at: "^^^3"
ahirn@37877
   153
      val it = None : Thm.cterm Library.option         
ahirn@37877
   154
\end{verbatim}
ahirn@37877
   155
''Inner lexical error`` bedeutet, dass ein Fehler aufgetreten ist, vermutlich hat man sich vertippt.
ahirn@37877
   156
ahirn@37877
   157
{\footnotesize\begin{verbatim}
ahirn@37877
   158
   > (*-2-*);
ahirn@37877
   159
   > parse HOL.thy "d_d x (a + x)";
ahirn@37877
   160
      val it = None : Thm.cterm Library.option               
ahirn@37877
   161
\end{verbatim}
ahirn@37877
   162
Fehlt ''Inner lexical error`` wurde der Parse nicht gefunden.
ahirn@37877
   163
ahirn@37877
   164
{\footnotesize\begin{verbatim}
ahirn@37877
   165
   > (*-3-*);
ahirn@37877
   166
   > parse Rational.thy "2^^^3";
ahirn@37877
   167
      val it = Some "2 ^^^ 3" : Thm.cterm Library.option               
ahirn@37877
   168
\end{verbatim}
ahirn@37877
   169
ahirn@37877
   170
{\footnotesize\begin{verbatim}
ahirn@37877
   171
   > (*-4-*);
ahirn@37877
   172
   > val Some t4 = parse Rational.thy "d_d x (a + x)";
ahirn@37877
   173
      val t4 = "d_d x (a + x)" : Thm.cterm              
ahirn@37877
   174
\end{verbatim}
ahirn@37877
   175
ahirn@37877
   176
{\footnotesize\begin{verbatim}
ahirn@37877
   177
   > (*-5-*);
ahirn@37877
   178
   > val Some t5 = parse Diff.thy  "d_d x (a + x)";
ahirn@37877
   179
      val t5 = "d_d x (a + x)" : Thm.cterm             
ahirn@37877
   180
\end{verbatim}
ahirn@37877
   181
ahirn@37877
   182
Der Pase liefert hier einen ''zu sch\"onen`` Ausdruck in Form eines cterms, der wie ein string aussieht. Am verl\"asslichsten sind terme, die sich selbst erzeugen lassen.
ahirn@37877
   183
ahirn@37877
   184
\section{Details von Termen}
ahirn@37877
   185
Mit Hilfe der darunterliegenden Darstellung sieht man, dass ein cterm in einen term umgewandelt werden kann.
ahirn@37877
   186
{\footnotesize\begin{verbatim}
ahirn@37877
   187
   > term_of;
ahirn@37877
   188
      val it = fn : Thm.cterm -> Term.term
ahirn@37877
   189
\end{verbatim}
ahirn@37877
   190
Durch die Umwandlung eines cterms in einen term sieht man die einzelnen Teile des Terms. ''Free`` bedeutet, dass man die Variable \"andern kann.
ahirn@37877
   191
{\footnotesize\begin{verbatim}
ahirn@37877
   192
   > term_of t4;
ahirn@37877
   193
      val it =
ahirn@37877
   194
         Free ("d_d", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
ahirn@37877
   195
         ...: Term.term
ahirn@37877
   196
ahirn@37877
   197
\end{verbatim}
ahirn@37877
   198
In diesem Fall sagt uns das ''Const``, dass die Variable eine Konstante ist, also ein Fixwert ist und immer die selbe Funktion hat.
ahirn@37877
   199
{\footnotesize\begin{verbatim}
ahirn@37877
   200
   > term_of t5;
ahirn@37877
   201
      val it =
ahirn@37877
   202
         Const ("Diff.d_d", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
ahirn@37877
   203
         ... : Term.term
ahirn@37877
   204
\end{verbatim}
ahirn@37877
   205
Sollten verschiedene Teile des Output nicht sichtbar sein, kann die Schriftgr\"osse ge\"andert werden.
ahirn@37877
   206
{\footnotesize\begin{verbatim}
ahirn@37877
   207
   > print_depth;
ahirn@37877
   208
      val it = fn : int -> unit
ahirn@37877
   209
 \end{verbatim}
ahirn@37877
   210
Zuerst gibt man die Schriftgr\"osse ein, danach den term, der gr\"osser werden soll.
ahirn@37877
   211
{\footnotesize\begin{verbatim}
ahirn@37877
   212
   > print_depth 10;
ahirn@37877
   213
      val it = () : unit
ahirn@37877
   214
   > term_of t4;
ahirn@37877
   215
         val it =
ahirn@37877
   216
            Free ("d_d", "[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
   217
                Free ("x", "RealDef.real") $
ahirn@37877
   218
            (Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
   219
                Free ("a", "RealDef.real") $ Free ("x", "RealDef.real"))
ahirn@37877
   220
         : Term.term
ahirn@37877
   221
ahirn@37877
   222
   > print_depth 10;
ahirn@37877
   223
         val it = () : unit
ahirn@37877
   224
   > term_of t5;
ahirn@37877
   225
         val it =
ahirn@37877
   226
            Const ("Diff.d_d", "[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
   227
                Free ("x", "RealDef.real") $
ahirn@37877
   228
            (Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
   229
                Free ("a", "RealDef.real") $ Free ("x", "RealDef.real"))
ahirn@37877
   230
         : Term.term
ahirn@37877
   231
\end{verbatim}
ahirn@37877
   232
ahirn@37877
   233
Eine andere Variante um den Unterschied der beiden Terme zu sehen ist folgende: 
ahirn@37877
   234
{\footnotesize\begin{verbatim}
ahirn@37877
   235
   > (*-4-*) val thy = Rational.thy;
ahirn@37877
   236
      val thy =
ahirn@37877
   237
         {ProtoPure, CPure, HOL, Set, Typedef, Fun, Product_Type, Lfp, Gfp,
ahirn@37877
   238
         Sum_Type, Relation, Record, Inductive, Transitive_Closure,
ahirn@37877
   239
         Wellfounded_Recursion, NatDef, Nat, NatArith, Divides, Power,
ahirn@37877
   240
         SetInterval, Finite_Set, Equiv, IntDef, Int, Datatype_Universe,
ahirn@37877
   241
         Datatype, Numeral, Bin, IntArith, Wellfounded_Relations, Recdef, IntDiv,
ahirn@37877
   242
         IntPower, NatBin, NatSimprocs, Relation_Power, PreList, List, Map,
ahirn@37877
   243
         Hilbert_Choice, Main, Lubs, PNat, PRat, PReal, RealDef, RealOrd,
ahirn@37877
   244
         RealInt, RealBin, RealArith0, RealArith, RComplete, RealAbs, RealPow,
ahirn@37877
   245
         Ring_and_Field, Complex_Numbers, Real, ListG, Tools, Script, Typefix,
ahirn@37877
   246
         Float, ComplexI, Descript, Atools, Simplify, Poly, Rational}
ahirn@37877
   247
     : Theory.theory
ahirn@37877
   248
   > ((atomty) o term_of o the o (parse thy)) "d_d x (a + x)";
ahirn@37877
   249
 
ahirn@37877
   250
      ***
ahirn@37877
   251
      *** Free (d_d, [real, real] => real)
ahirn@37877
   252
      *** . Free (x, real)
ahirn@37877
   253
      *** . Const (op +, [real, real] => real)
ahirn@37877
   254
      *** . . Free (a, real)
ahirn@37877
   255
      *** . . Free (x, real)
ahirn@37877
   256
      ***
ahirn@37877
   257
 
ahirn@37877
   258
      val it = () : unit
ahirn@37877
   259
ahirn@37877
   260
ahirn@37877
   261
   > (*-5-*) val thy = Diff.thy;
ahirn@37877
   262
      val thy =
ahirn@37877
   263
         {ProtoPure, CPure, HOL, Set, Typedef, Fun, Product_Type, Lfp, Gfp,
ahirn@37877
   264
         Sum_Type, Relation, Record, Inductive, Transitive_Closure,
ahirn@37877
   265
         Wellfounded_Recursion, NatDef, Nat, NatArith, Divides, Power,
ahirn@37877
   266
         SetInterval, Finite_Set, Equiv, IntDef, Int, Datatype_Universe,
ahirn@37877
   267
         Datatype, Numeral, Bin, IntArith, Wellfounded_Relations, Recdef, IntDiv,
ahirn@37877
   268
         IntPower, NatBin, NatSimprocs, Relation_Power, PreList, List, Map,
ahirn@37877
   269
         Hilbert_Choice, Main, Lubs, PNat, PRat, PReal, RealDef, RealOrd,
ahirn@37877
   270
         RealInt, RealBin, RealArith0, RealArith, RComplete, RealAbs, RealPow,
ahirn@37877
   271
         Ring_and_Field, Complex_Numbers, Real, Calculus, Trig, ListG, Tools,
ahirn@37877
   272
         Script, Typefix, Float, ComplexI, Descript, Atools, Simplify, Poly,
ahirn@37877
   273
         Equation, LinEq, Root, RootEq, Rational, RatEq, RootRat, RootRatEq,
ahirn@37877
   274
         PolyEq, LogExp, Diff} : Theory.theory
ahirn@37877
   275
 
ahirn@37877
   276
   > ((atomty) o term_of o the o (parse thy)) "d_d x (a + x)";
ahirn@37877
   277
 
ahirn@37877
   278
      ***
ahirn@37877
   279
      *** Const (Diff.d_d, [real, real] => real)
ahirn@37877
   280
      *** . Free (x, real)
ahirn@37877
   281
      *** . Const (op +, [real, real] => real)
ahirn@37877
   282
      *** . . Free (a, real)
ahirn@37877
   283
      *** . . Free (x, real)
ahirn@37877
   284
      ***
ahirn@37877
   285
 
ahirn@37877
   286
      val it = () : unit
ahirn@37877
   287
\end{verbatim}
ahirn@37877
   288
ahirn@37877
   289
ahirn@37877
   290
{\chapter{''Rewriting``}}
ahirn@37877
   291
{\section{}}
ahirn@37877
   292
Bei Rewriting handelt es sich um die Vereinfachung eines Terms in vielen kleinen Schritten und nach bestimmten Regeln. Der Computer wendet dabei hintereinander verschiedene Rechengesetze an, weil er den Term ansonsten nicht l\"osen kann.
ahirn@37877
   293
ahirn@37877
   294
{\footnotesize\begin{verbatim}
ahirn@37877
   295
> rewrite_;
ahirn@37877
   296
val it = fn
ahirn@37877
   297
:
ahirn@37877
   298
   Theory.theory ->
ahirn@37877
   299
   ((Term.term * Term.term) list -> Term.term * Term.term -> bool) ->
ahirn@37877
   300
   rls ->
ahirn@37877
   301
   bool ->
ahirn@37877
   302
   Thm.thm -> Term.term -> (Term.term * Term.term list) Library.option
ahirn@37877
   303
ahirn@37877
   304
> rewrite;
ahirn@37877
   305
val it = fn
ahirn@37877
   306
:
ahirn@37877
   307
   theory' ->
ahirn@37877
   308
   rew_ord' ->
ahirn@37877
   309
   rls' -> bool -> thm' -> cterm' -> (string * string list) Library.option
ahirn@37877
   310
ahirn@37877
   311
\end{verbatim}
ahirn@37877
   312
\textbf{Versuchen Sie es!} Um zu sehen, wie der Computer vorgeht und welche Rechengesetze er anwendet, zeigen wir Ihnen durch Differenzieren von (a + a * (2 + b)), die einzelnen Schritte. Sie k\"onnen nat\"urlichauch selbst einige Beispiele ausprobieren!
ahirn@37877
   313
ahirn@37877
   314
Zuerst legt man fest, dass es sich um eine Differenzierung handelt.
ahirn@37877
   315
{\footnotesize\begin{verbatim}
ahirn@37877
   316
   > val thy' = "Diff.thy";
ahirn@37877
   317
      val thy' = "Diff.thy" : string
ahirn@37877
   318
\end{verbatim}
ahirn@37877
   319
Dann gibt man die zu l\"osende Rechnung ein.
ahirn@37877
   320
{\footnotesize\begin{verbatim}
ahirn@37877
   321
   > val ct = "d_d x (a + a * (2 + b))";
ahirn@37877
   322
      val ct = "d_d x (a + a * (2 + b))" : string
ahirn@37877
   323
\end{verbatim}
ahirn@37877
   324
Anschließend gibt man bekannt, dass die Summenregel angewandt werden soll.
ahirn@37877
   325
{\footnotesize\begin{verbatim}
ahirn@37877
   326
   > val thm = ("diff_sum","");
ahirn@37877
   327
      val thm = ("diff_sum", "") : string * string
ahirn@37877
   328
\end{verbatim}
ahirn@37877
   329
Schliesslich wird die erste Ableitung angezeigt.
ahirn@37877
   330
{\footnotesize\begin{verbatim}
ahirn@37877
   331
   > val Some (ct,_) = rewrite_inst thy' "tless_true" "eval_rls" true
ahirn@37877
   332
                        [("bdv","x::real")] thm ct;#
ahirn@37877
   333
      val ct = "d_d x a + d_d x (a * (2 + b))" : cterm'
ahirn@37877
   334
\end{verbatim}
ahirn@37877
   335
Will man auch die zweite Ableitung sehen, geht man so vor:
ahirn@37877
   336
{\footnotesize\begin{verbatim}
ahirn@37877
   337
   > val thm = ("diff_prod_const","");
ahirn@37877
   338
      val thm = ("diff_prod_const", "") : string * string
ahirn@37877
   339
\end{verbatim} 
ahirn@37877
   340
Auch die zweite Ableitung wird sichtbar.
ahirn@37877
   341
{\footnotesize\begin{verbatim}
ahirn@37877
   342
   > val Some (ct,_) = rewrite_inst thy' "tless_true" "eval_rls" true
ahirn@37877
   343
                        [("bdv","x::real")] thm ct;#
ahirn@37877
   344
      val ct = "d_d x a + a * d_d x (2 + b)" : cterm'
ahirn@37877
   345
\end{verbatim}
ahirn@37877
   346
ahirn@37877
   347
ahirn@37877
   348
ahirn@37877
   349
ahirn@37877
   350
ahirn@37877
   351
ahirn@37877
   352
ahirn@37877
   353
ahirn@37877
   354
ahirn@37877
   355
ahirn@37877
   356
ahirn@37877
   357
\newpage
ahirn@37877
   358
------------------------------- ALTER TEXT -------------------------------
ahirn@37877
   359
ahirn@37877
   360
Ein Term ist eine Zeichenfolge. Das heisst Es gibt zwei Arten von Termen in Isabelle, 'raw terms' und 'certified terms'. \isac{} arbeitet mit raw terms, die effizient sind. 
ahirn@37877
   361
{\footnotesize\begin{verbatim}
ahirn@37877
   362
   datatype term = 
ahirn@37877
   363
       Const of string * typ
ahirn@37877
   364
     | Free  of string * typ 
ahirn@37877
   365
     | Var   of indexname * typ
ahirn@37877
   366
     | Bound of int
ahirn@37877
   367
     | Abs   of string * typ * term
ahirn@37877
   368
     | op $  of term * term;
ahirn@37877
   369
ahirn@37877
   370
   datatype typ = Type  of string * typ list
ahirn@37877
   371
                | TFree of string * sort
ahirn@37877
   372
                | TVar  of indexname * sort;
ahirn@37877
   373
\end{verbatim}}%size % $
ahirn@37877
   374
Die Definition und der Indexname sind in diesem Zusammenhang nicht relevant. Der {\tt typ}e wird w\"ahrend der Parse angedeutet. Diese ist der Hauptbestandteil f\"ur andere Terms, {\tt cterm}. Sie {\tt cterm}s sind zusammengefasste Aufzeichnungen, die ohne die jeweiligen Isabelle-Funktionen nicht zusammengesetzt werden k\"onnen (type--Richtigkeit \"Uberpr\"ufen), aber dann g\"unstig als string dargestellt werden (Verwendung von SML Compiler Internals -- siehe unten).
ahirn@37877
   375
ahirn@37877
   376
\section{Theorien und Terme}
ahirn@37877
   377
Die Parse verwendet Informationen, die in der Theorie von Isabelle $\sim${\tt /src/HOL}enthalten sind. Die derzeitige Theorie wird international als {\tt thy} gekennzeichnet; auf diese kann unterschiedlich zugegriffen werden.
ahirn@37877
   378
{\footnotesize\begin{verbatim}
ahirn@37877
   379
   ML> thy;
ahirn@37877
   380
   val it =
ahirn@37877
   381
   {ProtoPure, CPure, HOL, Set, Typedef, Fun, Product_Type, Lfp, Gfp,
ahirn@37877
   382
     Sum_Type, Relation, Record, Inductive, Transitive_Closure,
ahirn@37877
   383
     Wellfounded_Recursion, NatDef, Nat, NatArith, Divides, Power,
ahirn@37877
   384
     SetInterval, Finite_Set, Equiv, IntDef, Int, Datatype_Universe,
ahirn@37877
   385
     Datatype, Numeral, Bin, IntArith, Wellfounded_Relations, Recdef, IntDiv,
ahirn@37877
   386
     IntPower, NatBin, NatSimprocs, Relation_Power, PreList, List, Map,
ahirn@37877
   387
     Hilbert_Choice, Main, Lubs, PNat, PRat, PReal, RealDef, RealOrd,
ahirn@37877
   388
     RealInt, RealBin, RealArith0, RealArith, RComplete, RealAbs, RealPow,
ahirn@37877
   389
     Ring_and_Field, Complex_Numbers, Real, ListG, Tools, Script, Typefix,
ahirn@37877
   390
     Float, ComplexI, Descript, Atools, Simplify, Poly, Rational, PolyMinus,
ahirn@37877
   391
     Equation, LinEq, Root, RootEq, RatEq, RootRat, RootRatEq, PolyEq, Vect,
ahirn@37877
   392
     Calculus, Trig, LogExp, Diff, DiffApp, Integrate, EqSystem, Biegelinie,
ahirn@37877
   393
     AlgEin, Test, Isac} : Theory.theory                                           
ahirn@37877
   394
   ML> HOL.thy;
ahirn@37877
   395
   val it = {ProtoPure, CPure, HOL} : Theory.theory 
ahirn@37877
   396
   ML>
ahirn@37877
   397
   ML> parse;
ahirn@37877
   398
   val it = fn : Theory.theory -> string -> Thm.cterm Library.option
ahirn@37877
   399
   ML> parse thy "a + b * 3";
ahirn@37877
   400
   val it = Some "a + b * 3" : Thm.cterm Library.option
ahirn@37877
   401
   ML>
ahirn@37877
   402
   ML> val t = (term_of o the) it;
ahirn@37877
   403
  val t =
ahirn@37877
   404
   Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
   405
         Free ("a", "RealDef.real") $
ahirn@37877
   406
      (Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
ahirn@37877
   407
         ...) : Term.term
ahirn@37877
   408
ahirn@37877
   409
\end{verbatim}}%size
ahirn@37877
   410
Die Ausdr\"ucke {\tt term\_of} und {\tt the} werden weiter unten erkl\"art. Den Syntax aus der Liste der Funktionen kann man aus den Theorien von Isabelle \cite{Isa-obj} {\tt [isabelle]/src/HOL/}\footnote{Oder Sie schauen ins Internet unter {\tt [isabelle]/browser\_info}.} und aus den entwickelten Theorien von \isac{} unter {\tt [isac-src]/knowledge/} herauslesen. Beachten Sie, dass der Syntax von diesem Ausdruck anders ist, als jene die bei \isac vom Vorrechner nach der Umrechnung zu MathML angezeigt werden.
ahirn@37877
   411
ahirn@37877
   412
ahirn@37877
   413
\section{Anzeigen von Termen}
ahirn@37877
   414
Die Drucktiefe auf der höchsten Ebene des SML kann in Ordnung gebracht werden, um den output in der Menge des gewünschten Details zu erzeugen:
ahirn@37877
   415
{\footnotesize\begin{verbatim}
ahirn@37877
   416
   ML> Compiler.Control.Print.printDepth;
ahirn@37877
   417
   val it = ref 4 : int ref
ahirn@37877
   418
   ML>
ahirn@37877
   419
   ML> Compiler.Control.Print.printDepth:= 2;
ahirn@37877
   420
   val it = () : unit
ahirn@37877
   421
   ML> t;
ahirn@37877
   422
   val it =
ahirn@37877
   423
   Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
   424
         Free ("a", "RealDef.real") $
ahirn@37877
   425
      (Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
ahirn@37877
   426
         ...) : Term.term
ahirn@37877
   427
   ML>
ahirn@37877
   428
   ML> Compiler.Control.Print.printDepth:= 6;
ahirn@37877
   429
   val it = () : unit
ahirn@37877
   430
   ML> t;
ahirn@37877
   431
   val it =
ahirn@37877
   432
     Const ("op +","[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
   433
     Free ("a","RealDef.real") $
ahirn@37877
   434
     (Const ("op *","[RealDef.real, RealDef.real] => RealDef.real") $
ahirn@37877
   435
      Free ("b","RealDef.real") $ Free ("#3","RealDef.real")) : term
ahirn@37877
   436
\end{verbatim}}%size % $
ahirn@37877
   437
Ein n\"aherer Blick zum letzten output zeigt, dass {\tt typ} wie der string {\tt cterm} ausgegeben worden ist. Andere n\"utzliche Einstellungen für den output sind:
ahirn@37877
   438
{\footnotesize\begin{verbatim}
ahirn@37877
   439
   ML> Compiler.Control.Print.printLength;
ahirn@37877
   440
   val it = ref 8 : int ref
ahirn@37877
   441
   ML> Compiler.Control.Print.stringDepth;
ahirn@37877
   442
   val it = ref 250 : int ref
ahirn@37877
   443
\end{verbatim}}%size
ahirn@37877
   444
Die SML der Terme ist nicht lesbar; es gibt Funktionen im KE, um sie zu zeigen:
ahirn@37877
   445
{\footnotesize\begin{verbatim}
ahirn@37877
   446
   ML> atomt;
ahirn@37877
   447
   val it = fn : Term.term -> string
ahirn@37877
   448
   ML> atomt t; 
ahirn@37877
   449
  "*** -------------"
ahirn@37877
   450
  "*** Const (op +)"
ahirn@37877
   451
  "*** . Free (a, )"
ahirn@37877
   452
  "*** . Const (op *)"
ahirn@37877
   453
  "*** . . Free (b, )"
ahirn@37877
   454
  "*** . . Free (3, )"
ahirn@37877
   455
  "\n"
ahirn@37877
   456
val it = "\n" : string
ahirn@37877
   457
   ML>
ahirn@37877
   458
   ML> atomty;
ahirn@37877
   459
  val it = fn : Term.term -> unit
ahirn@37877
   460
   ML> atomty thy t;
ahirn@37877
   461
   *** -------------
ahirn@37877
   462
   *** Const ( op +, [real, real] => real)
ahirn@37877
   463
   *** . Free ( a, real)
ahirn@37877
   464
   *** . Const ( op *, [real, real] => real)
ahirn@37877
   465
   *** . . Free ( b, real)
ahirn@37877
   466
   *** . . Free ( #3, real)
ahirn@37877
   467
   val it = () : unit
ahirn@37877
   468
\end{verbatim}}%size
ahirn@37877
   469
{\tt typ} wird als string wiedergegeben. Diesaml aber durch die Informationen von {\tt thy} in besserer Darstellung.
ahirn@37877
   470
ahirn@37877
   471
\paragraph{Versuchen Sie es!} {\bf Das mathematische Wissen w\"achst} wie es in Isabelle schrittweise beschrieben ist. Schauen Sie ins Internet um diese Beschreibungen aufzurufen {\tt [isabelle]/src/HOL/HOL.thy} und zu sehen, ob es Kindern auf Ihrem System zur Verf\"ugung steht. Oder Sie sehen sich die verschiedenen Dateien unter {\tt [isabelle]/browser\_info} an.
ahirn@37877
   472
{\footnotesize\begin{verbatim}
ahirn@37877
   473
   ML> (*-1-*) parse HOL.thy "#2^^^#3";
ahirn@37877
   474
   *** Inner lexical error at: "^^^3"
ahirn@37877
   475
   val it = None : Thm.cterm Library.option
ahirn@37877
   476
   ML>
ahirn@37877
   477
   ML> (*-2-*) parse HOL.thy "d_d x (a + x)";
ahirn@37877
   478
   val it = None : Thm.cterm Library.option
ahirn@37877
   479
   ML>
ahirn@37877
   480
   ML>
ahirn@37877
   481
   ML> (*-3-*) parse RatArith.thy "#2^^^#3";
ahirn@37877
   482
   val it = Some "#2 ^^^ #3" : cterm option
ahirn@37877
   483
   ML>
ahirn@37877
   484
   ML> (*-4-*) parse RatArith.thy "d_d x (a + x)";
ahirn@37877
   485
   val it = Some "d_d x (a + x)" : cterm option
ahirn@37877
   486
   ML>
ahirn@37877
   487
   ML>
ahirn@37877
   488
   ML> (*-5-*) parse Differentiate.thy "d_d x (a + x)";
ahirn@37877
   489
   val it = Some "d_d x (a + x)" : cterm option
ahirn@37877
   490
   ML>
ahirn@37877
   491
   ML> (*-6-*) parse Differentiate.thy "#2^^^#3";
ahirn@37877
   492
   val it = Some "#2 ^^^ #3" : cterm option
ahirn@37877
   493
\end{verbatim}}%size
ahirn@37877
   494
Vertrauen sie nicht der string Darstellung: Wenn wir {\tt(*-4-*)} und {\tt(*-6-*)} zu folgenden Ausdr\"ucken umwandel:\dots
ahirn@37877
   495
{\footnotesize\begin{verbatim}
ahirn@37877
   496
   ML> (*-4-*) val thy = RatArith.thy;
ahirn@37877
   497
   ML> ((atomty thy) o term_of o the o (parse thy)) "d_d x (a + x)";
ahirn@37877
   498
   *** -------------
ahirn@37877
   499
   *** Free ( d_d, [real, real] => real)
ahirn@37877
   500
   *** . Free ( x, real)
ahirn@37877
   501
   *** . Const ( op +, [real, real] => real)
ahirn@37877
   502
   *** . . Free ( a, real)
ahirn@37877
   503
   *** . . Free ( x, real)
ahirn@37877
   504
   val it = () : unit
ahirn@37877
   505
   ML>
ahirn@37877
   506
   ML> (*-6-*) val thy = Differentiate.thy;
ahirn@37877
   507
   ML> ((atomty thy) o term_of o the o (parse thy)) "d_d x (a + x)";
ahirn@37877
   508
   *** -------------
ahirn@37877
   509
   *** Const ( Differentiate.d_d, [real, real] => real)
ahirn@37877
   510
   *** . Free ( x, real)
ahirn@37877
   511
   *** . Const ( op +, [real, real] => real)
ahirn@37877
   512
   *** . . Free ( a, real)
ahirn@37877
   513
   *** . . Free ( x, real)
ahirn@37877
   514
   val it = () : unit
ahirn@37877
   515
\end{verbatim}}%size
ahirn@37877
   516
\dots Wir sehen: Bei {\tt(*-4-*)} handelt es sich um eine willk\"urliche Funktion {\tt Free ( d\_d, \_)} und bei {\tt(*-6-*)} um eine spezielle unver\"anderliche Funktion {\tt Const ( Differentiate.d\_d, \_)} für das Differenzieren, welches in {\tt Differentiate.thy} erkl\"art wird und vermutlich gemeint ist.
ahirn@37877
   517
ahirn@37877
   518
ahirn@37877
   519
\section{Terme umwandeln}
ahirn@37877
   520
Die Umwandlung von {\tt cterm} zu {\tt term} wurde bereits oberhalb gezeigt:
ahirn@37877
   521
{\footnotesize\begin{verbatim}
ahirn@37877
   522
   ML> term_of;
ahirn@37877
   523
   val it = fn : Thm.cterm -> Term.term
ahirn@37877
   524
   ML>
ahirn@37877
   525
   ML> the;
ahirn@37877
   526
   val it = fn : 'a Library.option -> 'a
ahirn@37877
   527
   ML>
ahirn@37877
   528
   ML> val t = (term_of o the o (parse thy)) "a + b * 3";
ahirn@37877
   529
   val t = Const (#,#) $ Free (#,#) $ (Const # $ Free # $ Free (#,#)) : term
ahirn@37877
   530
\end{verbatim}}%size
ahirn@37877
   531
{\tt the} wird dabei von {\tt term option} ausgewickelt --- eine hilfreiche Funktion von Larry Paulsons Grundlagen {\tt [isabelle]/src/Pure/library.ML}, die für jeden SML Programmierer sehr wertvoll ist.
ahirn@37877
   532
ahirn@37877
   533
Die anderen Umwandlungen sind folgende, wobei einige {\it signature} {\tt sign} als Theorie verwenden:
ahirn@37877
   534
{\footnotesize\begin{verbatim}
ahirn@37877
   535
   ML> sign_of;
ahirn@37877
   536
   val it = fn : theory -> Sign.sg
ahirn@37877
   537
   ML>
ahirn@37877
   538
   ML> cterm_of;
ahirn@37877
   539
   val it = fn : Sign.sg -> term -> cterm
ahirn@37877
   540
   ML> val ct = cterm_of (sign_of thy) t;
ahirn@37877
   541
   val ct = "a + b * #3" : cterm
ahirn@37877
   542
   ML>
ahirn@37877
   543
   ML> Sign.string_of_term;
ahirn@37877
   544
   val it = fn : Sign.sg -> term -> string
ahirn@37877
   545
   ML> Sign.string_of_term (sign_of thy) t;
ahirn@37877
   546
   val it = "a + b * #3" : ctem'
ahirn@37877
   547
   ML>
ahirn@37877
   548
   ML> string_of_cterm;
ahirn@37877
   549
   val it = fn : cterm -> string
ahirn@37877
   550
   ML> string_of_cterm ct;
ahirn@37877
   551
   val it = "a + b * #3" : ctem'
ahirn@37877
   552
\end{verbatim}}%size
ahirn@37877
   553
ahirn@37877
   554
\section{Lehrs\"atze}
ahirn@37877
   555
Theorems sind types, {\tt thm}, gesch\"utzter als {\tt cterms}: Sie sind als axioms beschrieben und haben sich in Isabelle bew\"ahrt. Diese Definitionen und Beweise sind in den Theorien im Verzeichnis {\tt[isac-src]/knowledge/} enthalten, zum Beispiel der Lehrsatz {\tt diff\_sum} in der Theorie {\tt[isac-src]/knowledge/Differentiate.thy}. Zus\"atzlich muss jeder Lehrsatz für \isac{} im zugeh\"origen {\tt *.ML}, wie etwa {\tt diff\_sum} in {\tt[isac-src]/knowledge/Differentiate.ML} aufgenommen werden, wie das Folgende:
ahirn@37877
   556
{\footnotesize\begin{verbatim}
ahirn@37877
   557
   ML> theorem' := overwritel (!theorem',
ahirn@37877
   558
   [("diff_const",num_str diff_const)
ahirn@37877
   559
   ]);
ahirn@37877
   560
\end{verbatim}}%size
ahirn@37877
   561
The additional recording of theorems and other values will disappear in later versions of \isac.
ahirn@37877
   562
ahirn@37877
   563
\chapter{Umschreiben}
ahirn@37877
   564
\section{Argumente f\"ur Umschreibungen}
ahirn@37877
   565
Die Bezeichnung des type der Argumente und Werte der Umschreibfunktionen in \ref{rewrite} unterscheiden sich durch ein Apostroph: Die types mit einem Apostroph sind umbenannte strings um die Lesbarkeit aufrecht zu erhalten.
ahirn@37877
   566
{\footnotesize\begin{verbatim}
ahirn@37877
   567
   ML> HOL.thy;
ahirn@37877
   568
   val it = {ProtoPure, CPure, HOL} : theory
ahirn@37877
   569
   ML> "HOL.thy" : theory';
ahirn@37877
   570
   val it = "HOL.thy" : theory'
ahirn@37877
   571
   ML>
ahirn@37877
   572
   ML> sqrt_right;
ahirn@37877
   573
   val it = fn : rew_ord (* term * term -> bool *)
ahirn@37877
   574
   ML> "sqrt_right" : rew_ord';
ahirn@37877
   575
   val it = "sqrt_right" : rew_ord'
ahirn@37877
   576
   ML>
ahirn@37877
   577
   ML> eval_rls;
ahirn@37877
   578
   val it =
ahirn@37877
   579
     Rls
ahirn@37877
   580
       {preconds=[],rew_ord=("sqrt_right",fn),
ahirn@37877
   581
        rules=[Thm #,Thm #,Thm #,Thm #,Thm #,Thm #,Thm #,Thm #,
ahirn@37877
   582
               Thm #,Thm #,Thm #,Thm #,Thm #,Calc #,Calc #,...],
ahirn@37877
   583
        scr=Script (Free #)} : rls
ahirn@37877
   584
   ML> "eval_rls" : rls';
ahirn@37877
   585
   val it = "eval_rls" : rls'
ahirn@37877
   586
   ML>
ahirn@37877
   587
   ML> diff_sum;
ahirn@37877
   588
   val it = "d_d ?bdv (?u + ?v) = d_d ?bdv ?u + d_d ?bdv ?v" : thm
ahirn@37877
   589
   ML> ("diff_sum", "") : thm';
ahirn@37877
   590
   val it = ("diff_sum","") : thm'
ahirn@37877
   591
\end{verbatim}}%size
ahirn@37877
   592
{\tt thm'} ist ein Teil, eventuell mit strin-Darstellung von dem zugeh\"origen Lehrsatz.
ahirn@37877
   593
 
ahirn@37877
   594
\section{Die Funktionen des Umschreibens}\label{rewrite}
ahirn@37877
   595
Das Umschreiben wird von zwei equvalenten Funktionen begleitet, wobei die erste im KE verwendet wird und sie zweite n\"utzlich für Tests ist: 
ahirn@37877
   596
{\footnotesize\begin{verbatim}
ahirn@37877
   597
   ML> rewrite_;
ahirn@37877
   598
   val it = fn
ahirn@37877
   599
     : theory
ahirn@37877
   600
       -> rew_ord
ahirn@37877
   601
          -> rls -> bool -> thm -> term -> (term * term list) option
ahirn@37877
   602
   ML>
ahirn@37877
   603
   ML> rewrite;
ahirn@37877
   604
   val it = fn
ahirn@37877
   605
     : theory'
ahirn@37877
   606
       -> rew_ord'
ahirn@37877
   607
          -> rls' -> bool -> thm' -> cterm' -> (cterm' * cterm' list) option
ahirn@37877
   608
\end{verbatim}}%size
ahirn@37877
   609
The arguments are the following:\\
ahirn@37877
   610
\tabcolsep=4mm
ahirn@37877
   611
\def\arraystretch{1.5}
ahirn@37877
   612
\begin{tabular}{lp{11.0cm}}
ahirn@37877
   613
  {\tt theory}  & the Isabelle theory containing the definitions necessary for parsing the {\tt term} \\
ahirn@37877
   614
  {\tt rew\_ord}& the rewrite order \cite{nipk:rew-all-that} for ordered rewriting -- see the section \ref{term-order} below. For {\em no} ordered rewriting take {\tt tless\_true}, a dummy order yielding true for all arguments \\
ahirn@37877
   615
  {\tt rls}     & the rule set for evaluating the condition within {\tt thm} in case {\tt thm} is a conditional rule \\
ahirn@37877
   616
  {\tt bool}    & a flag which triggers the evaluation of the eventual condition in {\tt thm}: if {\tt false} then evaluate the condition and according to the result of the evaluation apply {\tt thm} or not (conditional rewriting \cite{nipk:rew-all-that}), if {\tt true} then don't evaluate the condition, but put it into the set of assumptions \\
ahirn@37877
   617
  {\tt thm}     & the theorem used to try to rewrite {\tt term} \\
ahirn@37877
   618
  {\tt term}    & the term eventually rewritten by {\tt thm} \\
ahirn@37877
   619
\end{tabular}\\
ahirn@37877
   620
ahirn@37877
   621
\noindent The respective values of {\tt rewrite\_} and {\tt rewrite} are an {\tt option} of a pair, i.e. {\tt Some(\_,\_)} in case the {\tt term} can be rewritten by {\tt thm} w.r.t. {\tt rew\_ord} and/or {\tt rls}, or {\tt None} if no rewrite is found:\\
ahirn@37877
   622
\begin{tabular}{lp{10.4cm}}
ahirn@37877
   623
  {\tt term}     & the term rewritten \\
ahirn@37877
   624
  {\tt term list}& the assumptions eventually generated if the {\tt bool} flag is set to {\tt true} and {\tt thm} is applicable. \\
ahirn@37877
   625
\end{tabular}\\
ahirn@37877
   626
ahirn@37877
   627
\paragraph{Give it a try !} {\bf\dots rewriting is fun~!} many examples can be found in {\tt [isac-src]/tests/\dots}. In {\tt [isac-src]/tests/differentiate.sml} the following can be found:
ahirn@37877
   628
{\footnotesize\begin{verbatim}
ahirn@37877
   629
   ML> val thy' = "Differentiate.thy";
ahirn@37877
   630
   val thy' = "Differentiate.thy" : string
ahirn@37877
   631
   ML> val ct = "d_d x (x ^^^ #2 + #3 * x + #4)";
ahirn@37877
   632
   val ct = "d_d x (x ^^^ #2 + #3 * x + #4)" : cterm'
ahirn@37877
   633
   ML>
ahirn@37877
   634
   ML> val thm = ("diff_sum","");
ahirn@37877
   635
   val thm = ("diff_sum","") : thm'
ahirn@37877
   636
   ML> val Some (ct,_) = rewrite_inst thy' "tless_true" "eval_rls" true
ahirn@37877
   637
                     [("bdv","x::real")] thm ct;
ahirn@37877
   638
   val ct = "d_d x (x ^^^ #2 + #3 * x) + d_d x #4" : cterm'
ahirn@37877
   639
   ML>
ahirn@37877
   640
   ML> val Some (ct,_) = rewrite_inst thy' "tless_true" "eval_rls" true
ahirn@37877
   641
                     [("bdv","x::real")] thm ct;
ahirn@37877
   642
   val ct = "d_d x (x ^^^ #2) + d_d x (#3 * x) + d_d x #4" : cterm'
ahirn@37877
   643
   ML>
ahirn@37877
   644
   ML> val thm = ("diff_prod_const","");
ahirn@37877
   645
   val thm = ("diff_prod_const","") : thm'
ahirn@37877
   646
   ML> val Some (ct,_) = rewrite_inst thy' "tless_true" "eval_rls" true
ahirn@37877
   647
                     [("bdv","x::real")] thm ct;
ahirn@37877
   648
   val ct = "d_d x (x ^^^ #2) + #3 * d_d x x + d_d x #4" : cterm'
ahirn@37877
   649
\end{verbatim}}%size
ahirn@37877
   650
Sie k\"onnen unter {\tt [isac-src]/knowledge/Differentiate.thy} die Lehrs\"atze nachschlagen und versuchen Sie, diese anzuwenden bis Sie die Ergebnisse bekommen.
ahirn@37877
   651
\footnote{Hinweis: Am Ende werden Sie {\tt val (ct,\_) = the (rewrite\_set thy' "eval\_rls" false "SqRoot\_simplify" ct);} benötigen.}
ahirn@37877
   652
ahirn@37877
   653
\paragraph{Versuchen Sie es!}\label{cond-rew} {\bf Conditional rewriting} ist eine besser Technik als \"ubliche Umschreibungen und \"ahnelt den Programmiersprachen mehr (siehe n\"achstes 'Versuchen Sie es'~!). Das folgende Beispiel liegt im Bereich der ??poynomial form??:
ahirn@37877
   654
{\footnotesize\begin{verbatim}
ahirn@37877
   655
   ML> val thy' = "Isac.thy";
ahirn@37877
   656
   val thy' = "Isac.thy" : string
ahirn@37877
   657
   ML> val ct' = "#3 * a + #2 * (a + #1)";
ahirn@37877
   658
   val ct' = "#3 * a + #2 * (a + #1)" : cterm'
ahirn@37877
   659
   ML>
ahirn@37877
   660
   ML> val thm' = ("radd_mult_distrib2","?k * (?m + ?n) = ?k * ?m + ?k * ?n");
ahirn@37877
   661
   val thm' = ("radd_mult_distrib2","?k * (?m + ?n) = ?k * ?m + ?k * ?n")
ahirn@37877
   662
     : thm'
ahirn@37877
   663
   ML> (*1*) val Some (ct',_) = rewrite thy' "tless_true" "eval_rls" true thm' ct';
ahirn@37877
   664
   val ct' = "#3 * a + (#2 * a + #2 * #1)" : cterm'
ahirn@37877
   665
   ML>
ahirn@37877
   666
   ML> val thm' = ("radd_assoc_RS_sym","?m1 + (?n1 + ?k1) = ?m1 + ?n1 + ?k1");
ahirn@37877
   667
   val thm' = ("radd_assoc_RS_sym","?m1 + (?n1 + ?k1) = ?m1 + ?n1 + ?k1")
ahirn@37877
   668
     : thm'
ahirn@37877
   669
   ML> (*2*) val Some (ct',_) = rewrite thy' "tless_true" "eval_rls" true thm' ct';
ahirn@37877
   670
   val ct' = "#3 * a + #2 * a + #2 * #1" : cterm'
ahirn@37877
   671
   ML>
ahirn@37877
   672
   ML> val thm' = ("rcollect_right",
ahirn@37877
   673
     "[| ?l is_const; ?m is_const |] ==> ?l * ?n + ?m * ?n = (?l + ?m) * ?n");
ahirn@37877
   674
   val thm' =
ahirn@37877
   675
     ("rcollect_right",
ahirn@37877
   676
      "[| ?l is_const; ?m is_const |] ==> ?l * ?n + ?m * ?n = (?l + ?m) * ?n")
ahirn@37877
   677
     : thm'
ahirn@37877
   678
   ML> (*3*) val Some (ct',_) = rewrite thy' "tless_true" "eval_rls" true thm' ct';
ahirn@37877
   679
   val ct' = "(#3 + #2) * a + #2 * #1" : cterm'
ahirn@37877
   680
   ML>
ahirn@37877
   681
   ML> (*4*) val Some (ct',_) = calculate' thy' "plus" ct';
ahirn@37877
   682
   val ct' = "#5 * a + #2 * #1" : cterm'
ahirn@37877
   683
   ML>
ahirn@37877
   684
   ML> (*5*) val Some (ct',_) = calculate' thy' "times" ct';
ahirn@37877
   685
   val ct' = "#5 * a + #2" : cterm'
ahirn@37877
   686
\end{verbatim}}%size
ahirn@37877
   687
Beachten Sie, dass es zwei Regeln gibt {\tt radd\_mult\_distrib2} in {\tt(*1*)} und {\tt rcollect\_right} in {\tt(*3*)}, die einander aufheben, (das heißt, eine angesetzte Regel w\"urde es nicht beenden), wenn es diese Bedinung nicht vorhanden ist {\tt is\_const}.
ahirn@37877
   688
ahirn@37877
   689
\paragraph{Versuchen Sie es!} {\bf Funktionelle Programmierung} kann, innerhalb einer bestimmten Reihe, durch das Umschreiben bearbeitet werden. In {\tt [isac-src]/\dots/tests/InsSort.thy} k\"onnen die Regeln gefunden werden, mit denen man eine Liste sortieren kann ('insertion sort'):
ahirn@37877
   690
{\footnotesize\begin{verbatim}
ahirn@37877
   691
   sort_def   "sort ls = foldr ins ls []"
ahirn@37877
   692
ahirn@37877
   693
   ins_base   "ins [] a = [a]"
ahirn@37877
   694
   ins_rec    "ins (x#xs) a = (if x < a then x#(ins xs a) else a#(x#xs))"  
ahirn@37877
   695
ahirn@37877
   696
   foldr_base "foldr f [] a = a"
ahirn@37877
   697
   foldr_rec  "foldr f (x#xs) a = foldr f xs (f a x)"
ahirn@37877
   698
ahirn@37877
   699
   if_True    "(if True then ?x else ?y) = ?x"
ahirn@37877
   700
   if_False   "(if False then ?x else ?y) = ?y"
ahirn@37877
   701
\end{verbatim}}%size
ahirn@37877
   702
{\tt\#} ist ein Listenersteller, {\tt foldr} ist die bekannte Funktion beim funktionellen Programmieren und {\tt if\_True, if\_False} sind die Hilfsregeln. Dann kann das Sortieren mit den folgenden Umschreibungen durchgef\"uhrt werden.
ahirn@37877
   703
{\footnotesize\begin{verbatim}
ahirn@37877
   704
   ML>  val thy' = "InsSort.thy";
ahirn@37877
   705
   val thy' = "InsSort.thy" : theory'
ahirn@37877
   706
   ML>  val ct = "sort [#1,#3,#2]" : cterm';
ahirn@37877
   707
   val ct = "sort [#1,#3,#2]" : cterm'
ahirn@37877
   708
   ML>
ahirn@37877
   709
   ML>  val thm = ("sort_def","");
ahirn@37877
   710
   ML>  val (ct,_) = the (rewrite thy' "tless_true" "eval_rls" false thm ct);
ahirn@37877
   711
   val ct = "foldr ins [#1, #3, #2] []" : cterm'
ahirn@37877
   712
   ML>
ahirn@37877
   713
   ML>  val thm = ("foldr_rec","");
ahirn@37877
   714
   ML>  val (ct,_) = the (rewrite thy' "tless_true" "eval_rls" false thm ct);
ahirn@37877
   715
   val ct = "foldr ins [#3, #2] (ins [] #1)" : cterm'
ahirn@37877
   716
   ML>
ahirn@37877
   717
   ML>  val thm = ("ins_base","");
ahirn@37877
   718
   ML>  val (ct,_) = the (rewrite thy' "tless_true" "eval_rls" false thm ct);
ahirn@37877
   719
   val ct = "foldr ins [#3, #2] [#1]" : cterm'
ahirn@37877
   720
   ML>
ahirn@37877
   721
   ML>  val thm = ("foldr_rec","");
ahirn@37877
   722
   ML>  val (ct,_) = the (rewrite thy' "tless_true" "eval_rls" false thm ct);
ahirn@37877
   723
   val ct = "foldr ins [#2] (ins [#1] #3)" : cterm'
ahirn@37877
   724
   ML>
ahirn@37877
   725
   ML>  val thm = ("ins_rec","");
ahirn@37877
   726
   ML>  val (ct,_) = the (rewrite thy' "tless_true" "eval_rls" false thm ct);
ahirn@37877
   727
   val ct = "foldr ins [#2] (if #1 < #3 then #1 # ins [] #3 else [#3, #1])"
ahirn@37877
   728
     : cterm'
ahirn@37877
   729
   ML>
ahirn@37877
   730
   ML>  val (ct,_) = the (calculate' thy' "le" ct);
ahirn@37877
   731
   val ct = "foldr ins [#2] (if True then #1 # ins [] #3 else [#3, #1])" : cterm'
ahirn@37877
   732
   ML>
ahirn@37877
   733
   ML>  val thm = ("if_True","(if True then ?x else ?y) = ?x");
ahirn@37877
   734
   ML>  val (ct,_) = the (rewrite thy' "tless_true" "eval_rls" false thm ct);
ahirn@37877
   735
   val ct = "foldr ins [#2] (#1 # ins [] #3)" : cterm'
ahirn@37877
   736
   ML> 
ahirn@37877
   737
   ...
ahirn@37877
   738
   val ct = "sort [#1,#3,#2]" : cterm'
ahirn@37877
   739
\end{verbatim}}%size
ahirn@37877
   740
ahirn@37877
   741
ahirn@37877
   742
\section{Varianten des Umschreibens}
ahirn@37877
   743
Einige der genannten Beispiele verwendeten schon Methoden von {\tt rewrite}, welche den selben Wert haben und sehr \"ahnliche Argumente verwenden:
ahirn@37877
   744
{\footnotesize\begin{verbatim}
ahirn@37877
   745
   ML> rewrite_inst_;
ahirn@37877
   746
   val it = fn
ahirn@37877
   747
     : theory
ahirn@37877
   748
       -> rew_ord
ahirn@37877
   749
          -> rls
ahirn@37877
   750
             -> bool
ahirn@37877
   751
             -> (cterm' * cterm') list
ahirn@37877
   752
                   -> thm -> term -> (term * term list) option
ahirn@37877
   753
   ML> rewrite_inst;
ahirn@37877
   754
   val it = fn
ahirn@37877
   755
     : theory'
ahirn@37877
   756
       -> rew_ord'
ahirn@37877
   757
          -> rls'
ahirn@37877
   758
             -> bool
ahirn@37877
   759
                -> (cterm' * cterm') list
ahirn@37877
   760
                   -> thm' -> cterm' -> (cterm' * cterm' list) option
ahirn@37877
   761
   ML>
ahirn@37877
   762
   ML> rewrite_set_;
ahirn@37877
   763
   val it = fn 
ahirn@37877
   764
     : theory -> rls -> bool -> rls -> term -> (term * term list) option
ahirn@37877
   765
   ML> rewrite_set;
ahirn@37877
   766
   val it = fn
ahirn@37877
   767
     : theory' -> rls' -> bool -> rls' -> cterm' -> (cterm' * cterm' list) option
ahirn@37877
   768
   ML>
ahirn@37877
   769
   ML> rewrite_set_inst_;
ahirn@37877
   770
   val it = fn
ahirn@37877
   771
     : theory
ahirn@37877
   772
       -> rls
ahirn@37877
   773
          -> bool
ahirn@37877
   774
             -> (cterm' * cterm') list
ahirn@37877
   775
                -> rls -> term -> (term * term list) option
ahirn@37877
   776
   ML> rewrite_set_inst;
ahirn@37877
   777
   val it = fn
ahirn@37877
   778
     : theory'
ahirn@37877
   779
       -> rls'
ahirn@37877
   780
          -> bool
ahirn@37877
   781
             -> (cterm' * cterm') list
ahirn@37877
   782
                -> rls' -> cterm' -> (cterm' * cterm' list) option
ahirn@37877
   783
\end{verbatim}}%size
ahirn@37877
   784
ahirn@37877
   785
\noindent Die Variante {\tt rewrite\_inst} \"andert {\tt (term * term) list} zu {\tt thm} vor dem Umschreiben,\\
ahirn@37877
   786
Die Variante {\tt rewrite\_set} umschreibt {\tt rls} mit einem ganzen Regelsatz (anstatt mit {\tt thm}),\\
ahirn@37877
   787
Die Variante {\tt rewrite\_set\_inst} ist eine Kombination aus den letzten zwei Varianten. Um zu sehen wie ein Ausdruck umgeschreiben wird, gibt es einen Schalter {\tt trace\_rewrite}:
ahirn@37877
   788
{\footnotesize\begin{verbatim}
ahirn@37877
   789
   ML> toggle;
ahirn@37877
   790
   val it = fn : bool ref -> bool
ahirn@37877
   791
   ML>
ahirn@37877
   792
   ML> toggle trace_rewrite;
ahirn@37877
   793
   val it = true : bool
ahirn@37877
   794
   ML> toggle trace_rewrite;
ahirn@37877
   795
   val it = false : bool
ahirn@37877
   796
\end{verbatim}}%size
ahirn@37877
   797
ahirn@37877
   798
\section{Regels\"atze}
ahirn@37877
   799
Eine Varianten von {\tt rewrite} oberhalb gelten nicht nur für einen Lehrsatz, sondern für eine Vielzahl von Lehrs\"atzen, die 'Regels\"atze' genannt werden. Ein Regelsatz wird so lange angewendet, bis eines seiner Elemente f\"ur das Umschreiben verwendet werden kann (das kann ewig dauern, zum Beispiel, wenn ein Regelsatz nicht endet).
ahirn@37877
   800
ahirn@37877
   801
Ein einfaches Beispiel für einen Regelsatz ist {\tt rearrange\_assoc}, welches in {\tt knowledge/RatArith.ML} beschrieben wird:
ahirn@37877
   802
{\footnotesize\begin{verbatim}
ahirn@37877
   803
   val rearrange_assoc = 
ahirn@37877
   804
     Rls{preconds = [], rew_ord = ("tless_true",tless_true), 
ahirn@37877
   805
         rules = 
ahirn@37877
   806
         [Thm ("radd_assoc_RS_sym",num_str (radd_assoc RS sym)),
ahirn@37877
   807
          Thm ("rmult_assoc_RS_sym",num_str (rmult_assoc RS sym))],
ahirn@37877
   808
         scr = Script ((term_of o the o (parse thy)) 
ahirn@37877
   809
         "empty_script")
ahirn@37877
   810
         }:rls;
ahirn@37877
   811
\end{verbatim}}%size
ahirn@37877
   812
ahirn@37877
   813
\begin{description}
ahirn@37877
   814
\item [\tt preconds] sind Bedinungen, die zutreffen m\"ussen, um den Regelsatz anwendbar zu machen (eine leere Liste berechnet {\tt true}).
ahirn@37877
   815
\item [\tt rew\_ord] betrifft die Anordnung der Ausdr\"ucke, dei weiter unten in \ref{term-order} vorgestellt werden.
ahirn@37877
   816
\item [\tt rules] sind die angewandten Lehrs\"atze -- grunds\"atzlich in beliebiger Anordnung, weil die Regels\"atze vervollst\"andigt werden sollten \cite{nipk:rew-all-that} (und die Lehrs\"atze werden tats\"achlich in der Reihenfolge, in der sie auf der Liste erscheinen, angewendet). Die Funktion {\tt num\_str}, muss bei den Lehrs\"atzen, die viele Konstanten enthalten, angewendet werden (und demnach ist das bei diesem Beispiel veraltert). {\tt RS} ist eine eingef\"ugte Funktion, die im Lehrsatz {\tt sym} zu {\tt radd\_assoc} vor der Abspeicherung angewendet wird (siehe 'Effekt')
ahirn@37877
   817
\item [\tt scr] auch wenn das script den Regelsatz anwendet, wird es in späteren Versionen von \isac verschwinden.
ahirn@37877
   818
\end{description}
ahirn@37877
   819
Diese Variablen bestimmen folgendes:
ahirn@37877
   820
{\footnotesize\begin{verbatim}
ahirn@37877
   821
   ML> sym;
ahirn@37877
   822
   val it = "?s = ?t ==> ?t = ?s" : thm 
ahirn@37877
   823
   ML> rearrange_assoc;
ahirn@37877
   824
   val it =
ahirn@37877
   825
     Rls
ahirn@37877
   826
       {preconds=[],rew_ord=("tless_true",fn),
ahirn@37877
   827
        rules=[Thm ("radd_assoc_RS_sym","?m1 + (?n1 + ?k1) = ?m1 + ?n1 + ?k1"),
ahirn@37877
   828
               Thm ("rmult_assoc_RS_sym","?m1 * (?n1 * ?k1) = ?m1 * ?n1 * ?k1")],
ahirn@37877
   829
        scr=Script (Free ("empty_script","RealDef.real"))} : rls 
ahirn@37877
   830
\end{verbatim}}%size
ahirn@37877
   831
ahirn@37877
   832
\paragraph{Versuchen Sie es!} Der obengenannte Regel-Satz l\"asst eine beliebige Zahl von Parenthesen verschwinden, die auf Grund von Assoziation auf {\tt +} nicht notwendig sind. 
ahirn@37877
   833
{\footnotesize\begin{verbatim}
ahirn@37877
   834
   ML> val ct = (string_of_cterm o the o (parse RatArith.thy))
ahirn@37877
   835
                "a + (b * (c * d) + e)";
ahirn@37877
   836
   val ct = "a + ((b * (c * d) + e) + f)" : cterm'
ahirn@37877
   837
   ML> rewrite_set "RatArith.thy" "eval_rls" false "rearrange_assoc" ct;
ahirn@37877
   838
   val it = Some ("a + b * c * d + e + f",[]) : (string * string list) option
ahirn@37877
   839
\end{verbatim}}%size
ahirn@37877
   840
Um dieses Ergebnis zu erreichen muss der Regelsatz \"uberraschend schnell sein:
ahirn@37877
   841
{\footnotesize\begin{verbatim}
ahirn@37877
   842
   ML> toggle trace_rewrite;
ahirn@37877
   843
   val it = true : bool
ahirn@37877
   844
   ML> rewrite_set "RatArith.thy" "eval_rls" false "rearrange_assoc" ct;
ahirn@37877
   845
   ### trying thm 'radd_assoc_RS_sym'
ahirn@37877
   846
   ### rewrite_set_: a + b * (c * d) + e
ahirn@37877
   847
   ### trying thm 'radd_assoc_RS_sym'
ahirn@37877
   848
   ### trying thm 'rmult_assoc_RS_sym'
ahirn@37877
   849
   ### rewrite_set_: a + b * c * d + e
ahirn@37877
   850
   ### trying thm 'rmult_assoc_RS_sym'
ahirn@37877
   851
   ### trying thm 'radd_assoc_RS_sym'
ahirn@37877
   852
   ### trying thm 'rmult_assoc_RS_sym'
ahirn@37877
   853
   val it = Some ("a + b * c * d + e",[]) : (string * string list) option
ahirn@37877
   854
\end{verbatim}}%size
ahirn@37877
   855
 
ahirn@37877
   856
ahirn@37877
   857
\section{Berechnung von numerischen Konstanten}
ahirn@37877
   858
Sobald numerische Konstanten in angrenzenden Subfristen sind, können sie durch die Funktion berechnet werden (siehe p.\pageref{cond-rew}):
ahirn@37877
   859
{\footnotesize\begin{verbatim}
ahirn@37877
   860
   ML> calculate;
ahirn@37877
   861
   val it = fn : theory' -> string -> cterm' -> (cterm' * thm') option
ahirn@37877
   862
   ML> calculate_;
ahirn@37877
   863
   val it = fn : theory -> string -> term -> (term * (string * thm)) option
ahirn@37877
   864
\end{verbatim}}%size
ahirn@37877
   865
{\tt string} beschreibt in den Angaben die mathematisch zu berechnende Operation. Die Funktion gibt das Ergebnis der Berechnung, und als zweites Element in der Reihe gilt der Lehrsatz. Die folgenden mathematischen Operationen sind verfügbar:
ahirn@37877
   866
{\footnotesize\begin{verbatim}
ahirn@37877
   867
   ML> calc_list;
ahirn@37877
   868
   val it =
ahirn@37877
   869
     ref
ahirn@37877
   870
       [("plus",("op +",fn)),
ahirn@37877
   871
        ("times",("op *",fn)),
ahirn@37877
   872
        ("cancel_",("cancel",fn)),
ahirn@37877
   873
        ("power",("pow",fn)),
ahirn@37877
   874
        ("sqrt",("sqrt",fn)),
ahirn@37877
   875
        ("Var",("Var",fn)),
ahirn@37877
   876
        ("Length",("Length",fn)),
ahirn@37877
   877
        ("Nth",("Nth",fn)),
ahirn@37877
   878
        ("power",("pow",fn)),
ahirn@37877
   879
        ("le",("op <",fn)),
ahirn@37877
   880
        ("leq",("op <=",fn)),
ahirn@37877
   881
        ("is_const",("is'_const",fn)),
ahirn@37877
   882
        ("is_root_free",("is'_root'_free",fn)),
ahirn@37877
   883
        ("contains_root",("contains'_root",fn)),
ahirn@37877
   884
        ("ident",("ident",fn))]
ahirn@37877
   885
     : (string * (string * (string -> term -> theory -> 
ahirn@37877
   886
        (string * term) option))) list ref
ahirn@37877
   887
\end{verbatim}}%size
ahirn@37877
   888
Diese Vorgänge k\"onnen so verwendet werden:
ahirn@37877
   889
{\footnotesize\begin{verbatim}
ahirn@37877
   890
   ML> calculate' "Isac.thy" "plus" "#1 + #2";
ahirn@37877
   891
   val it = Some ("#3",("#add_#1_#2","\"#1 + #2 = #3\"")) : (string * thm') option
ahirn@37877
   892
   ML>
ahirn@37877
   893
   ML> calculate' "Isac.thy" "times" "#2 * #3";
ahirn@37877
   894
   val it = Some ("#6",("#mult_#2_#3","\"#2 * #3 = #6\""))
ahirn@37877
   895
     : (string * thm') option
ahirn@37877
   896
   ML>
ahirn@37877
   897
   ML> calculate' "Isac.thy" "power" "#2 ^^^ #3";
ahirn@37877
   898
   val it = Some ("#8",("#power_#2_#3","\"#2 ^^^ #3 = #8\""))
ahirn@37877
   899
     : (string * thm') option
ahirn@37877
   900
   ML>
ahirn@37877
   901
   ML> calculate' "Isac.thy" "cancel_" "#9 // #12";
ahirn@37877
   902
   val it = Some ("#3 // #4",("#cancel_#9_#12","\"#9 // #12 = #3 // #4\""))
ahirn@37877
   903
     : (string * thm') option
ahirn@37877
   904
   ML>
ahirn@37877
   905
   ML> ...
ahirn@37877
   906
\end{verbatim}}%size
ahirn@37877
   907
          
ahirn@37877
   908
ahirn@37877
   909
ahirn@37877
   910
\chapter{Begriff-Ordnung}\label{term-order}
ahirn@37877
   911
Die Anordnungen der Terme sind unverzichtbar f\"ur den Gebrauch des Umschreibens von normalen Funktionen in inhaltsorientierten - kommunikativen Breichen, wie \cite{nipk:rew-all-that}, und zum Umschreiben von normalen Formeln, die n\"otig sind um passende Modelle f\"ur Probleme zu finden, siehe \ref{pbt}.
ahirn@37877
   912
\section{Beispiel f\"ur Begriff-Ordnungen}
ahirn@37877
   913
Es ist nicht unbedeutend, eine Verbindung $<$ zu Termen herzustellen, die wirklich eine Anordnung besitzen, wie eine transitive und antisymmetrische Verbindung. Diese Anordnungen sind 'rekursive Bahnanordnungen' \cite{nipk:rew-all-that}. Einige Anordnungen sind im Basiswissen bei {\tt [isac-src]/knowledge/\dots}, angeführt. %FIXXXmat0201a
ahirn@37877
   914
unter anderem
ahirn@37877
   915
{\footnotesize\begin{verbatim}
ahirn@37877
   916
   ML> sqrt_right;
ahirn@37877
   917
   val it = fn : bool -> theory -> term * term -> bool
ahirn@37877
   918
   ML> tless_true;
ahirn@37877
   919
   val it = fn : 'a -> bool 
ahirn@37877
   920
\end{verbatim}}%size
ahirn@37877
   921
Das bool Argument ist ein Schalter um die Kontrolle zur\"uck zu den zugeh\"origen Unterordnungen zu verfolgen (diese Theorie ist notwendig um die Unterordnungen als strings, sollten sie 'true' sein, anzuzeigen). Die Anordnung {\tt tless\_true} ist belanglos und tr\"agt immer {\tt true}, und {\tt sqrt\_right} bevorzugt eine Quadratwurzel, die nach rechts im Ausdruck geschoben wird:
ahirn@37877
   922
{\footnotesize\begin{verbatim}
ahirn@37877
   923
   ML> val t1 = (term_of o the o (parse thy)) "(sqrt a) + b";
ahirn@37877
   924
   val t1 = Const # $ (# $ #) $ Free (#,#) : term
ahirn@37877
   925
   ML>
ahirn@37877
   926
   ML> val t2 = (term_of o the o (parse thy)) "b + (sqrt a)";
ahirn@37877
   927
   val t2 = Const # $ Free # $ (Const # $ Free #) : term
ahirn@37877
   928
   ML>
ahirn@37877
   929
   ML> sqrt_right false SqRoot.thy (t1, t2);
ahirn@37877
   930
   val it = false : bool
ahirn@37877
   931
   ML> sqrt_right false SqRoot.thy (t2, t1);
ahirn@37877
   932
   val it = true : bool
ahirn@37877
   933
\end{verbatim}}%size
ahirn@37877
   934
Die vielen Kontrollen, die rekursiv durch alle Subbegriffe durchgef\"uhrt werden, können überall im Algorithmus in {\tt [isac-src]/knowledge/SqRoot.ML} verfolgt werden, wenn man die flag auf true setzt:
ahirn@37877
   935
{\footnotesize\begin{verbatim}
ahirn@37877
   936
   ML> val t1 = (term_of o the o (parse thy)) "a + b*(sqrt c) + d";
ahirn@37877
   937
   val t1 = Const (#,#) $ (# $ # $ (# $ #)) $ Free ("d","RealDef.real") : term
ahirn@37877
   938
   ML>
ahirn@37877
   939
   ML> val t2 = (term_of o the o (parse thy)) "a + (sqrt b)*c + d";
ahirn@37877
   940
   val t2 = Const (#,#) $ (# $ # $ (# $ #)) $ Free ("d","RealDef.real") : term
ahirn@37877
   941
   ML>
ahirn@37877
   942
   ML> sqrt_right true SqRoot.thy (t1, t2);
ahirn@37877
   943
   t= f@ts= "op +" @ "[a + b * sqrt c,d]"
ahirn@37877
   944
   u= g@us= "op +" @ "[a + sqrt b * c,d]"
ahirn@37877
   945
   size_of_term(t,u)= (8, 8)
ahirn@37877
   946
   hd_ord(f,g)      = EQUAL
ahirn@37877
   947
   terms_ord(ts,us) = LESS
ahirn@37877
   948
   -------
ahirn@37877
   949
   t= f@ts= "op +" @ "[a,b * sqrt c]"
ahirn@37877
   950
   u= g@us= "op +" @ "[a,sqrt b * c]"
ahirn@37877
   951
   size_of_term(t,u)= (6, 6)
ahirn@37877
   952
   hd_ord(f,g)      = EQUAL
ahirn@37877
   953
   terms_ord(ts,us) = LESS
ahirn@37877
   954
   -------
ahirn@37877
   955
   t= f@ts= "a" @ "[]"
ahirn@37877
   956
   u= g@us= "a" @ "[]"
ahirn@37877
   957
   size_of_term(t,u)= (1, 1)
ahirn@37877
   958
   hd_ord(f,g)      = EQUAL
ahirn@37877
   959
   terms_ord(ts,us) = EQUAL
ahirn@37877
   960
   -------
ahirn@37877
   961
   t= f@ts= "op *" @ "[b,sqrt c]"
ahirn@37877
   962
   u= g@us= "op *" @ "[sqrt b,c]"
ahirn@37877
   963
   size_of_term(t,u)= (4, 4)
ahirn@37877
   964
   hd_ord(f,g)      = EQUAL
ahirn@37877
   965
   terms_ord(ts,us) = LESS
ahirn@37877
   966
   -------
ahirn@37877
   967
   t= f@ts= "b" @ "[]"
ahirn@37877
   968
   u= g@us= "sqrt" @ "[b]"
ahirn@37877
   969
   size_of_term(t,u)= (1, 2)
ahirn@37877
   970
   hd_ord(f,g)      = LESS
ahirn@37877
   971
   terms_ord(ts,us) = LESS
ahirn@37877
   972
   -------
ahirn@37877
   973
   val it = true : bool 
ahirn@37877
   974
\end{verbatim}}%size
ahirn@37877
   975
ahirn@37877
   976
ahirn@37877
   977
ahirn@37877
   978
\section{Geordnetes Umschreiben}
ahirn@37877
   979
Das Umschreiben beinhaltet in fast allen elementaren Bereichen Probleme, die alle assoziieren und ausgewechselt werden k\"onnen, im Bezug auf {\tt +} und {\tt *} --- Das Gesetz der Wandelbarkeit angewendet mit einem Regelsatzes, veranlasst den Satz, nicht zu enden! Ein Weg mit dieser Schwierigkeit umzugehen ist das geordnete Umschreiben, bei dem die Umschreibung erst beendet ist, wenn der Begriff des Ergebnisses kleiner ist, im Bezug auf eine Begriff-Ordnung (mit einigen zus\"atzlichen Eigenschaften, die 'rewrite orders' \cite{nipk:rew-all-that} genannt werden).
ahirn@37877
   980
ahirn@37877
   981
Ein solcher Regelsatz {\tt ac\_plus\_times}, der als AC-rewrite system bezeichnet wird, kann in {\tt[isac-src]/knowledge/RathArith.ML} gefunden werden:
ahirn@37877
   982
{\footnotesize\begin{verbatim}
ahirn@37877
   983
   val ac_plus_times =
ahirn@37877
   984
     Rls{preconds = [], rew_ord = ("term_order",term_order),
ahirn@37877
   985
         rules =
ahirn@37877
   986
         [Thm ("radd_commute",radd_commute),
ahirn@37877
   987
          Thm ("radd_left_commute",radd_left_commute),
ahirn@37877
   988
          Thm ("radd_assoc",radd_assoc),
ahirn@37877
   989
          Thm ("rmult_commute",rmult_commute),
ahirn@37877
   990
          Thm ("rmult_left_commute",rmult_left_commute),
ahirn@37877
   991
          Thm ("rmult_assoc",rmult_assoc)],
ahirn@37877
   992
         scr = Script ((term_of o the o (parse thy))
ahirn@37877
   993
         "empty_script")
ahirn@37877
   994
         }:rls;
ahirn@37877
   995
   val ac_plus_times =
ahirn@37877
   996
     Rls
ahirn@37877
   997
       {preconds=[],rew_ord=("term_order",fn),
ahirn@37877
   998
        rules=[Thm ("radd_commute","?m + ?n = ?n + ?m"),
ahirn@37877
   999
               Thm ("radd_left_commute","?x + (?y + ?z) = ?y + (?x + ?z)"),
ahirn@37877
  1000
               Thm ("radd_assoc","?m + ?n + ?k = ?m + (?n + ?k)"),
ahirn@37877
  1001
               Thm ("rmult_commute","?m * ?n = ?n * ?m"),
ahirn@37877
  1002
               Thm ("rmult_left_commute","?x * (?y * ?z) = ?y * (?x * ?z)"),
ahirn@37877
  1003
               Thm ("rmult_assoc","?m * ?n * ?k = ?m * (?n * ?k)")],
ahirn@37877
  1004
        scr=Script (Free ("empty_script","RealDef.real"))} : rls 
ahirn@37877
  1005
\end{verbatim}}%size
ahirn@37877
  1006
Beachten Sie, dass die Lehrs\"atze {\tt radd\_left\_commute} und {\tt rmult\_left\_commute} notwendig sind, um den Regelsatz 'confluent' zu machen!
ahirn@37877
  1007
ahirn@37877
  1008
ahirn@37877
  1009
\paragraph{Versuchen Sie es!} Das geordnete Umschreiben ist eine Technik um ein normales Polynom von willk\"urlich, ganzzahligen Termen zu schafffen.:
ahirn@37877
  1010
{\footnotesize\begin{verbatim}
ahirn@37877
  1011
   ML> val ct' = "#3 * a + b + #2 * a";
ahirn@37877
  1012
   val ct' = "#3 * a + b + #2 * a" : cterm'
ahirn@37877
  1013
   ML>
ahirn@37877
  1014
   ML> (*-1-*) radd_commute; val thm' = ("radd_commute","") : thm';
ahirn@37877
  1015
   val it = "?m + ?n = ?n + ?m" : thm
ahirn@37877
  1016
   val thm' = ("radd_commute","") : thm'
ahirn@37877
  1017
   ML> val Some (ct',_) = rewrite thy' "tless_true" "eval_rls" true thm' ct';
ahirn@37877
  1018
   val ct' = "#2 * a + (#3 * a + b)" : cterm'
ahirn@37877
  1019
   ML>
ahirn@37877
  1020
   ML> (*-2-*) rdistr_right_assoc_p; val thm' = ("rdistr_right_assoc_p","") : thm';
ahirn@37877
  1021
   val it = "?l * ?n + (?m * ?n + ?k) = (?l + ?m) * ?n + ?k" : thm
ahirn@37877
  1022
   val thm' = ("rdistr_right_assoc_p","") : thm'
ahirn@37877
  1023
   ML> val Some (ct',_) = rewrite thy' "tless_true" "eval_rls" true thm' ct';
ahirn@37877
  1024
   val ct' = "(#2 + #3) * a + b" : cterm'
ahirn@37877
  1025
   ML>
ahirn@37877
  1026
   ML> (*-3-*)
ahirn@37877
  1027
   ML> val Some (ct',_) = calculate thy' "plus" ct';
ahirn@37877
  1028
   val ct' = "#5 * a + b" : cterm'
ahirn@37877
  1029
\end{verbatim}}%size %FIXXXmat0201b ... calculate !
ahirn@37877
  1030
Das sieht toll aus, aber wenn {\tt radd\_commute} automatisch angewendet wird {\tt (*-1-*)} ohne zu \"uberpr\"ufen, ob ide daraus entstehenden Terme kleiner werden im Bezug auf die Begriffsordnung, dann geht das Umschreiben endlos weiter. (das heißt, es wird nicht beendet) \dots
ahirn@37877
  1031
{\footnotesize\begin{verbatim}
ahirn@37877
  1032
   ML> val ct' = "#3 * a + b + #2 * a" : cterm';
ahirn@37877
  1033
   val ct' = "#3 * a + b + #2 * a" : cterm'
ahirn@37877
  1034
   ML> val thm' = ("radd_commute","") : thm';
ahirn@37877
  1035
   val thm' = ("radd_commute","") : thm'
ahirn@37877
  1036
   ML>
ahirn@37877
  1037
   ML> val Some (ct',_) = rewrite thy' "tless_true" "eval_rls" true thm' ct';
ahirn@37877
  1038
   val ct' = "#2 * a + (#3 * a + b)" : cterm'
ahirn@37877
  1039
   ML> val Some (ct',_) = rewrite thy' "tless_true" "eval_rls" true thm' ct';
ahirn@37877
  1040
   val ct' = "#3 * a + b + #2 * a" : cterm'
ahirn@37877
  1041
   ML> val Some (ct',_) = rewrite thy' "tless_true" "eval_rls" true thm' ct';
ahirn@37877
  1042
   val ct' = "#2 * a + (#3 * a + b)" : cterm'
ahirn@37877
  1043
              ..........
ahirn@37877
  1044
\end{verbatim}}%size
ahirn@37877
  1045
ahirn@37877
  1046
Geordnetes Umschreiben mit dem obrigen AC-rewrite system {\tt ac\_plus\_times} verursacht eine Art Durcheinander, dem man auf die Spur kommen kann:
ahirn@37877
  1047
{\footnotesize\begin{verbatim}
ahirn@37877
  1048
   ML> toggle trace_rewrite;
ahirn@37877
  1049
   val it = true : bool
ahirn@37877
  1050
   ML>
ahirn@37877
  1051
   ML> rewrite_set "RatArith.thy" "eval_rls" false "ac_plus_times" ct;
ahirn@37877
  1052
   ### trying thm 'radd_commute'
ahirn@37877
  1053
   ### not: "a + (b * (c * d) + e)" > "b * (c * d) + e + a"
ahirn@37877
  1054
   ### rewrite_set_: a + (e + b * (c * d))
ahirn@37877
  1055
   ### trying thm 'radd_commute'
ahirn@37877
  1056
   ### not: "a + (e + b * (c * d))" > "e + b * (c * d) + a"
ahirn@37877
  1057
   ### not: "e + b * (c * d)" > "b * (c * d) + e"
ahirn@37877
  1058
   ### trying thm 'radd_left_commute'
ahirn@37877
  1059
   ### not: "a + (e + b * (c * d))" > "e + (a + b * (c * d))"
ahirn@37877
  1060
   ### trying thm 'radd_assoc'
ahirn@37877
  1061
   ### trying thm 'rmult_commute'
ahirn@37877
  1062
   ### not: "b * (c * d)" > "c * d * b"
ahirn@37877
  1063
   ### not: "c * d" > "d * c"
ahirn@37877
  1064
   ### trying thm 'rmult_left_commute'
ahirn@37877
  1065
   ### not: "b * (c * d)" > "c * (b * d)"
ahirn@37877
  1066
   ### trying thm 'rmult_assoc'
ahirn@37877
  1067
   ### trying thm 'radd_commute'
ahirn@37877
  1068
   ### not: "a + (e + b * (c * d))" > "e + b * (c * d) + a"
ahirn@37877
  1069
   ### not: "e + b * (c * d)" > "b * (c * d) + e"
ahirn@37877
  1070
   ### trying thm 'radd_left_commute'
ahirn@37877
  1071
   ### not: "a + (e + b * (c * d))" > "e + (a + b * (c * d))"
ahirn@37877
  1072
   ### trying thm 'radd_assoc'
ahirn@37877
  1073
   ### trying thm 'rmult_commute'
ahirn@37877
  1074
   ### not: "b * (c * d)" > "c * d * b"
ahirn@37877
  1075
   ### not: "c * d" > "d * c"
ahirn@37877
  1076
   ### trying thm 'rmult_left_commute'
ahirn@37877
  1077
   ### not: "b * (c * d)" > "c * (b * d)"
ahirn@37877
  1078
   ### trying thm 'rmult_assoc'
ahirn@37877
  1079
   val it = Some ("a + (e + b * (c * d))",[]) : (string * string list) option     \end{verbatim}}%size
ahirn@37877
  1080
Beachten Sie, dass {\tt +} nach links ausgerichtet ist, bei dem die Parenthesen f\"ur {\tt (a + b) + c = a + b + c}, aber nicht f\"ur {\tt a + (b + c)} weggelassen werden. Geordnetes Umschreiben endet unbedingt mit Parenthesen, die auf Grund der Assoziation weggelassen werden k\"onnen.
ahirn@37877
  1081
ahirn@37877
  1082
ahirn@37877
  1083
\chapter{The hierarchy of problem types}\label{pbt}
ahirn@37877
  1084
\section{The standard-function for 'matching'}
ahirn@37877
  1085
Matching \cite{nipk:rew-all-that} is a technique used within rewriting, and used by \isac{} also for (a generalized) 'matching' a problem with a problem type. The function which tests for matching has the following signature:
ahirn@37877
  1086
{\footnotesize\begin{verbatim}
ahirn@37877
  1087
   ML> matches;
ahirn@37877
  1088
   val it = fn : theory -> term -> term -> bool
ahirn@37877
  1089
\end{verbatim}}%size
ahirn@37877
  1090
where the first of the two {\tt term} arguments is the particular term to be tested, and the second one is the pattern:
ahirn@37877
  1091
{\footnotesize\begin{verbatim}
ahirn@37877
  1092
   ML> val t = (term_of o the o (parse thy)) "#3 * x^^^#2 = #1";
ahirn@37877
  1093
   val t = Const (#,#) $ (# $ # $ (# $ #)) $ Free ("#1","RealDef.real") : term
ahirn@37877
  1094
   ML>
ahirn@37877
  1095
   ML> val p = (term_of o the o (parse thy)) "a * b^^^#2 = c";
ahirn@37877
  1096
   val p = Const (#,#) $ (# $ # $ (# $ #)) $ Free ("c","RealDef.real") : term
ahirn@37877
  1097
   ML> atomt p;
ahirn@37877
  1098
   *** -------------
ahirn@37877
  1099
   *** Const ( op =)
ahirn@37877
  1100
   *** . Const ( op *)
ahirn@37877
  1101
   *** . . Free ( a, )
ahirn@37877
  1102
   *** . . Const ( RatArith.pow)
ahirn@37877
  1103
   *** . . . Free ( b, )
ahirn@37877
  1104
   *** . . . Free ( #2, )
ahirn@37877
  1105
   *** . Free ( c, )
ahirn@37877
  1106
   val it = () : unit
ahirn@37877
  1107
   ML>
ahirn@37877
  1108
   ML> free2var;
ahirn@37877
  1109
   val it = fn : term -> term
ahirn@37877
  1110
   ML>
ahirn@37877
  1111
   ML> val pat = free2var p;
ahirn@37877
  1112
   val pat = Const (#,#) $ (# $ # $ (# $ #)) $ Var ((#,#),"RealDef.real") : term
ahirn@37877
  1113
   ML> Sign.string_of_term (sign_of thy) pat;
ahirn@37877
  1114
   val it = "?a * ?b ^^^ #2 = ?c" : cterm' 
ahirn@37877
  1115
   ML> atomt pat;
ahirn@37877
  1116
   *** -------------
ahirn@37877
  1117
   *** Const ( op =)
ahirn@37877
  1118
   *** . Const ( op *)
ahirn@37877
  1119
   *** . . Var ((a, 0), )
ahirn@37877
  1120
   *** . . Const ( RatArith.pow)
ahirn@37877
  1121
   *** . . . Var ((b, 0), )
ahirn@37877
  1122
   *** . . . Free ( #2, )
ahirn@37877
  1123
   *** . Var ((c, 0), )
ahirn@37877
  1124
   val it = () : unit
ahirn@37877
  1125
\end{verbatim}}%size % $ 
ahirn@37877
  1126
Note that the pattern {\tt pat} contains so-called {\it scheme variables} decorated with a {\tt ?} (analoguous to theorems). The pattern is generated by the function {\tt free2var}. This format of the pattern is necessary in order to obtain results like these:
ahirn@37877
  1127
{\footnotesize\begin{verbatim}
ahirn@37877
  1128
   ML> matches thy t pat;
ahirn@37877
  1129
   val it = true : bool
ahirn@37877
  1130
   ML>
ahirn@37877
  1131
   ML> val t2 = (term_of o the o (parse thy)) "x^^^#2 = #1";
ahirn@37877
  1132
   val t2 = Const (#,#) $ (# $ # $ Free #) $ Free ("#1","RealDef.real") : term
ahirn@37877
  1133
   ML> matches thy t2 pat;
ahirn@37877
  1134
   val it = false : bool    
ahirn@37877
  1135
   ML>
ahirn@37877
  1136
   ML> val pat2 = (term_of o the o (parse thy)) "?u^^^#2 = ?v";
ahirn@37877
  1137
   val pat2 = Const (#,#) $ (# $ # $ Free #) $ Var ((#,#),"RealDef.real") : term
ahirn@37877
  1138
   ML> matches thy t2 pat2;
ahirn@37877
  1139
   val it = true : bool 
ahirn@37877
  1140
\end{verbatim}}%size % $
ahirn@37877
  1141
ahirn@37877
  1142
\section{Accessing the hierarchy}
ahirn@37877
  1143
The hierarchy of problem types is encapsulated; it can be accessed by the following functions. {\tt show\_ptyps} retrieves all leaves of the hierarchy (here in an early version for testing):
ahirn@37877
  1144
{\footnotesize\begin{verbatim}
ahirn@37877
  1145
   ML> show_ptyps;
ahirn@37877
  1146
   val it = fn : unit -> unit
ahirn@37877
  1147
   ML> show_ptyps();
ahirn@37877
  1148
   [
ahirn@37877
  1149
    ["e_pblID"],
ahirn@37877
  1150
    ["equation", "univariate", "linear"],
ahirn@37877
  1151
    ["equation", "univariate", "plain_square"],
ahirn@37877
  1152
    ["equation", "univariate", "polynomial", "degree_two", "pq_formula"],
ahirn@37877
  1153
    ["equation", "univariate", "polynomial", "degree_two", "abc_formula"],
ahirn@37877
  1154
    ["equation", "univariate", "squareroot"],
ahirn@37877
  1155
    ["equation", "univariate", "normalize"],
ahirn@37877
  1156
    ["equation", "univariate", "sqroot-test"],
ahirn@37877
  1157
    ["function", "derivative_of"],
ahirn@37877
  1158
    ["function", "maximum_of", "on_interval"],
ahirn@37877
  1159
    ["function", "make"],
ahirn@37877
  1160
    ["tool", "find_values"],
ahirn@37877
  1161
    ["functional", "inssort"]
ahirn@37877
  1162
   ]
ahirn@37877
  1163
   val it = () : unit
ahirn@37877
  1164
\end{verbatim}}%size
ahirn@37877
  1165
The retrieve function for individual problem types is {\tt get\_pbt}
ahirn@37877
  1166
\footnote{A function providing better readable output is in preparation}. Note that its argument, the 'problem identifier' {\tt pblID}, has the strings listed in reverse order w.r.t. the hierarchy, i.e. from the leave to the root. This order makes the {\tt pblID} closer to a natural description:
ahirn@37877
  1167
{\footnotesize\begin{verbatim}
ahirn@37877
  1168
   ML> get_pbt;
ahirn@37877
  1169
   val it = fn : pblID -> pbt
ahirn@37877
  1170
   ML> get_pbt ["squareroot", "univariate", "equation"];
ahirn@37877
  1171
   val it =
ahirn@37877
  1172
     {met=[("SqRoot.thy","square_equation")],
ahirn@37877
  1173
      ppc=[("#Given",(Const (#,#),Free (#,#))),
ahirn@37877
  1174
           ("#Given",(Const (#,#),Free (#,#))),
ahirn@37877
  1175
           ("#Given",(Const (#,#),Free (#,#))),
ahirn@37877
  1176
           ("#Find",(Const (#,#),Free (#,#)))],
ahirn@37877
  1177
      thy={ProtoPure, CPure, HOL, Ord, Set, subset, equalities, mono, Vimage, Fun,
ahirn@37877
  1178
            Prod, Lfp, Relation, Trancl, WF, NatDef, Gfp, Sum, Inductive, Nat,
ahirn@37877
  1179
            Arith, Divides, Power, Finite, Equiv, IntDef, Int, Univ, Datatype,
ahirn@37877
  1180
            Numeral, Bin, IntArith, WF_Rel, Recdef, IntDiv, NatBin, List, Option,
ahirn@37877
  1181
            Map, Record, RelPow, Sexp, String, Calculation, SVC_Oracle, Main,
ahirn@37877
  1182
            Zorn, Filter, PNat, PRat, PReal, RealDef, RealOrd, RealInt, RealBin,
ahirn@37877
  1183
            HyperDef, Descript, ListG, Tools, Script, Typefix, Atools, RatArith,
ahirn@37877
  1184
            SqRoot},
ahirn@37877
  1185
      where_=[Const ("SqRoot.contains'_root","bool => bool") $
ahirn@37877
  1186
              Free ("e_","bool")]} : pbt
ahirn@37877
  1187
\end{verbatim}}%size %$
ahirn@37877
  1188
where the records fields hold the following data:
ahirn@37877
  1189
\begin{description}
ahirn@37877
  1190
\item [\tt thy]: the theory necessary for parsing the formulas
ahirn@37877
  1191
\item [\tt ppc]: the items of the problem type, divided into those {\tt Given}, the precondition {\tt Where} and the output item(s) {\tt Find}. The items of {\tt Given} and {\tt Find} are all headed by so-called descriptions, which determine the type. These descriptions are defined in {\tt [isac-src]/Isa99/Descript.thy}.
ahirn@37877
  1192
\item [\tt met]: the list of methods solving this problem type.\\
ahirn@37877
  1193
\end{description}
ahirn@37877
  1194
ahirn@37877
  1195
The following function adds or replaces a problem type (after having it prepared using {\tt prep\_pbt})
ahirn@37877
  1196
{\footnotesize\begin{verbatim}
ahirn@37877
  1197
   ML> store_pbt;
ahirn@37877
  1198
   val it = fn : pbt * pblID -> unit
ahirn@37877
  1199
   ML> store_pbt
ahirn@37877
  1200
    (prep_pbt SqRoot.thy
ahirn@37877
  1201
    (["newtype","univariate","equation"],
ahirn@37877
  1202
     [("#Given" ,["equality e_","solveFor v_","errorBound err_"]),
ahirn@37877
  1203
      ("#Where" ,["contains_root (e_::bool)"]),
ahirn@37877
  1204
      ("#Find"  ,["solutions v_i_"])
ahirn@37877
  1205
     ],
ahirn@37877
  1206
     [("SqRoot.thy","square_equation")]));
ahirn@37877
  1207
   val it = () : unit
ahirn@37877
  1208
\end{verbatim}}%size
ahirn@37877
  1209
When adding a new type with argument {\tt pblID}, an immediate parent must already exist in the hierarchy (this is the one with the tail of {\tt pblID}).
ahirn@37877
  1210
ahirn@37877
  1211
\section{Internals of the datastructure}
ahirn@37877
  1212
This subsection only serves for the implementation of the hierarchy browser and can be skipped by the authors of math knowledge.
ahirn@37877
  1213
ahirn@37877
  1214
A problem type is described by the following record type (in the file {\tt [isac-src]/globals.sml}, the respective functions are in {\tt [isac-src]/ME/ptyps.sml}), and held in a global reference variable:
ahirn@37877
  1215
{\footnotesize\begin{verbatim}
ahirn@37877
  1216
   type pbt = 
ahirn@37877
  1217
        {thy   : theory,       (* the nearest to the root,
ahirn@37877
  1218
                                  which allows to compile that pbt  *)
ahirn@37877
  1219
         where_: term list,    (* where - predicates                *)
ahirn@37877
  1220
         ppc   : ((string *    (* fields "#Given","#Find"           *)
ahirn@37877
  1221
                   (term *     (* description                       *)
ahirn@37877
  1222
                    term))     (* id                                *)
ahirn@37877
  1223
                      list),                                        
ahirn@37877
  1224
         met   : metID list};  (* methods solving the pbt           *)
ahirn@37877
  1225
   datatype ptyp = 
ahirn@37877
  1226
            Ptyp of string *   (* key within pblID                  *)
ahirn@37877
  1227
                    pbt list * (* several pbts with different domIDs*)
ahirn@37877
  1228
                    ptyp list;
ahirn@37877
  1229
   val e_Ptyp = Ptyp ("empty",[],[]);
ahirn@37877
  1230
   
ahirn@37877
  1231
   type ptyps = ptyp list;
ahirn@37877
  1232
   val ptyps = ref ([e_Ptyp]:ptyps);
ahirn@37877
  1233
\end{verbatim}}%size
ahirn@37877
  1234
The predicates in {\tt where\_} (i.e. the preconditions) usually are defined in the respective theory in {\tt[isac-src]/knowledge}. Most of the predicates are not defined by rewriting, but by SML-code contained in the respective {\tt *.ML} file.
ahirn@37877
  1235
ahirn@37877
  1236
Each item is headed by a so-called description which provides some guidance for interactive input. The descriptions are defined in {\tt[isac-src]/Isa99/Descript.thy}.
ahirn@37877
  1237
ahirn@37877
  1238
ahirn@37877
  1239
ahirn@37877
  1240
\section{Match a formalization with a problem type}\label{pbl}
ahirn@37877
  1241
A formalization is {\it match}ed with a problem type which yields a problem. A formal description of this kind of {\it match}ing can be found in \\{\tt ftp://ft.ist.tugraz.at/projects/isac/publ/calculemus01.ps.gz}. A formalization of an equation is e.g.
ahirn@37877
  1242
{\footnotesize\begin{verbatim}
ahirn@37877
  1243
   ML> val fmz = ["equality (#1 + #2 * x = #0)",
ahirn@37877
  1244
                  "solveFor x",
ahirn@37877
  1245
                  "solutions L"] : fmz;
ahirn@37877
  1246
   val fmz = ["equality (#1 + #2 * x = #0)","solveFor x","solutions L"] : fmz
ahirn@37877
  1247
\end{verbatim}}%size
ahirn@37877
  1248
Given a formalization (and a specification of the problem, i.e. a theory, a problemtype, and a method) \isac{} can solve the respective problem automatically. The formalization must match the problem type for this purpose:
ahirn@37877
  1249
{\footnotesize\begin{verbatim}
ahirn@37877
  1250
   ML> match_pbl;
ahirn@37877
  1251
   val it = fn : fmz -> pbt -> match'
ahirn@37877
  1252
   ML>
ahirn@37877
  1253
   ML> match_pbl fmz (get_pbt ["univariate","equation"]);
ahirn@37877
  1254
   val it =
ahirn@37877
  1255
     Matches'
ahirn@37877
  1256
       {Find=[Correct "solutions L"],
ahirn@37877
  1257
        Given=[Correct "equality (#1 + #2 * x = #0)",Correct "solveFor x"],
ahirn@37877
  1258
        Relate=[],Where=[Correct "matches (?a = ?b) (#1 + #2 * x = #0)"],With=[]}
ahirn@37877
  1259
     : match'
ahirn@37877
  1260
   ML>
ahirn@37877
  1261
   ML> match_pbl fmz (get_pbt ["linear","univariate","equation"]);
ahirn@37877
  1262
   val it =
ahirn@37877
  1263
     Matches'
ahirn@37877
  1264
       {Find=[Correct "solutions L"],
ahirn@37877
  1265
        Given=[Correct "equality (#1 + #2 * x = #0)",Correct "solveFor x"],
ahirn@37877
  1266
        Relate=[],
ahirn@37877
  1267
        Where=[Correct
ahirn@37877
  1268
                 "matches (          x = #0) (#1 + #2 * x = #0) |
ahirn@37877
  1269
                  matches (     ?b * x = #0) (#1 + #2 * x = #0) |
ahirn@37877
  1270
                  matches (?a      + x = #0) (#1 + #2 * x = #0) |
ahirn@37877
  1271
                  matches (?a + ?b * x = #0) (#1 + #2 * x = #0)"],
ahirn@37877
  1272
        With=[]} : match'
ahirn@37877
  1273
   ML>
ahirn@37877
  1274
   ML> match_pbl fmz (get_pbt ["squareroot","univariate","equation"]);
ahirn@37877
  1275
   val it =
ahirn@37877
  1276
     NoMatch'
ahirn@37877
  1277
       {Find=[Correct "solutions L"],
ahirn@37877
  1278
        Given=[Correct "equality (#1 + #2 * x = #0)",Correct "solveFor x",
ahirn@37877
  1279
               Missing "errorBound err_"],Relate=[],
ahirn@37877
  1280
        Where=[False "contains_root #1 + #2 * x = #0 "],With=[]} : match'
ahirn@37877
  1281
\end{verbatim}}%size
ahirn@37877
  1282
The above formalization does not match the problem type \\{\tt["squareroot","univariate","equation"]} which is explained by the tags:
ahirn@37877
  1283
\begin{tabbing}
ahirn@37877
  1284
123\=\kill
ahirn@37877
  1285
\> {\tt Missing:} the item is missing in the formalization as required by the problem type\\
ahirn@37877
  1286
\> {\tt Superfl:} the item is not required by the problem type\\
ahirn@37877
  1287
\> {\tt Correct:} the item is correct, or the precondition ({\tt Where}) is true\\
ahirn@37877
  1288
\> {\tt False:} the precondition ({\tt Where}) is false\\
ahirn@37877
  1289
\> {\tt Incompl:} the item is incomlete, or not yet input.\\
ahirn@37877
  1290
\end{tabbing}
ahirn@37877
  1291
ahirn@37877
  1292
ahirn@37877
  1293
ahirn@37877
  1294
\section{Refine a problem specification}
ahirn@37877
  1295
The challenge in constructing the problem hierarchy is, to design the branches in such a way, that problem refinement can be done automatically (as it is done in algebra system e.g. by a internal hierarchy of equations).
ahirn@37877
  1296
ahirn@37877
  1297
For this purpose the hierarchy must be built using the following rules: Let $F$ be a formalization and $P$ and $P_i,\:i=1\cdots n$ problem types, where the $P_i$ are specialized problem types w.r.t. $P$ (i.e. $P$ is a parent node of $P_i$), then
ahirn@37877
  1298
{\small
ahirn@37877
  1299
\begin{enumerate}
ahirn@37877
  1300
\item for all $F$ matching some $P_i$ must follow, that $F$ matches $P$
ahirn@37877
  1301
\item an $F$ matching $P$ should not have more than {\em one} $P_i,\:i=1\cdots n-1$ with $F$ matching $P_i$ (if there are more than one $P_i$, the first one will be taken)
ahirn@37877
  1302
\item for all $F$ matching some $P$ must follow, that $F$ matches $P_n$\\
ahirn@37877
  1303
\end{enumerate}}%small
ahirn@37877
  1304
\noindent Let us give an example for the point (1.) and (2.) first:
ahirn@37877
  1305
{\footnotesize\begin{verbatim}
ahirn@37877
  1306
   ML> refine;
ahirn@37877
  1307
   val it = fn : fmz -> pblID -> match list
ahirn@37877
  1308
   ML>
ahirn@37877
  1309
   ML> val fmz = ["equality (sqrt(#9+#4*x)=sqrt x + sqrt(#5+x))",
ahirn@37877
  1310
              "solveFor x","errorBound (eps=#0)",
ahirn@37877
  1311
              "solutions L"];
ahirn@37877
  1312
   ML>
ahirn@37877
  1313
   ML> refine fmz ["univariate","equation"];
ahirn@37877
  1314
   *** pass ["equation","univariate"]
ahirn@37877
  1315
   *** pass ["equation","univariate","linear"]
ahirn@37877
  1316
   *** pass ["equation","univariate","plain_square"]
ahirn@37877
  1317
   *** pass ["equation","univariate","polynomial"]
ahirn@37877
  1318
   *** pass ["equation","univariate","squareroot"]
ahirn@37877
  1319
   val it =
ahirn@37877
  1320
     [Matches
ahirn@37877
  1321
        (["univariate","equation"],
ahirn@37877
  1322
         {Find=[Correct "solutions L"],
ahirn@37877
  1323
          Given=[Correct "equality (sqrt (#9 + #4 * x) = sqrt x + sqrt (#5 + x))",
ahirn@37877
  1324
                 Correct "solveFor x",Superfl "errorBound (eps = #0)"],Relate=[],
ahirn@37877
  1325
          Where=[Correct
ahirn@37877
  1326
                   "matches (?a = ?b) (sqrt (#9 + #4 * x) = sqrt x + sqrt (#5 + x))"],
ahirn@37877
  1327
          With=[]}),
ahirn@37877
  1328
      NoMatch
ahirn@37877
  1329
        (["linear","univariate","equation"],
ahirn@37877
  1330
         {Find=[Correct "solutions L"],
ahirn@37877
  1331
          Given=[Correct "equality (sqrt (#9 + #4 * x) = sqrt x + sqrt (#5 + x))",
ahirn@37877
  1332
                 Correct "solveFor x",Superfl "errorBound (eps = #0)"],Relate=[],
ahirn@37877
  1333
          Where=[False "(?a + ?b * x = #0) (sqrt (#9 + #4 * x#"],
ahirn@37877
  1334
          With=[]}),
ahirn@37877
  1335
      NoMatch
ahirn@37877
  1336
        (["plain_square","univariate","equation"],
ahirn@37877
  1337
         {Find=[Correct "solutions L"],
ahirn@37877
  1338
          Given=[Correct "equality (sqrt (#9 + #4 * x) = sqrt x + sqrt (#5 + x))",
ahirn@37877
  1339
                 Correct "solveFor x",Superfl "errorBound (eps = #0)"],Relate=[],
ahirn@37877
  1340
          Where=[False
ahirn@37877
  1341
                   "matches (?a + ?b * x ^^^ #2 = #0)"],
ahirn@37877
  1342
          With=[]}),
ahirn@37877
  1343
      NoMatch
ahirn@37877
  1344
        (["polynomial","univariate","equation"],
ahirn@37877
  1345
         {Find=[Correct "solutions L"],
ahirn@37877
  1346
          Given=[Correct "equality (sqrt (#9 + #4 * x) = sqrt x + sqrt (#5 + x))",
ahirn@37877
  1347
                 Correct "solveFor x",Superfl "errorBound (eps = #0)"],Relate=[],
ahirn@37877
  1348
          Where=[False 
ahirn@37877
  1349
                 "is_polynomial_in sqrt (#9 + #4 * x) = sqrt x + sqrt (#5 + x) x"],
ahirn@37877
  1350
          With=[]}),
ahirn@37877
  1351
      Matches
ahirn@37877
  1352
        (["squareroot","univariate","equation"],
ahirn@37877
  1353
         {Find=[Correct "solutions L"],
ahirn@37877
  1354
          Given=[Correct "equality (sqrt (#9 + #4 * x) = sqrt x + sqrt (#5 + x))",
ahirn@37877
  1355
                 Correct "solveFor x",Correct "errorBound (eps = #0)"],Relate=[],
ahirn@37877
  1356
          Where=[Correct
ahirn@37877
  1357
                   "contains_root sqrt (#9 + #4 * x) = sqrt x + sqrt (#5 + x) "],
ahirn@37877
  1358
          With=[]})] : match list
ahirn@37877
  1359
\end{verbatim}}%size}%footnotesize\label{refine}
ahirn@37877
  1360
This example shows, that in order to refine an {\tt["univariate","equation"]}, the formalization must match respective respective problem type (rule (1.)) and one of the descendants which should match selectively (rule (2.)).
ahirn@37877
  1361
ahirn@37877
  1362
If no one of the descendants of {\tt["univariate","equation"]} match, rule (3.) comes into play: The {\em last} problem type on this level ($P_n$) provides for a special 'problem type' {\tt["normalize"]}. This node calls a method transforming the equation to a (or another) normal form, which then may match. Look at this example:
ahirn@37877
  1363
{\footnotesize\begin{verbatim}
ahirn@37877
  1364
   ML>  val fmz = ["equality (x+#1=#2)",
ahirn@37877
  1365
               "solveFor x","errorBound (eps=#0)",
ahirn@37877
  1366
               "solutions L"];
ahirn@37877
  1367
   [...]
ahirn@37877
  1368
   ML>
ahirn@37877
  1369
   ML>  refine fmz ["univariate","equation"];
ahirn@37877
  1370
   *** pass ["equation","univariate"]
ahirn@37877
  1371
   *** pass ["equation","univariate","linear"]
ahirn@37877
  1372
   *** pass ["equation","univariate","plain_square"]
ahirn@37877
  1373
   *** pass ["equation","univariate","polynomial"]
ahirn@37877
  1374
   *** pass ["equation","univariate","squareroot"]
ahirn@37877
  1375
   *** pass ["equation","univariate","normalize"]
ahirn@37877
  1376
   val it =
ahirn@37877
  1377
     [Matches
ahirn@37877
  1378
        (["univariate","equation"],
ahirn@37877
  1379
         {Find=[Correct "solutions L"],
ahirn@37877
  1380
          Given=[Correct "equality (x + #1 = #2)",Correct "solveFor x",
ahirn@37877
  1381
                 Superfl "errorBound (eps = #0)"],Relate=[],
ahirn@37877
  1382
          Where=[Correct "matches (?a = ?b) (x + #1 = #2)"],With=[]}),
ahirn@37877
  1383
      NoMatch
ahirn@37877
  1384
        (["linear","univariate","equation"],
ahirn@37877
  1385
   [...]
ahirn@37877
  1386
          With=[]}),
ahirn@37877
  1387
      NoMatch
ahirn@37877
  1388
        (["squareroot","univariate","equation"],
ahirn@37877
  1389
         {Find=[Correct "solutions L"],
ahirn@37877
  1390
          Given=[Correct "equality (x + #1 = #2)",Correct "solveFor x",
ahirn@37877
  1391
                 Correct "errorBound (eps = #0)"],Relate=[],
ahirn@37877
  1392
          Where=[False "contains_root x + #1 = #2 "],With=[]}),
ahirn@37877
  1393
      Matches
ahirn@37877
  1394
        (["normalize","univariate","equation"],
ahirn@37877
  1395
         {Find=[Correct "solutions L"],
ahirn@37877
  1396
          Given=[Correct "equality (x + #1 = #2)",Correct "solveFor x",
ahirn@37877
  1397
                 Superfl "errorBound (eps = #0)"],Relate=[],Where=[],With=[]})]
ahirn@37877
  1398
     : match list
ahirn@37877
  1399
\end{verbatim}}%size
ahirn@37877
  1400
The problem type $P_n$, {\tt["normalize","univariate","equation"]}, will transform the equation {\tt x + \#1 = \#2} to the normal form {\tt \#-1 + x = \#0}, which then will match {\tt["linear","univariate","equation"]}.
ahirn@37877
  1401
ahirn@37877
  1402
This recursive search on the problem hierarchy can be  done within a proof state. This leads to the next section.
ahirn@37877
  1403
ahirn@37877
  1404
ahirn@37877
  1405
\chapter{Methods}\label{met}
ahirn@37877
  1406
A problem type can have one ore more methods solving a respective problem. A method is described by means of another new program language. The language itself looks like a simple functional language, but constructs an imperative proof-state behind the scenes (thus liberating the programer from dealing with technical details and also prohibiting incorrect construction of the proof tree). The interpreter of 'scripts' written in this language evaluates the scriptexpressions, and also delivers certain parts of the script itself for discussion with the user.
ahirn@37877
  1407
ahirn@37877
  1408
\section{The scripts' syntax}
ahirn@37877
  1409
The syntax of scripts follows the definition given in Backus-normal-form:
ahirn@37877
  1410
{\it
ahirn@37877
  1411
\begin{tabbing}
ahirn@37877
  1412
123\=123\=expr ::=\=$|\;\;$\=\kill
ahirn@37877
  1413
\>script ::= {\tt Script} id arg$\,^*$ = body\\
ahirn@37877
  1414
\>\>arg ::= id $\;|\;\;($ ( id :: type ) $)$\\
ahirn@37877
  1415
\>\>body ::= expr\\
ahirn@37877
  1416
\>\>expr ::= \>\>{\tt let} id = expr $($ ; id = expr$)^*$ {\tt in} expr\\
ahirn@37877
  1417
\>\>\>$|\;$\>{\tt if} prop {\tt then} expr {\tt else} expr\\
ahirn@37877
  1418
\>\>\>$|\;$\>listexpr\\
ahirn@37877
  1419
\>\>\>$|\;$\>id\\
ahirn@37877
  1420
\>\>\>$|\;$\>seqex id\\
ahirn@37877
  1421
\>\>seqex ::= \>\>{\tt While} prop {\tt Do} seqex\\
ahirn@37877
  1422
\>\>\>$|\;$\>{\tt Repeat} seqex\\
ahirn@37877
  1423
\>\>\>$|\;$\>{\tt Try} seqex\\
ahirn@37877
  1424
\>\>\>$|\;$\>seqex {\tt Or} seqex\\
ahirn@37877
  1425
\>\>\>$|\;$\>seqex {\tt @@} seqex\\
ahirn@37877
  1426
\>\>\>$|\;$\>tac $($ id $|$ listexpr $)^*$\\
ahirn@37877
  1427
\>\>type ::= id\\
ahirn@37877
  1428
\>\>tac ::= id
ahirn@37877
  1429
\end{tabbing}}
ahirn@37877
  1430
where {\it id} is an identifier with the usual syntax, {\it prop} is a proposition constructed by Isabelles logical operators (see \cite{Isa-obj} {\tt [isabelle]/src/HOL/HOL.thy}), {\it listexpr} (called {\bf list-expression}) is constructed by Isabelles list functions like {\tt hd, tl, nth} described in {\tt [isabelle]/src/HOL/List.thy}, and {\it type} are (virtually) all types declared in Isabelles version 99.
ahirn@37877
  1431
ahirn@37877
  1432
Expressions containing some of the keywords {\tt let}, {\tt if} etc. are called {\bf script-expressions}.
ahirn@37877
  1433
ahirn@37877
  1434
Tactics {\it tac} are (curried) functions. For clarity and simplicity reasons, {\it listexpr} must not contain a {\it tac}, and {\it tac}s must not be nested,
ahirn@37877
  1435
ahirn@37877
  1436
ahirn@37877
  1437
\section{Control the flow of evaluation}
ahirn@37877
  1438
The flow of control is managed by the following script-expressions called {\it tacticals}.
ahirn@37877
  1439
\begin{description}
ahirn@37877
  1440
\item{{\tt while} prop {\tt Do} expr id} 
ahirn@37877
  1441
\item{{\tt if} prop {\tt then} expr {\tt else} expr}
ahirn@37877
  1442
\end{description}
ahirn@37877
  1443
While the the above script-expressions trigger the flow of control by evaluating the current formula, the other expressions depend on the applicability of the tactics within their respective subexpressions (which in turn depends on the proofstate)
ahirn@37877
  1444
\begin{description}
ahirn@37877
  1445
\item{{\tt Repeat} expr id}
ahirn@37877
  1446
\item{{\tt Try} expr id}
ahirn@37877
  1447
\item{expr {\tt Or} expr id}
ahirn@37877
  1448
\item{expr {\tt @@} expr id}
ahirn@37877
  1449
\end{description}
ahirn@37877
  1450
ahirn@37877
  1451
\begin{description}
ahirn@37877
  1452
\item xxx
ahirn@37877
  1453
ahirn@37877
  1454
\end{description}
ahirn@37877
  1455
ahirn@37877
  1456
\chapter{Do a calculational proof}
ahirn@37877
  1457
First we list all the tactics available so far (this list may be extended during further development of \isac).
ahirn@37877
  1458
ahirn@37877
  1459
\section{Tactics for doing steps in calculations}
ahirn@37877
  1460
\input{tactics}
ahirn@37877
  1461
ahirn@37877
  1462
\section{The functionality of the math engine}
ahirn@37877
  1463
A proof is being started in the math engine {\tt me} by the tactic
ahirn@37877
  1464
\footnote{In the present version a tactic is of type {\tt mstep}.}
ahirn@37877
  1465
 {\tt Init\_Proof}, and interactively promoted by other tactics. On input of each tactic the {\tt me} returns the resulting formula and the next tactic applicable. The proof is finished, when the {\tt me} proposes {\tt End\_Proof} as the next tactic.
ahirn@37877
  1466
ahirn@37877
  1467
We show a calculation (calculational proof) concerning equation solving, where the type of equation is refined automatically: The equation is given by the respective formalization ...
ahirn@37877
  1468
{\footnotesize\begin{verbatim}
ahirn@37877
  1469
   ML> val fmz = ["equality ((x+#1)*(x+#2)=x^^^#2+#8)","solveFor x",
ahirn@37877
  1470
                  "errorBound (eps=#0)","solutions L"];
ahirn@37877
  1471
   val fmz =
ahirn@37877
  1472
     ["equality ((x+#1)*(x+#2)=x^^^#2+#8)","solveFor x","errorBound (eps=#0)",
ahirn@37877
  1473
      "solutions L"] : string list
ahirn@37877
  1474
   ML>
ahirn@37877
  1475
   ML> val spec as (dom, pbt, met) = ("SqRoot.thy",["univariate","equation"],
ahirn@37877
  1476
                                 ("SqRoot.thy","no_met"));
ahirn@37877
  1477
   val dom = "SqRoot.thy" : string
ahirn@37877
  1478
   val pbt = ["univariate","equation"] : string list
ahirn@37877
  1479
   val met = ("SqRoot.thy","no_met") : string * string
ahirn@37877
  1480
\end{verbatim}}%size
ahirn@37877
  1481
... and the specification {\tt spec} of a domain {\tt dom}, a problem type {\tt pbt} and a method {\tt met}. Note that the equation is such, that it is not immediatly clear, what type it is in particular (it could be a polynomial of degree 2; but, for sure, the type is some specialized type of a univariate equation). Thus, no method ({\tt no\_met}) can be specified for solving the problem.
ahirn@37877
  1482
ahirn@37877
  1483
Nevertheless this specification is sufficient for automatically solving the equation --- the appropriate method will be found by refinement within the hierarchy of problem types.
ahirn@37877
  1484
ahirn@37877
  1485
ahirn@37877
  1486
\section{Initialize the calculation}
ahirn@37877
  1487
The start of a new proof requires the following initializations: The proof state is given by a proof tree {\tt ptree} and a position {\tt pos'}; both are empty at the beginning. The tactic {\tt Init\_Proof} is, like all other tactics, paired with an identifier of type {\tt string} for technical reasons.
ahirn@37877
  1488
{\footnotesize\begin{verbatim}
ahirn@37877
  1489
   ML>  val (mID,m) = ("Init_Proof",Init_Proof (fmz, (dom,pbt,met)));
ahirn@37877
  1490
   val mID = "Init_Proof" : string
ahirn@37877
  1491
   val m =
ahirn@37877
  1492
     Init_Proof
ahirn@37877
  1493
       (["equality ((x+#1)*(x+#2)=x^^^#2+#8)","solveFor x","errorBound (eps=#0)",
ahirn@37877
  1494
         "solutions L"],("SqRoot.thy",[#,#],(#,#))) : mstep
ahirn@37877
  1495
   ML>
ahirn@37877
  1496
   ML>  val (p,_,f,nxt,_,pt) = me (mID,m) e_pos' c EmptyPtree;
ahirn@37877
  1497
   val p = ([],Pbl) : pos'
ahirn@37877
  1498
   val f = Form' (PpcKF (0,EdUndef,0,Nundef,(#,#))) : mout
ahirn@37877
  1499
   val nxt = ("Refine_Tacitly",Refine_Tacitly ["univariate","equation"])
ahirn@37877
  1500
     : string * mstep
ahirn@37877
  1501
   val pt =
ahirn@37877
  1502
     Nd
ahirn@37877
  1503
       (PblObj
ahirn@37877
  1504
          {branch=#,cell=#,env=#,loc=#,meth=#,model=#,origin=#,ostate=#,probl=#,
ahirn@37877
  1505
           result=#,spec=#},[]) : ptree
ahirn@37877
  1506
   \end{verbatim}}%size
ahirn@37877
  1507
The mathematics engine {\tt me} returns the resulting formula {\tt f} of type {\tt mout} (which in this case is a problem), the next tactic {\tt nxt}, and a new proof state ({\tt ptree}, {\tt pos'}).
ahirn@37877
  1508
ahirn@37877
  1509
We can convince ourselves, that the problem is still empty, by increasing {\tt Compiler.Control.Print.printDepth}:
ahirn@37877
  1510
{\footnotesize\begin{verbatim}
ahirn@37877
  1511
   ML> Compiler.Control.Print.printDepth:=8; (*4 default*)
ahirn@37877
  1512
   val it = () : unit
ahirn@37877
  1513
   ML>
ahirn@37877
  1514
   ML> f;
ahirn@37877
  1515
   val it =
ahirn@37877
  1516
     Form'
ahirn@37877
  1517
       (PpcKF
ahirn@37877
  1518
          (0,EdUndef,0,Nundef,
ahirn@37877
  1519
           (Problem [],
ahirn@37877
  1520
            {Find=[Incompl "solutions []"],
ahirn@37877
  1521
             Given=[Incompl "equality",Incompl "solveFor"],Relate=[],
ahirn@37877
  1522
             Where=[False "matches (?a = ?b) e_"],With=[]}))) : mout
ahirn@37877
  1523
\end{verbatim}}%size
ahirn@37877
  1524
Recall, please, the format of a problem as presented in sect.\ref{pbl} on p.\pageref{pbl}; such an 'empty' problem can be found above encapsulated by several constructors containing additional data (necessary for the dialog guide, not relevant here).\\
ahirn@37877
  1525
ahirn@37877
  1526
{\it In the sequel we will omit output of the {\tt me} if it is not important for the respective context}.\\
ahirn@37877
  1527
ahirn@37877
  1528
In general, the dialog guide will hide the following two tactics {\tt Refine\_Tacitly} and {\tt Model\_Problem} from the user.
ahirn@37877
  1529
{\footnotesize\begin{verbatim}
ahirn@37877
  1530
   ML>  nxt;
ahirn@37877
  1531
   val it = ("Refine_Tacitly",Refine_Tacitly ["univariate","equation"])
ahirn@37877
  1532
     : string * mstep
ahirn@37877
  1533
   ML>
ahirn@37877
  1534
   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1535
   val nxt = ("Model_Problem",Model_Problem ["normalize","univariate","equation"])
ahirn@37877
  1536
     : string * mstep
ahirn@37877
  1537
   ML>
ahirn@37877
  1538
   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1539
\end{verbatim}}%size
ahirn@37877
  1540
ahirn@37877
  1541
ahirn@37877
  1542
\section{The phase of modeling} 
ahirn@37877
  1543
comprises the input of the items of the problem; the {\tt me} can help by use of the formalization tacitly transferred by {\tt Init\_Proof}. In particular, the {\tt me} in general 'knows' the next promising tactic; the first one has been returned by the (hidden) tactic {\tt Model\_Problem}.
ahirn@37877
  1544
ahirn@37877
  1545
{\footnotesize\begin{verbatim}
ahirn@37877
  1546
   ML>  nxt;
ahirn@37877
  1547
   val it =
ahirn@37877
  1548
     ("Add_Given",Add_Given "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)")
ahirn@37877
  1549
     : string * mstep
ahirn@37877
  1550
   ML>
ahirn@37877
  1551
   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1552
   val nxt = ("Add_Given",Add_Given "solveFor x") : string * mstep
ahirn@37877
  1553
   ML>
ahirn@37877
  1554
   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1555
   val nxt = ("Add_Find",Add_Find "solutions L") : string * mstep
ahirn@37877
  1556
   ML>
ahirn@37877
  1557
   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt; 
ahirn@37877
  1558
   val f = Form' (PpcKF (0,EdUndef,0,Nundef,(#,#))) : mout
ahirn@37877
  1559
\end{verbatim}}%size
ahirn@37877
  1560
\noindent Now the problem is 'modeled', all items are input. We convince ourselves by increasing {\tt Compiler.Control.Print.printDepth} once more.
ahirn@37877
  1561
{\footnotesize\begin{verbatim}
ahirn@37877
  1562
   ML>  Compiler.Control.Print.printDepth:=8;
ahirn@37877
  1563
   ML>  f;
ahirn@37877
  1564
   val it =
ahirn@37877
  1565
     Form'
ahirn@37877
  1566
       (PpcKF
ahirn@37877
  1567
          (0,EdUndef,0,Nundef,
ahirn@37877
  1568
           (Problem [],
ahirn@37877
  1569
            {Find=[Correct "solutions L"],
ahirn@37877
  1570
             Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
ahirn@37877
  1571
                    Correct "solveFor x"],Relate=[],Where=[],With=[]}))) : mout
ahirn@37877
  1572
\end{verbatim}}%size
ahirn@37877
  1573
%One of the input items is considered {\tt Superfluous} by the {\tt me} consulting the problem type {\tt ["univariate","equation"]}. The {\tt ErrorBound}, however, could become important in case the equation only could be solved by some iteration method.
ahirn@37877
  1574
ahirn@37877
  1575
\section{The phase of specification} 
ahirn@37877
  1576
This phase provides for explicit determination of the domain, the problem type, and the method to be used. In particular, the search for the appropriate problem type is being supported. There are two tactics for this purpose: {\tt Specify\_Problem} generates feedback on how a candidate of a problem type matches the current problem, and {\tt Refine\_Problem} provides help by the system, if the user gets lost.
ahirn@37877
  1577
{\footnotesize\begin{verbatim}
ahirn@37877
  1578
ML> nxt;
ahirn@37877
  1579
   val it = ("Specify_Domain",Specify_Domain "SqRoot.thy") : string * mstep
ahirn@37877
  1580
   ML>
ahirn@37877
  1581
   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1582
   val nxt =
ahirn@37877
  1583
     ("Specify_Problem",Specify_Problem ["normalize","univariate","equation"])
ahirn@37877
  1584
     : string * mstep
ahirn@37877
  1585
   val pt =
ahirn@37877
  1586
     Nd
ahirn@37877
  1587
       (PblObj
ahirn@37877
  1588
          {branch=#,cell=#,env=#,loc=#,meth=#,model=#,origin=#,ostate=#,probl=#,
ahirn@37877
  1589
              result=#,spec=#},[]) : ptree
ahirn@37877
  1590
\end{verbatim}}%size
ahirn@37877
  1591
The {\tt me} is smart enough to know the appropriate problem type (transferred tacitly with {\tt Init\_Proof}). In order to challenge the student, the dialog guide may hide this information; then the {\tt me} works as follows.
ahirn@37877
  1592
{\footnotesize\begin{verbatim}
ahirn@37877
  1593
   ML> val nxt = ("Specify_Problem",
ahirn@37877
  1594
               Specify_Problem ["polynomial","univariate","equation"]);
ahirn@37877
  1595
   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1596
   val f = Form' (PpcKF (0,EdUndef,0,Nundef,(#,#))) : mout
ahirn@37877
  1597
   val nxt =
ahirn@37877
  1598
     ("Refine_Problem",Refine_Problem ["normalize","univariate","equation"])
ahirn@37877
  1599
     : string * mstep
ahirn@37877
  1600
   ML>
ahirn@37877
  1601
   ML> val nxt = ("Specify_Problem",
ahirn@37877
  1602
               Specify_Problem ["linear","univariate","equation"]);
ahirn@37877
  1603
   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1604
   val f =
ahirn@37877
  1605
     Form'
ahirn@37877
  1606
       (PpcKF
ahirn@37877
  1607
          (0,EdUndef,0,Nundef,
ahirn@37877
  1608
           (Problem ["linear","univariate","equation"],
ahirn@37877
  1609
            {Find=[Correct "solutions L"],
ahirn@37877
  1610
             Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
ahirn@37877
  1611
                    Correct "solveFor x"],Relate=[],
ahirn@37877
  1612
             Where=[False
ahirn@37877
  1613
                    "matches (?a + ?b * x = #0) ((x + #1) * (x + #2) = x ^^^ #2 + #8)"],
ahirn@37877
  1614
             With=[]}))) : mout 
ahirn@37877
  1615
\end{verbatim}}%size
ahirn@37877
  1616
Again assuming that the dialog guide hide the next tactic proposed by the {\tt me}, and the student gets lost, {\tt Refine\_Problem} always 'knows' the way out, if applied to the problem type {\tt["univariate","equation"]}.
ahirn@37877
  1617
{\footnotesize\begin{verbatim}
ahirn@37877
  1618
   ML> val nxt = ("Refine_Problem",
ahirn@37877
  1619
                  Refine_Problem ["linear","univariate","equation
ahirn@37877
  1620
   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1621
   val f = Problems (RefinedKF [NoMatch #]) : mout
ahirn@37877
  1622
   ML>
ahirn@37877
  1623
   ML>  Compiler.Control.Print.printDepth:=9;f;Compiler.Control.Print.printDepth:=4;
ahirn@37877
  1624
   val f =
ahirn@37877
  1625
     Problems
ahirn@37877
  1626
       (RefinedKF
ahirn@37877
  1627
          [NoMatch
ahirn@37877
  1628
             (["linear","univariate","equation"],
ahirn@37877
  1629
              {Find=[Correct "solutions L"],
ahirn@37877
  1630
               Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
ahirn@37877
  1631
                      Correct "solveFor x"],Relate=[],
ahirn@37877
  1632
               Where=[False
ahirn@37877
  1633
                     "matches (?a + ?b * x = #0) ((x + #1) * (x + #2) = x ^^^ #2 + #8)"],
ahirn@37877
  1634
               With=[]})]) : mout
ahirn@37877
  1635
   ML>
ahirn@37877
  1636
   ML> val nxt = ("Refine_Problem",Refine_Problem ["univariate","equation"]);
ahirn@37877
  1637
   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1638
   val f =
ahirn@37877
  1639
     Problems
ahirn@37877
  1640
       (RefinedKF [Matches #,NoMatch #,NoMatch #,NoMatch #,NoMatch #,Matches #])
ahirn@37877
  1641
     : mout
ahirn@37877
  1642
   ML>
ahirn@37877
  1643
   ML>
ahirn@37877
  1644
   ML>  Compiler.Control.Print.printDepth:=9;f;Compiler.Control.Print.printDepth:=4;
ahirn@37877
  1645
   val f =
ahirn@37877
  1646
     Problems
ahirn@37877
  1647
       (RefinedKF
ahirn@37877
  1648
          [Matches
ahirn@37877
  1649
             (["univariate","equation"],
ahirn@37877
  1650
              {Find=[Correct "solutions L"],
ahirn@37877
  1651
               Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
ahirn@37877
  1652
                      Correct "solveFor x"],Relate=[],
ahirn@37877
  1653
               Where=[Correct
ahirn@37877
  1654
               With=[]}),
ahirn@37877
  1655
           NoMatch
ahirn@37877
  1656
             (["linear","univariate","equation"],
ahirn@37877
  1657
              {Find=[Correct "solutions L"],
ahirn@37877
  1658
               Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
ahirn@37877
  1659
                      Correct "solveFor x"],Relate=[],
ahirn@37877
  1660
               Where=[False
ahirn@37877
  1661
                      "matches (?a + ?b * x = #0) ((x + #1) * (x + #2) = x ^^^ #2 + #8)"],
ahirn@37877
  1662
                  With=[]}),
ahirn@37877
  1663
           NoMatch
ahirn@37877
  1664
             ...
ahirn@37877
  1665
             ...   
ahirn@37877
  1666
           Matches
ahirn@37877
  1667
             (["normalize","univariate","equation"],
ahirn@37877
  1668
              {Find=[Correct "solutions L"],
ahirn@37877
  1669
               Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
ahirn@37877
  1670
                      Correct "solveFor x"],Relate=[],Where=[],With=[]})]) : mout
ahirn@37877
  1671
\end{verbatim}}%size
ahirn@37877
  1672
The tactic {\tt Refine\_Problem} returns all matches to problem types along the path traced in the problem hierarchy (anlogously to the authoring tool for refinement in sect.\ref{refine} on p.\pageref{refine}) --- a lot of information to be displayed appropriately in the hiearchy browser~!
ahirn@37877
  1673
ahirn@37877
  1674
\section{The phase of solving} 
ahirn@37877
  1675
This phase starts by invoking a method, which acchieves the normal form within two tactics, {\tt Rewrite rnorm\_equation\_add} and {\tt Rewrite\_Set SqRoot\_simplify}:
ahirn@37877
  1676
{\footnotesize\begin{verbatim} 
ahirn@37877
  1677
   ML> nxt;
ahirn@37877
  1678
   val it = ("Apply_Method",Apply_Method ("SqRoot.thy","norm_univar_equation"))
ahirn@37877
  1679
     : string * mstep
ahirn@37877
  1680
   ML>
ahirn@37877
  1681
   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1682
   val f =
ahirn@37877
  1683
     Form' (FormKF (~1,EdUndef,1,Nundef,"(x + #1) * (x + #2) = x ^^^ #2 + #8"))
ahirn@37877
  1684
   val nxt =
ahirn@37877
  1685
     ("Rewrite", Rewrite
ahirn@37877
  1686
        ("rnorm_equation_add","~ ?b =!= #0 ==> (?a = ?b) = (?a + #-1 * ?b = #0)"))
ahirn@37877
  1687
   ML>
ahirn@37877
  1688
   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1689
   val f =
ahirn@37877
  1690
     Form' (FormKF (~1,EdUndef,1,Nundef,
ahirn@37877
  1691
           "(x + #1) * (x + #2) + #-1 * (x ^^^ #2 + #8) = #0")) : mout
ahirn@37877
  1692
   val nxt = ("Rewrite_Set",Rewrite_Set "SqRoot_simplify") : string * mstep
ahirn@37877
  1693
   ML>
ahirn@37877
  1694
   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1695
   val f = Form' (FormKF (~1,EdUndef,1,Nundef,"#-6 + #3 * x = #0")) : mout
ahirn@37877
  1696
   val nxt = ("Subproblem",Subproblem ("SqRoot.thy",[#,#])) : string * mstep
ahirn@37877
  1697
\end{verbatim}}%size
ahirn@37877
  1698
Now the normal form {\tt \#-6 + \#3 * x = \#0} is the input to a subproblem, which again allows for specification of the type of equation, and the respective method:
ahirn@37877
  1699
{\footnotesize\begin{verbatim}
ahirn@37877
  1700
   ML> nxt;
ahirn@37877
  1701
   val it = ("Subproblem",Subproblem ("SqRoot.thy",["univariate","equation"]))
ahirn@37877
  1702
   ML>   
ahirn@37877
  1703
   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1704
   val f =
ahirn@37877
  1705
     Form' (FormKF
ahirn@37877
  1706
          (~1,EdUndef,1,Nundef,"Subproblem (SqRoot.thy, [univariate, equation])"))
ahirn@37877
  1707
     : mout
ahirn@37877
  1708
   val nxt = ("Refine_Tacitly",Refine_Tacitly ["univariate","equation"])
ahirn@37877
  1709
   ML>
ahirn@37877
  1710
   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1711
   val nxt = ("Model_Problem",Model_Problem ["linear","univariate","equation"])
ahirn@37877
  1712
\end{verbatim}}%size
ahirn@37877
  1713
As required, the tactic {\tt Refine ["univariate","equation"]} selects the appropriate type of equation from the problem hierarchy, which can be seen by the tactic {\tt Model\_Problem ["linear","univariate","equation"]} prosed by the system.
ahirn@37877
  1714
ahirn@37877
  1715
Again the whole phase of modeling and specification follows; we skip it here, and \isac's dialog guide may decide to do so as well.
ahirn@37877
  1716
ahirn@37877
  1717
ahirn@37877
  1718
\section{The final phase: check the post-condition}
ahirn@37877
  1719
The type of problems solved by \isac{} are so-called 'example construction problems' as shown above. The most characteristic point of such a problem is the post-condition. The handling of the post-condition in the given context is an open research question.
ahirn@37877
  1720
ahirn@37877
  1721
Thus the post-condition is just mentioned, in our example for both, the problem and the subproblem:
ahirn@37877
  1722
{\footnotesize\begin{verbatim}
ahirn@37877
  1723
   ML> nxt;
ahirn@37877
  1724
   val it = ("Check_Postcond",Check_Postcond ["linear","univariate","equation"])
ahirn@37877
  1725
   ML>
ahirn@37877
  1726
   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1727
   val f = Form' (FormKF (~1,EdUndef,1,Nundef,"[x = #2]")) : mout
ahirn@37877
  1728
   val nxt =
ahirn@37877
  1729
     ("Check_Postcond",Check_Postcond ["normalize","univariate","equation"])
ahirn@37877
  1730
   ML>
ahirn@37877
  1731
   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
ahirn@37877
  1732
   val f = Form' (FormKF (~1,EdUndef,0,Nundef,"[x = #2]")) : mout
ahirn@37877
  1733
   val nxt = ("End_Proof'",End_Proof') : string * mstep
ahirn@37877
  1734
\end{verbatim}}%size
ahirn@37877
  1735
The next tactic proposed by the system, {\tt End\_Proof'} indicates that the proof has finished successfully.\\
ahirn@37877
  1736
ahirn@37877
  1737
{\it The tactics proposed by the system need {\em not} be followed by the user; the user is free to choose other tactics, and the system will report, if this is applicable at the respective proof state, or not~! The reader may try out~!}
ahirn@37877
  1738
ahirn@37877
  1739
ahirn@37877
  1740
ahirn@37877
  1741
\part{Systematic description}
ahirn@37877
  1742
ahirn@37877
  1743
ahirn@37877
  1744
\chapter{The structure of the knowledge base}
ahirn@37877
  1745
ahirn@37877
  1746
\section{Tactics and data}
ahirn@37877
  1747
First we view the ME from outside, i.e. we regard tactics and relate them to the knowledge base (KB). W.r.t. the KB we address the atomic items which have to be implemented in detail by the authors of the KB
ahirn@37877
  1748
\footnote{Some of these items are fetched by the tactics from intermediate storage within the ME, and not directly from the KB.}
ahirn@37877
  1749
. The items are listed in alphabetical order in Tab.\ref{kb-items} on p.\pageref{kb-items}.
ahirn@37877
  1750
{\begin{table}[h]
ahirn@37877
  1751
\caption{Atomic items of the KB} \label{kb-items}
ahirn@37877
  1752
%\tabcolsep=0.3mm
ahirn@37877
  1753
\begin{center}
ahirn@37877
  1754
\def\arraystretch{1.0}
ahirn@37877
  1755
\begin{tabular}{lp{9.0cm}}
ahirn@37877
  1756
abbrevation & description \\
ahirn@37877
  1757
\hline
ahirn@37877
  1758
&\\
ahirn@37877
  1759
{\it calc\_list}
ahirn@37877
  1760
& associationlist of the evaluation-functions {\it eval\_fn}\\
ahirn@37877
  1761
{\it eval\_fn}
ahirn@37877
  1762
& evaluation-function for numerals and for predicates coded in SML\\
ahirn@37877
  1763
{\it eval\_rls   }
ahirn@37877
  1764
& ruleset {\it rls} for simplifying expressions with {\it eval\_fn}s\\
ahirn@37877
  1765
{\it fmz}
ahirn@37877
  1766
& formalization, i.e. a minimal formula representation of an example \\
ahirn@37877
  1767
{\it met}
ahirn@37877
  1768
& a method, i.e. a datastructure holding all informations for the solving phase ({\it rew\_ord}, {\it scr}, etc.)\\
ahirn@37877
  1769
{\it metID}
ahirn@37877
  1770
& reference to a {\it met}\\
ahirn@37877
  1771
{\it op}
ahirn@37877
  1772
& operator as key to an {\it eval\_fn} in a {\it calc\_list}\\
ahirn@37877
  1773
{\it pbl}
ahirn@37877
  1774
& problem, i.e. a node in the problem-hierarchy\\
ahirn@37877
  1775
{\it pblID}
ahirn@37877
  1776
& reference to a {\it pbl}\\
ahirn@37877
  1777
{\it rew\_ord}
ahirn@37877
  1778
& rewrite-order\\
ahirn@37877
  1779
{\it rls}
ahirn@37877
  1780
& ruleset, i.e. a datastructure holding theorems {\it thm} and operators {\it op} for simplification (with a {\it rew\_ord})\\
ahirn@37877
  1781
{\it Rrls}
ahirn@37877
  1782
& ruleset for 'reverse rewriting' (an \isac-technique generating stepwise rewriting, e.g. for cancelling fractions)\\
ahirn@37877
  1783
{\it scr}
ahirn@37877
  1784
& script describing algorithms by tactics, part of a {\it met} \\
ahirn@37877
  1785
{\it norm\_rls}
ahirn@37877
  1786
& special ruleset calculating a normalform, associated with a {\it thy}\\
ahirn@37877
  1787
{\it spec}
ahirn@37877
  1788
& specification, i.e. a tripel ({\it thyID, pblID, metID})\\
ahirn@37877
  1789
{\it subs}
ahirn@37877
  1790
& substitution, i.e. a list of variable-value-pairs\\
ahirn@37877
  1791
{\it term}
ahirn@37877
  1792
& Isabelle term, i.e. a formula\\
ahirn@37877
  1793
{\it thm}
ahirn@37877
  1794
& theorem\\     
ahirn@37877
  1795
{\it thy}
ahirn@37877
  1796
& theory\\
ahirn@37877
  1797
{\it thyID}
ahirn@37877
  1798
& reference to a {\it thy} \\
ahirn@37877
  1799
\end{tabular}\end{center}\end{table}
ahirn@37877
  1800
}
ahirn@37877
  1801
The relations between tactics and data items are shown in Tab.\ref{tac-kb}on p.\pageref{tac-kb}.
ahirn@37877
  1802
{\def\arraystretch{1.2}
ahirn@37877
  1803
\begin{table}[h]
ahirn@37877
  1804
\caption{Which tactic uses which KB's item~?} \label{tac-kb}
ahirn@37877
  1805
\tabcolsep=0.3mm
ahirn@37877
  1806
\begin{center}
ahirn@37877
  1807
\begin{tabular}{|ll||cccc|ccc|cccc|} \hline
ahirn@37877
  1808
tactic  &input &    &    &    &norm\_&   &rew\_&rls &eval\_&eval\_&calc\_&   \\
ahirn@37877
  1809
        &      &thy &scr &Rrls&rls  &thm &ord  &Rrls&fn    &rls   &list  &dsc\\
ahirn@37877
  1810
\hline\hline
ahirn@37877
  1811
Init\_Proof
ahirn@37877
  1812
        &fmz   & x  &    &    & x   &    &     &    &      &      &      & x \\
ahirn@37877
  1813
        &spec  &    &    &    &     &    &     &    &      &      &      &   \\
ahirn@37877
  1814
\hline
ahirn@37877
  1815
\multicolumn{13}{|l|}{model phase}\\
ahirn@37877
  1816
\hline
ahirn@37877
  1817
Add\_*  &term  & x  &    &    & x   &    &     &    &      &      &      & x \\
ahirn@37877
  1818
FormFK  &model & x  &    &    & x   &    &     &    &      &      &      & x \\
ahirn@37877
  1819
\hline
ahirn@37877
  1820
\multicolumn{13}{|l|}{specify phase}\\
ahirn@37877
  1821
\hline
ahirn@37877
  1822
Specify\_Theory 
ahirn@37877
  1823
        &thyID & x  &    &    & x   &    &     &    & x    & x    &      & x \\
ahirn@37877
  1824
Specify\_Problem 
ahirn@37877
  1825
        &pblID & x  &    &    & x   &    &     &    & x    & x    &      & x \\
ahirn@37877
  1826
Refine\_Problem 
ahirn@37877
  1827
           &pblID & x  &    &    & x   &    &     &    & x    & x    &      & x \\
ahirn@37877
  1828
Specify\_Method 
ahirn@37877
  1829
        &metID & x  &    &    & x   &    &     &    & x    & x    &      & x \\
ahirn@37877
  1830
Apply\_Method 
ahirn@37877
  1831
        &metID & x  & x  &    & x   &    &     &    & x    & x    &      & x \\
ahirn@37877
  1832
\hline
ahirn@37877
  1833
\multicolumn{13}{|l|}{solve phase}\\
ahirn@37877
  1834
\hline
ahirn@37877
  1835
Rewrite,\_Inst 
ahirn@37877
  1836
        &thm   & x  & x  &    &     & x  &met  &    & x    &met   &      &   \\
ahirn@37877
  1837
Rewrite, Detail
ahirn@37877
  1838
        &thm   & x  & x  &    &     & x  &rls  &    & x    &rls   &      &   \\
ahirn@37877
  1839
Rewrite, Detail
ahirn@37877
  1840
        &thm   & x  & x  &    &     & x  &Rrls &    & x    &Rrls  &      &   \\
ahirn@37877
  1841
Rewrite\_Set,\_Inst
ahirn@37877
  1842
        &rls   & x  & x  &    &     &    &     & x  & x    & x    &      &   \\
ahirn@37877
  1843
Calculate  
ahirn@37877
  1844
        &op    & x  & x  &    &     &    &     &    &      &      & x    &   \\
ahirn@37877
  1845
Substitute 
ahirn@37877
  1846
        &subs  & x  &    &    & x   &    &     &    &      &      &      &   \\
ahirn@37877
  1847
        &      &    &    &    &     &    &     &    &      &      &      &   \\
ahirn@37877
  1848
SubProblem 
ahirn@37877
  1849
        &spec  & x  & x  &    & x   &    &     &    & x    & x    &      & x \\
ahirn@37877
  1850
        &fmz   &    &    &    &     &    &     &    &      &      &      &   \\
ahirn@37877
  1851
\hline
ahirn@37877
  1852
\end{tabular}\end{center}\end{table}
ahirn@37877
  1853
}
ahirn@37877
  1854
ahirn@37877
  1855
\section{\isac's theories}
ahirn@37877
  1856
\isac's theories build upon Isabelles theories for high-order-logic (HOL) up to the respective development of real numbers ({\tt HOL/Real}). Theories have a special format defined in \cite{Isa-ref} and the suffix {\tt *.thy}; usually theories are paired with SML-files having the same filename and the suffix {\tt *.ML}.
ahirn@37877
  1857
ahirn@37877
  1858
\isac's theories represent the deductive part of \isac's knowledge base, the hierarchy of theories is structured accordingly. The {\tt *.ML}-files, however, contain {\em all} data of the other two axes of the knowledge base, the problems and the methods (without presenting their respective structure, which is done by the problem browser and the method browser, see \ref{pbt}).
ahirn@37877
  1859
ahirn@37877
  1860
Tab.\ref{theories} on p.\pageref{theories} lists the basic theories planned to be implemented in version \isac.1. We expext the list to be expanded in the near future, actually, have a look to the theory browser~!
ahirn@37877
  1861
ahirn@37877
  1862
The first three theories in the list do {\em not} belong to \isac's knowledge base; they are concerned with \isac's script-language for methods and listed here for completeness.
ahirn@37877
  1863
{\begin{table}[h]
ahirn@37877
  1864
\caption{Theories in \isac-version I} \label{theories}
ahirn@37877
  1865
%\tabcolsep=0.3mm
ahirn@37877
  1866
\begin{center}
ahirn@37877
  1867
\def\arraystretch{1.0}
ahirn@37877
  1868
\begin{tabular}{lp{9.0cm}}
ahirn@37877
  1869
theory & description \\
ahirn@37877
  1870
\hline
ahirn@37877
  1871
&\\
ahirn@37877
  1872
ListI.thy
ahirn@37877
  1873
& assigns identifiers to the functions defined in {\tt Isabelle2002/src/HOL/List.thy} and (intermediatly~?) defines some more list functions\\
ahirn@37877
  1874
ListI.ML
ahirn@37877
  1875
& {\tt eval\_fn} for the additional list functions\\
ahirn@37877
  1876
Tools.thy
ahirn@37877
  1877
& functions required for the evaluation of scripts\\
ahirn@37877
  1878
Tools.ML
ahirn@37877
  1879
& the respective {\tt eval\_fn}s\\
ahirn@37877
  1880
Script.thy
ahirn@37877
  1881
& prerequisites for scripts: types, tactics, tacticals,\\
ahirn@37877
  1882
Script.ML
ahirn@37877
  1883
& sets of tactics and functions for internal use\\
ahirn@37877
  1884
& \\
ahirn@37877
  1885
\hline
ahirn@37877
  1886
& \\
ahirn@37877
  1887
Typefix.thy
ahirn@37877
  1888
& an intermediate hack for escaping type errors\\
ahirn@37877
  1889
Descript.thy
ahirn@37877
  1890
& {\it description}s for the formulas in {\it model}s and {\it problem}s\\
ahirn@37877
  1891
Atools
ahirn@37877
  1892
& (re-)definition of operators; general predicates and functions for preconditions; theorems for the {\tt eval\_rls}\\
ahirn@37877
  1893
Float
ahirn@37877
  1894
& floating point numerals\\
ahirn@37877
  1895
Equation
ahirn@37877
  1896
& basic notions for equations and equational systems\\
ahirn@37877
  1897
Poly
ahirn@37877
  1898
& polynomials\\
ahirn@37877
  1899
PolyEq
ahirn@37877
  1900
& polynomial equations and equational systems \\
ahirn@37877
  1901
Rational.thy
ahirn@37877
  1902
& additional theorems for rationals\\
ahirn@37877
  1903
Rational.ML
ahirn@37877
  1904
& cancel, add and simplify rationals using (a generalization of) Euclids algorithm; respective reverse rulesets\\
ahirn@37877
  1905
RatEq
ahirn@37877
  1906
& equations on rationals\\
ahirn@37877
  1907
Root
ahirn@37877
  1908
& radicals; calculate normalform; respective reverse rulesets\\
ahirn@37877
  1909
RootEq
ahirn@37877
  1910
& equations on roots\\
ahirn@37877
  1911
RatRootEq
ahirn@37877
  1912
& equations on rationals and roots (i.e. on terms containing both operations)\\
ahirn@37877
  1913
Vect
ahirn@37877
  1914
& vector analysis\\
ahirn@37877
  1915
Trig
ahirn@37877
  1916
& trigonometriy\\
ahirn@37877
  1917
LogExp
ahirn@37877
  1918
& logarithms and exponential functions\\
ahirn@37877
  1919
Calculus
ahirn@37877
  1920
& nonstandard analysis\\
ahirn@37877
  1921
Diff
ahirn@37877
  1922
& differentiation\\
ahirn@37877
  1923
DiffApp
ahirn@37877
  1924
& applications of differentiaten (maxima-minima-problems)\\
ahirn@37877
  1925
Test
ahirn@37877
  1926
& (old) data for the test suite\\
ahirn@37877
  1927
Isac
ahirn@37877
  1928
& collects all \isac-theoris.\\
ahirn@37877
  1929
\end{tabular}\end{center}\end{table}
ahirn@37877
  1930
}
ahirn@37877
  1931
ahirn@37877
  1932
ahirn@37877
  1933
\section{Data in {\tt *.thy}- and {\tt *.ML}-files}
ahirn@37877
  1934
As already mentioned, theories come in pairs of {\tt *.thy}- and {\tt *.ML}-files with the same respective filename. How data are distributed between the two files is shown in Tab.\ref{thy-ML} on p.\pageref{thy-ML}.
ahirn@37877
  1935
{\begin{table}[h]
ahirn@37877
  1936
\caption{Data in {\tt *.thy}- and {\tt *.ML}-files} \label{thy-ML}
ahirn@37877
  1937
\tabcolsep=2.0mm
ahirn@37877
  1938
\begin{center}
ahirn@37877
  1939
\def\arraystretch{1.0}
ahirn@37877
  1940
\begin{tabular}{llp{7.7cm}}
ahirn@37877
  1941
file & data & description \\
ahirn@37877
  1942
\hline
ahirn@37877
  1943
& &\\
ahirn@37877
  1944
{\tt *.thy}
ahirn@37877
  1945
& consts 
ahirn@37877
  1946
& operators, predicates, functions, script-names ('{\tt Script} name \dots{\tt arguments}')
ahirn@37877
  1947
\\
ahirn@37877
  1948
& rules  
ahirn@37877
  1949
& theorems: \isac{} uses Isabelles theorems if possible; additional theorems analoguous to such existing in Isabelle get the Isabelle-identifier attached an {\it I}
ahirn@37877
  1950
\\& &\\
ahirn@37877
  1951
{\tt *.ML}
ahirn@37877
  1952
& {\tt theory' :=} 
ahirn@37877
  1953
& the theory defined by the actual {\tt *.thy}-file is made accessible to \isac
ahirn@37877
  1954
\\
ahirn@37877
  1955
& {\tt eval\_fn}
ahirn@37877
  1956
& evaluation function for operators and predicates, coded on the meta-level (SML); the identifier of such a function is a combination of the keyword {\tt eval\_} with the identifier of the function as defined in {\tt *.thy}
ahirn@37877
  1957
\\
ahirn@37877
  1958
& {\tt *\_simplify} 
ahirn@37877
  1959
& the canonical simplifier for the actual theory, i.e. the identifier for this ruleset is a combination of the theories identifier and the keyword {\tt *\_simplify}
ahirn@37877
  1960
\\
ahirn@37877
  1961
& {\tt norm\_rls :=}
ahirn@37877
  1962
& the canonical simplifier {\tt *\_simplify} is stored such that it is accessible for \isac
ahirn@37877
  1963
\\
ahirn@37877
  1964
& {\tt rew\_ord' :=}
ahirn@37877
  1965
& the same for rewrite orders, if needed outside of one particular ruleset
ahirn@37877
  1966
\\
ahirn@37877
  1967
& {\tt ruleset' :=}
ahirn@37877
  1968
& the same for rulesets (ordinary rulesets, reverse rulesets and {\tt eval\_rls})
ahirn@37877
  1969
\\
ahirn@37877
  1970
& {\tt calc\_list :=}
ahirn@37877
  1971
& the same for {\tt eval\_fn}s, if needed outside of one particular ruleset (e.g. for a tactic {\tt Calculate} in a script)
ahirn@37877
  1972
\\
ahirn@37877
  1973
& {\tt store\_pbl}
ahirn@37877
  1974
& problems defined within this {\tt *.ML}-file are made accessible for \isac
ahirn@37877
  1975
\\
ahirn@37877
  1976
& {\tt methods :=}
ahirn@37877
  1977
& methods defined within this {\tt *.ML}-file are made accessible for \isac
ahirn@37877
  1978
\\
ahirn@37877
  1979
\end{tabular}\end{center}\end{table}
ahirn@37877
  1980
}
ahirn@37877
  1981
The order of the data-items within the theories should adhere to the order given in this list.
ahirn@37877
  1982
ahirn@37877
  1983
\section{Formal description of the problem-hierarchy}
ahirn@37877
  1984
%for Richard Lang
ahirn@37877
  1985
ahirn@37877
  1986
\section{Script tactics}
ahirn@37877
  1987
The tactics actually promote the calculation: they construct the prooftree behind the scenes, and they are the points during evaluation where the script-interpreter transfers control to the user. Here we only describe the sytax of the tactics; the semantics is described on p.\pageref{user-tactics} below in context with the tactics the student uses ('user-tactics'): there is a 1-to-1 correspondence between user-tactics and script-tactics.
ahirn@37877
  1988
ahirn@37877
  1989
ahirn@37877
  1990
ahirn@37877
  1991
ahirn@37877
  1992
ahirn@37877
  1993
\part{Authoring on the knowledge}
ahirn@37877
  1994
ahirn@37877
  1995
ahirn@37877
  1996
\section{Add a theorem}
ahirn@37877
  1997
\section{Define and add a problem}
ahirn@37877
  1998
\section{Define and add a predicate}
ahirn@37877
  1999
\section{Define and add a method}
ahirn@37877
  2000
\section{}
ahirn@37877
  2001
\section{}
ahirn@37877
  2002
\section{}
ahirn@37877
  2003
\section{}
ahirn@37877
  2004
ahirn@37877
  2005
ahirn@37877
  2006
ahirn@37877
  2007
\newpage
ahirn@37877
  2008
\bibliography{bib/isac,bib/from-theses}
ahirn@37877
  2009
ahirn@37877
  2010
\end{document}