QuotTest.thy
changeset 163 3da18bf6886c
child 177 bdfe4388955d
equal deleted inserted replaced
162:20f0b148cfe2 163:3da18bf6886c
       
     1 theory QuotTest
       
     2 imports QuotMain
       
     3 begin
       
     4 
       
     5 section {* various tests for quotient types*}
       
     6 datatype trm =
       
     7   var  "nat"
       
     8 | app  "trm" "trm"
       
     9 | lam  "nat" "trm"
       
    10 
       
    11 axiomatization
       
    12   RR :: "trm ⇒ trm ⇒ bool"
       
    13 where
       
    14   r_eq: "EQUIV RR"
       
    15 
       
    16 ML {* print_quotdata @{context} *}
       
    17 
       
    18 quotient qtrm = trm / "RR"
       
    19   apply(rule r_eq)
       
    20   done
       
    21 
       
    22 ML {* print_quotdata @{context} *}
       
    23 
       
    24 typ qtrm
       
    25 term Rep_qtrm
       
    26 term REP_qtrm
       
    27 term Abs_qtrm
       
    28 term ABS_qtrm
       
    29 thm QUOT_TYPE_qtrm
       
    30 thm QUOTIENT_qtrm
       
    31 thm REP_qtrm_def
       
    32 
       
    33 (* Test interpretation *)
       
    34 thm QUOT_TYPE_I_qtrm.thm11
       
    35 thm QUOT_TYPE.thm11
       
    36 
       
    37 print_theorems
       
    38 
       
    39 thm Rep_qtrm
       
    40 
       
    41 text {* another test *}
       
    42 datatype 'a trm' =
       
    43   var'  "'a"
       
    44 | app'  "'a trm'" "'a trm'"
       
    45 | lam'  "'a" "'a trm'"
       
    46 
       
    47 consts R' :: "'a trm' ⇒ 'a trm' ⇒ bool"
       
    48 axioms r_eq': "EQUIV R'"
       
    49 
       
    50 quotient qtrm' = "'a trm'" / "R'"
       
    51   apply(rule r_eq')
       
    52   done
       
    53 
       
    54 print_theorems
       
    55 
       
    56 term ABS_qtrm'
       
    57 term REP_qtrm'
       
    58 thm QUOT_TYPE_qtrm'
       
    59 thm QUOTIENT_qtrm'
       
    60 thm Rep_qtrm'
       
    61 
       
    62 
       
    63 text {* a test with lists of terms *}
       
    64 datatype t =
       
    65   vr "string"
       
    66 | ap "t list"
       
    67 | lm "string" "t"
       
    68 
       
    69 consts Rt :: "t ⇒ t ⇒ bool"
       
    70 axioms t_eq: "EQUIV Rt"
       
    71 
       
    72 quotient qt = "t" / "Rt"
       
    73   by (rule t_eq)
       
    74 
       
    75 
       
    76 ML {*
       
    77   get_fun repF @{typ t} @{typ qt} @{context} @{typ "((((qt ⇒ qt) ⇒ qt) ⇒ qt) list) * nat"}
       
    78   |> fst
       
    79   |> Syntax.string_of_term @{context}
       
    80   |> writeln
       
    81 *}
       
    82 
       
    83 ML {*
       
    84   get_fun absF @{typ t} @{typ qt} @{context} @{typ "qt * nat"}
       
    85   |> fst
       
    86   |> Syntax.string_of_term @{context}
       
    87   |> writeln
       
    88 *}
       
    89 
       
    90 ML {*
       
    91   get_fun absF @{typ t} @{typ qt} @{context} @{typ "(qt ⇒ qt) ⇒ qt"}
       
    92   |> fst
       
    93   |> Syntax.pretty_term @{context}
       
    94   |> Pretty.string_of
       
    95   |> writeln
       
    96 *}
       
    97 
       
    98 (* A test whether get_fun works properly
       
    99 consts bla :: "(t ⇒ t) ⇒ t"
       
   100 local_setup {*
       
   101   fn lthy => (Toplevel.program (fn () =>
       
   102     make_const_def @{binding bla'} @{term "bla"} NoSyn @{typ "t"} @{typ "qt"} lthy
       
   103   )) |> snd
       
   104 *}
       
   105 *)
       
   106 
       
   107 local_setup {*
       
   108   make_const_def @{binding VR} @{term "vr"} NoSyn @{typ "t"} @{typ "qt"} #> snd #>
       
   109   make_const_def @{binding AP} @{term "ap"} NoSyn @{typ "t"} @{typ "qt"} #> snd #>
       
   110   make_const_def @{binding LM} @{term "lm"} NoSyn @{typ "t"} @{typ "qt"} #> snd
       
   111 *}
       
   112 
       
   113 term vr
       
   114 term ap
       
   115 term lm
       
   116 thm VR_def AP_def LM_def
       
   117 term LM
       
   118 term VR
       
   119 term AP
       
   120 
       
   121 text {* a test with functions *}
       
   122 datatype 'a t' =
       
   123   vr' "string"
       
   124 | ap' "('a t') * ('a t')"
       
   125 | lm' "'a" "string ⇒ ('a t')"
       
   126 
       
   127 consts Rt' :: "('a t') ⇒ ('a t') ⇒ bool"
       
   128 axioms t_eq': "EQUIV Rt'"
       
   129 
       
   130 quotient qt' = "'a t'" / "Rt'"
       
   131   apply(rule t_eq')
       
   132   done
       
   133 
       
   134 print_theorems
       
   135 
       
   136 local_setup {*
       
   137   make_const_def @{binding VR'} @{term "vr'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd #>
       
   138   make_const_def @{binding AP'} @{term "ap'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd #>
       
   139   make_const_def @{binding LM'} @{term "lm'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd
       
   140 *}
       
   141 
       
   142 term vr'
       
   143 term ap'
       
   144 term ap'
       
   145 thm VR'_def AP'_def LM'_def
       
   146 term LM'
       
   147 term VR'
       
   148 term AP'
       
   149 
       
   150 text {* Tests of regularise *}
       
   151 ML {*
       
   152   cterm_of @{theory} (regularise @{term "λx :: int. x"} @{typ "trm"} @{term "RR"} @{context});
       
   153   cterm_of @{theory} (regularise @{term "λx :: trm. x"} @{typ "trm"} @{term "RR"} @{context});
       
   154   cterm_of @{theory} (regularise @{term "∀x :: trm. P x"} @{typ "trm"} @{term "RR"} @{context});
       
   155   cterm_of @{theory} (regularise @{term "∃x :: trm. P x"} @{typ "trm"} @{term "RR"} @{context});
       
   156   cterm_of @{theory} (regularise @{term "All (P :: trm ⇒ bool)"} @{typ "trm"} @{term "RR"} @{context});
       
   157 *}
       
   158 
       
   159 ML {*
       
   160   cterm_of @{theory} (regularise @{term "∃(y::trm). P (λ(x::trm). y)"} @{typ "trm"}
       
   161      @{term "RR"} @{context});
       
   162   cterm_of @{theory} (my_reg @{term "RR"} @{term "∃(y::trm). P (λ(x::trm). y)"})
       
   163 *}
       
   164 
       
   165 ML {*
       
   166   cterm_of @{theory} (regularise @{term "λx::trm. x"} @{typ "trm"} @{term "RR"} @{context});
       
   167   cterm_of @{theory} (my_reg @{term "RR"} @{term "λx::trm. x"})
       
   168 *}
       
   169 
       
   170 ML {*
       
   171   cterm_of @{theory} (regularise @{term "∀(x::trm) (y::trm). P x y"} @{typ "trm"} @{term "RR"} @{context});
       
   172   cterm_of @{theory} (my_reg @{term "RR"} @{term "∀(x::trm) (y::trm). P x y"})
       
   173 *}
       
   174 
       
   175 ML {*
       
   176   cterm_of @{theory} (regularise @{term "∀x::trm. P x"} @{typ "trm"} @{term "RR"} @{context});
       
   177   cterm_of @{theory} (my_reg @{term "RR"} @{term "∀x::trm. P x"})
       
   178 *}
       
   179 
       
   180 ML {*
       
   181   cterm_of @{theory} (regularise @{term "∃x::trm. P x"} @{typ "trm"} @{term "RR"} @{context});
       
   182   cterm_of @{theory} (my_reg @{term "RR"} @{term "∃x::trm. P x"})
       
   183 *}
       
   184 
       
   185 (* my version is not eta-expanded, but that should be OK *)
       
   186 ML {*
       
   187   cterm_of @{theory} (regularise @{term "All (P::trm ⇒ bool)"} @{typ "trm"} @{term "RR"} @{context});
       
   188   cterm_of @{theory} (my_reg @{term "RR"} @{term "All (P::trm ⇒ bool)"})
       
   189 *}