src/HOL/Metis_Examples/Type_Encodings.thy
author huffman
Thu, 17 Nov 2011 06:01:47 +0100
changeset 45532 74b17a0881b3
parent 45523 741f308c0f36
child 45705 a25ff4283352
permissions -rw-r--r--
Int.thy: remove duplicate lemmas double_less_0_iff and odd_less_0, use {even,odd}_less_0_iff instead
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43197
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
     1
(*  Title:      HOL/Metis_Examples/Type_Encodings.thy
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
     3
43197
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
     4
Example that exercises Metis's (and hence Sledgehammer's) type encodings.
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
     5
*)
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
     6
43197
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
     7
header {*
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
     8
Example that Exercises Metis's (and Hence Sledgehammer's) Type Encodings
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
     9
*}
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
    10
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
    11
theory Type_Encodings
44412
c8b847625584 include all encodings in tests, now that the incompleteness of some encodings has been addressed
blanchet
parents: 44408
diff changeset
    12
imports Main
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    13
begin
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    14
43197
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
    15
declare [[metis_new_skolemizer]]
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
    16
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
    17
sledgehammer_params [prover = e, blocking, timeout = 10, preplay_timeout = 0]
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
    18
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
    19
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    20
text {* Setup for testing Metis exhaustively *}
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    21
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    22
lemma fork: "P \<Longrightarrow> P \<Longrightarrow> P" by assumption
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    23
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    24
ML {*
43626
a867ebb12209 renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents: 43212
diff changeset
    25
val type_encs =
43208
acfc370df64b compile
blanchet
parents: 43205
diff changeset
    26
  ["erased",
43989
eb763b3ff9ed renamed "preds" encodings to "guards"
blanchet
parents: 43629
diff changeset
    27
   "poly_guards",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    28
   "poly_guards?",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    29
   "poly_guards??",
44813
d7094cae7df4 added new guards encoding to test
blanchet
parents: 44768
diff changeset
    30
   "poly_guards@?",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    31
   "poly_guards!",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    32
   "poly_guards!!",
44813
d7094cae7df4 added new guards encoding to test
blanchet
parents: 44768
diff changeset
    33
   "poly_guards@!",
43208
acfc370df64b compile
blanchet
parents: 43205
diff changeset
    34
   "poly_tags",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    35
   "poly_tags?",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    36
   "poly_tags??",
44815
19b70980a1bb added new tagged encodings to Metis tests
blanchet
parents: 44813
diff changeset
    37
   "poly_tags@?",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    38
   "poly_tags!",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    39
   "poly_tags!!",
44815
19b70980a1bb added new tagged encodings to Metis tests
blanchet
parents: 44813
diff changeset
    40
   "poly_tags@!",
43208
acfc370df64b compile
blanchet
parents: 43205
diff changeset
    41
   "poly_args",
44494
a77901b3774e rationalized option names -- mono becomes raw_mono and mangled becomes mono
blanchet
parents: 44412
diff changeset
    42
   "raw_mono_guards",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    43
   "raw_mono_guards?",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    44
   "raw_mono_guards??",
44813
d7094cae7df4 added new guards encoding to test
blanchet
parents: 44768
diff changeset
    45
   "raw_mono_guards@?",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    46
   "raw_mono_guards!",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    47
   "raw_mono_guards!!",
44813
d7094cae7df4 added new guards encoding to test
blanchet
parents: 44768
diff changeset
    48
   "raw_mono_guards@!",
44494
a77901b3774e rationalized option names -- mono becomes raw_mono and mangled becomes mono
blanchet
parents: 44412
diff changeset
    49
   "raw_mono_tags",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    50
   "raw_mono_tags?",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    51
   "raw_mono_tags??",
44815
19b70980a1bb added new tagged encodings to Metis tests
blanchet
parents: 44813
diff changeset
    52
   "raw_mono_tags@?",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    53
   "raw_mono_tags!",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    54
   "raw_mono_tags!!",
44815
19b70980a1bb added new tagged encodings to Metis tests
blanchet
parents: 44813
diff changeset
    55
   "raw_mono_tags@!",
44494
a77901b3774e rationalized option names -- mono becomes raw_mono and mangled becomes mono
blanchet
parents: 44412
diff changeset
    56
   "raw_mono_args",
43989
eb763b3ff9ed renamed "preds" encodings to "guards"
blanchet
parents: 43629
diff changeset
    57
   "mono_guards",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    58
   "mono_guards?",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    59
   "mono_guards??",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    60
   "mono_guards!",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    61
   "mono_guards!!",
43208
acfc370df64b compile
blanchet
parents: 43205
diff changeset
    62
   "mono_tags",
acfc370df64b compile
blanchet
parents: 43205
diff changeset
    63
   "mono_tags?",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    64
   "mono_tags??",
43208
acfc370df64b compile
blanchet
parents: 43205
diff changeset
    65
   "mono_tags!",
44768
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    66
   "mono_tags!!",
a7bc1bdb8bb4 rationalize uniform encodings
blanchet
parents: 44651
diff changeset
    67
   "mono_args"]
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    68
43212
050a03afe024 Metis code cleanup
blanchet
parents: 43208
diff changeset
    69
fun metis_exhaust_tac ctxt ths =
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    70
  let
43172
blanchet
parents: 43162
diff changeset
    71
    fun tac [] st = all_tac st
43626
a867ebb12209 renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents: 43212
diff changeset
    72
      | tac (type_enc :: type_encs) st =
a867ebb12209 renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents: 43212
diff changeset
    73
        st (* |> tap (fn _ => tracing (PolyML.makestring type_enc)) *)
a867ebb12209 renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents: 43212
diff changeset
    74
           |> ((if null type_encs then all_tac else rtac @{thm fork} 1)
45523
741f308c0f36 compile
blanchet
parents: 45502
diff changeset
    75
               THEN Metis_Tactic.metis_tac [type_enc] "combinators" ctxt ths 1
43172
blanchet
parents: 43162
diff changeset
    76
               THEN COND (has_fewer_prems 2) all_tac no_tac
43626
a867ebb12209 renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents: 43212
diff changeset
    77
               THEN tac type_encs)
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    78
  in tac end
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    79
*}
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    80
43212
050a03afe024 Metis code cleanup
blanchet
parents: 43208
diff changeset
    81
