src/CTT/ex/Typechecking.thy
author wenzelm
Tue, 11 Nov 2014 13:40:13 +0100
changeset 58974 cbc2ac19d783
parent 58972 5b026cfc5f04
child 58976 b38a54bbfbd6
permissions -rw-r--r--
simplifie sessions;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
     1
(*  Title:      CTT/ex/Typechecking.thy
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
     2
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
     3
    Copyright   1991  University of Cambridge
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
     4
*)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
     5
58889
5b7a9633cfa8 modernized header uniformly as section;
wenzelm
parents: 39159
diff changeset
     6
section "Easy examples: type checking and type deduction"
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
     7
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
     8
theory Typechecking
58974
cbc2ac19d783 simplifie sessions;
wenzelm
parents: 58972
diff changeset
     9
imports "../CTT"
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    10
begin
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    11
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    12
subsection {* Single-step proofs: verifying that a type is well-formed *}
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    13
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    14
schematic_lemma "?A type"
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    15
apply (rule form_rls)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    16
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    17
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    18
schematic_lemma "?A type"
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    19
apply (rule form_rls)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    20
back
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    21
apply (rule form_rls)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    22
apply (rule form_rls)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    23
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    24
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    25
schematic_lemma "PROD z:?A . N + ?B(z) type"
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    26
apply (rule form_rls)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    27
apply (rule form_rls)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    28
apply (rule form_rls)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    29
apply (rule form_rls)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    30
apply (rule form_rls)
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    31
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    32
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    33
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    34
subsection {* Multi-step proofs: Type inference *}
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    35
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    36
lemma "PROD w:N. N + N type"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    37
apply form
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    38
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    39
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    40
schematic_lemma "<0, succ(0)> : ?A"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    41
apply intr
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    42
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    43
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    44
schematic_lemma "PROD w:N . Eq(?A,w,w) type"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    45
apply typechk
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    46
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    47
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    48
schematic_lemma "PROD x:N . PROD y:N . Eq(?A,x,y) type"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    49
apply typechk
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    50
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    51
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    52
text "typechecking an application of fst"
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    53
schematic_lemma "(lam u. split(u, %v w. v)) ` <0, succ(0)> : ?A"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    54
apply typechk
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    55
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    56
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    57
text "typechecking the predecessor function"
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    58
schematic_lemma "lam n. rec(n, 0, %x y. x) : ?A"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    59
apply typechk
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    60
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    61
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    62
text "typechecking the addition function"
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    63
schematic_lemma "lam n. lam m. rec(n, m, %x y. succ(y)) : ?A"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    64
apply typechk
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    65
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    66
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    67
(*Proofs involving arbitrary types.
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    68
  For concreteness, every type variable left over is forced to be N*)
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    69
method_setup N = {*
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    70
  Scan.succeed (fn _ => SIMPLE_METHOD (TRYALL (resolve_tac @{thms NF})))
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    71
*}
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    72
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    73
schematic_lemma "lam w. <w,w> : ?A"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    74
apply typechk
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    75
apply N
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    76
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    77
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    78
schematic_lemma "lam x. lam y. x : ?A"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    79
apply typechk
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    80
apply N
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    81
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    82
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    83
text "typechecking fst (as a function object)"
36319
8feb2c4bef1a mark schematic statements explicitly;
wenzelm
parents: 35762
diff changeset
    84
schematic_lemma "lam i. split(i, %j k. j) : ?A"
58972
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    85
apply typechk
5b026cfc5f04 more Isar proof methods;
wenzelm
parents: 58963
diff changeset
    86
apply N
19761
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    87
done
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    88
5cd82054c2c6 removed obsolete ML files;
wenzelm
parents:
diff changeset
    89
end