diff -r 5f00958e3c7b -r 1d1e4cda8c54 ProgTutorial/Essential.thy --- a/ProgTutorial/Essential.thy Thu Feb 11 10:44:50 2010 +0100 +++ b/ProgTutorial/Essential.thy Sun Mar 07 21:15:05 2010 +0100 @@ -39,7 +39,7 @@ @{ML_response [display,gray] "@{term \"(a::nat) + b = c\"}" "Const (\"op =\", \) $ - (Const (\"Algebras.plus_class.plus\", \) $ \ $ \) $ \"} + (Const (\"Groups.plus_class.plus\", \) $ \ $ \) $ \"} constructs the term @{term "(a::nat) + b = c"}. The resulting term is printed using the internal representation corresponding to the datatype @{ML_type_ind "term"}, @@ -533,8 +533,8 @@ \mbox{@{text "(op *)"}}: @{ML_response [display,gray] "(@{term \"0::nat\"}, @{term \"(op *)\"})" - "(Const (\"Algebras.zero_class.zero\", \), - Const (\"Algebras.times_class.times\", \))"} + "(Const (\"Groups.zero_class.zero\", \), + Const (\"Groups.times_class.times\", \))"} While you could use the complete name, for example @{ML "Const (\"List.list.Nil\", some_type)" for some_type}, for referring to or @@ -770,6 +770,9 @@ assumption about the sorts, they are incomparable. *} +class s1 +class s2 + ML{*val (tyenv, index) = let val ty1 = @{typ_pat "?'a::s1"} val ty2 = @{typ_pat "?'b::s2"} @@ -1639,26 +1642,26 @@ stated using object logic connectives, while theorems using the connectives from the meta logic are more convenient for reasoning. Therefore there are some build in functions which help with these transformations. The function - @{ML_ind rulify in ObjectLogic} + @{ML_ind rulify in Object_Logic} replaces all object connectives by equivalents in the meta logic. For example @{ML_response_fake [display, gray] - "ObjectLogic.rulify @{thm foo_test2}" + "Object_Logic.rulify @{thm foo_test2}" "\?A; ?B\ \ ?C"} The transformation in the other direction can be achieved with function - @{ML_ind atomize in ObjectLogic} and the following code. + @{ML_ind atomize in Object_Logic} and the following code. @{ML_response_fake [display,gray] "let val thm = @{thm foo_test1} - val meta_eq = ObjectLogic.atomize (cprop_of thm) + val meta_eq = Object_Logic.atomize (cprop_of thm) in MetaSimplifier.rewrite_rule [meta_eq] thm end" "?A \ ?B \ ?C"} - In this code the function @{ML atomize in ObjectLogic} produces + In this code the function @{ML atomize in Object_Logic} produces a meta-equation between the given theorem and the theorem transformed into the object logic. The result is the theorem with object logic connectives. However, in order to completely transform a theorem @@ -1676,7 +1679,7 @@ ML{*fun atomize_thm thm = let val thm' = forall_intr_vars thm - val thm'' = ObjectLogic.atomize (cprop_of thm') + val thm'' = Object_Logic.atomize (cprop_of thm') in MetaSimplifier.rewrite_rule [thm''] thm' end*} @@ -1688,8 +1691,6 @@ "atomize_thm @{thm list.induct}" "\P list. P [] \ (\a list. P list \ P (a # list)) \ P list"} - \footnote{\bf FIXME: say someting about @{ML_ind standard in Drule}.} - Theorems can also be produced from terms by giving an explicit proof. One way to achieve this is by using the function @{ML_ind prove in Goal} in the structure @{ML_struct Goal}. For example below we use this function