forked from jrh13/hol-light
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrivia.ml
91 lines (71 loc) · 3.15 KB
/
trivia.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
(* ========================================================================= *)
(* Trivial odds and ends. *)
(* *)
(* John Harrison, University of Cambridge Computer Laboratory *)
(* *)
(* (c) Copyright, University of Cambridge 1998 *)
(* (c) Copyright, John Harrison 1998-2007 *)
(* ========================================================================= *)
needs "class.ml";;
(* ------------------------------------------------------------------------- *)
(* Combinators. We don't bother with S and K, which seem of little use. *)
(* ------------------------------------------------------------------------- *)
parse_as_infix ("o",(26,"right"));;
let o_DEF = new_definition
`(o) (f:B->C) g = \x:A. f(g(x))`;;
let I_DEF = new_definition
`I = \x:A. x`;;
let o_THM = prove
(`!f:B->C. !g:A->B. !x:A. (f o g) x = f(g(x))`,
PURE_REWRITE_TAC [o_DEF] THEN
CONV_TAC (DEPTH_CONV BETA_CONV) THEN
REPEAT GEN_TAC THEN REFL_TAC);;
let o_ASSOC = prove
(`!f:C->D. !g:B->C. !h:A->B. f o (g o h) = (f o g) o h`,
REPEAT GEN_TAC THEN REWRITE_TAC [o_DEF] THEN
CONV_TAC (REDEPTH_CONV BETA_CONV) THEN
REFL_TAC);;
let I_THM = prove
(`!x:A. I x = x`,
REWRITE_TAC [I_DEF]);;
let I_O_ID = prove
(`!f:A->B. (I o f = f) /\ (f o I = f)`,
REPEAT STRIP_TAC THEN
REWRITE_TAC[FUN_EQ_THM; o_DEF; I_THM]);;
(* ------------------------------------------------------------------------- *)
(* The theory "1" (a 1-element type). *)
(* ------------------------------------------------------------------------- *)
let EXISTS_ONE_REP = prove
(`?b:bool. b`,
EXISTS_TAC `T` THEN
BETA_TAC THEN ACCEPT_TAC TRUTH);;
let one_tydef =
new_type_definition "1" ("one_ABS","one_REP") EXISTS_ONE_REP;;
let one_DEF = new_definition
`one = @x:1. T`;;
let one = prove
(`!v:1. v = one`,
MP_TAC(GEN_ALL (SPEC `one_REP a` (CONJUNCT2 one_tydef))) THEN
REWRITE_TAC[CONJUNCT1 one_tydef] THEN DISCH_TAC THEN
ONCE_REWRITE_TAC[GSYM (CONJUNCT1 one_tydef)] THEN
ASM_REWRITE_TAC[]);;
let one_axiom = prove
(`!f g. f = (g:A->1)`,
REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[FUN_EQ_THM] THEN
GEN_TAC THEN ONCE_REWRITE_TAC[one] THEN REFL_TAC);;
let one_INDUCT = prove
(`!P. P one ==> !x. P x`,
ONCE_REWRITE_TAC[one] THEN REWRITE_TAC[]);;
let one_RECURSION = prove
(`!e:A. ?fn. fn one = e`,
GEN_TAC THEN EXISTS_TAC `\x:1. e:A` THEN BETA_TAC THEN REFL_TAC);;
let one_Axiom = prove
(`!e:A. ?!fn. fn one = e`,
GEN_TAC THEN REWRITE_TAC[EXISTS_UNIQUE_THM; one_RECURSION] THEN
REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[FUN_EQ_THM] THEN
ONCE_REWRITE_TAC [one] THEN ASM_REWRITE_TAC[]);;
(* ------------------------------------------------------------------------- *)
(* Add the type "1" to the inductive type store. *)
(* ------------------------------------------------------------------------- *)
inductive_type_store :=
("1",(1,one_INDUCT,one_RECURSION))::(!inductive_type_store);;