method_setup metis_exhaust = {*
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    82
  Attrib.thms >>
43626
a867ebb12209 renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents: 43212
diff changeset
    83
    (fn ths => fn ctxt => SIMPLE_METHOD (metis_exhaust_tac ctxt ths type_encs))
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    84
*} "exhaustively run the new Metis with all type encodings"
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    85
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    86
43197
c71657bbdbc0 tuned Metis examples
blanchet
parents: 43196
diff changeset
    87
text {* Miscellaneous tests *}
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    88
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    89
lemma "x = y \<Longrightarrow> y = x"
43212
050a03afe024 Metis code cleanup
blanchet
parents: 43208
diff changeset
    90
by metis_exhaust
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    91
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    92
lemma "[a] = [1 + 1] \<Longrightarrow> a = 1 + (1::int)"
43212
050a03afe024 Metis code cleanup
blanchet
parents: 43208
diff changeset
    93
by (metis_exhaust last.simps)
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    94
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    95
lemma "map Suc [0] = [Suc 0]"
43212
050a03afe024 Metis code cleanup
blanchet
parents: 43208
diff changeset
    96
by (metis_exhaust map.simps)
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    97
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
    98
lemma "map Suc [1 + 1] = [Suc 2]"
43212
050a03afe024 Metis code cleanup
blanchet
parents: 43208
diff changeset
    99
by (metis_exhaust map.simps nat_1_add_1)
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   100
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   101
lemma "map Suc [2] = [Suc (1 + 1)]"
43212
050a03afe024 Metis code cleanup
blanchet
parents: 43208
diff changeset
   102
by (metis_exhaust map.simps nat_1_add_1)
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   103
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   104
definition "null xs = (xs = [])"
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   105
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   106
lemma "P (null xs) \<Longrightarrow> null xs \<Longrightarrow> xs = []"
43212
050a03afe024 Metis code cleanup
blanchet
parents: 43208
diff changeset
   107
by (metis_exhaust null_def)
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   108
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   109
lemma "(0::nat) + 0 = 0"
45502
6246bef495ff avoid theorem references like 'semiring_norm(111)'
huffman
parents: 44815
diff changeset
   110
by (metis_exhaust add_0_left)
43162
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   111
9a8acc5adfa3 added Metis examples to test the new type encodings
blanchet
parents:
diff changeset
   112
end