25
|
1 |
theory FistStep
|
|
2 |
imports Main
|
|
3 |
begin
|
|
4 |
|
|
5 |
ML {*
|
|
6 |
val pretty_term = Syntax.pretty_term
|
|
7 |
val pwriteln = Pretty.writeln
|
|
8 |
fun pretty_terms ctxt trms =
|
|
9 |
Pretty.block (Pretty.commas (map (pretty_term ctxt) trms))
|
|
10 |
val show_type_ctxt = Config.put show_types true @{context}
|
|
11 |
val show_all_types_ctxt = Config.put show_all_types true @{context}
|
|
12 |
fun pretty_cterm ctxt ctrm =
|
|
13 |
pretty_term ctxt (term_of ctrm)
|
|
14 |
fun pretty_thm ctxt thm =
|
|
15 |
pretty_term ctxt (prop_of thm)
|
|
16 |
fun pretty_thm_no_vars ctxt thm =
|
|
17 |
let
|
|
18 |
val ctxt' = Config.put show_question_marks false ctxt
|
|
19 |
in
|
|
20 |
pretty_term ctxt' (prop_of thm)
|
|
21 |
end
|
|
22 |
fun pretty_thms ctxt thms =
|
|
23 |
Pretty.block (Pretty.commas (map (pretty_thm ctxt) thms))
|
|
24 |
fun pretty_thms_no_vars ctxt thms =
|
|
25 |
Pretty.block (Pretty.commas (map (pretty_thm_no_vars ctxt) thms))
|
|
26 |
fun pretty_typ ctxt ty = Syntax.pretty_typ ctxt ty
|
|
27 |
fun pretty_typs ctxt tys =
|
|
28 |
Pretty.block (Pretty.commas (map (pretty_typ ctxt) tys))
|
|
29 |
fun pretty_ctyp ctxt cty = pretty_typ ctxt (typ_of cty)
|
|
30 |
fun pretty_ctyps ctxt ctys =
|
|
31 |
Pretty.block (Pretty.commas (map (pretty_ctyp ctxt) ctys))
|
|
32 |
fun `f = fn x => (f x, x)
|
|
33 |
fun (x, y) |>> f = (f x, y)
|
|
34 |
fun (x, y) ||> f = (x, f y)
|
|
35 |
fun (x, y) |-> f = f x y
|
|
36 |
*}
|
|
37 |
|
|
38 |
ML {*
|
|
39 |
val _ = pretty_term @{context} @{term "x + y + z"} |> pwriteln
|
|
40 |
val _ = pretty_terms @{context} [@{term "x + y"}, @{term "x + y + z"}] |> pwriteln
|
|
41 |
val show_type_ctxt = Config.put show_types true @{context}
|
|
42 |
*}
|
|
43 |
|
|
44 |
ML {*
|
|
45 |
pwriteln (pretty_term show_type_ctxt @{term "(1::nat, x)"})
|
|
46 |
*}
|
|
47 |
|
|
48 |
ML {*
|
|
49 |
pwriteln (Pretty.str (cat_lines ["foo", "bar"]))
|
|
50 |
*}
|
|
51 |
|
|
52 |
ML {*
|
|
53 |
fun apply_fresh_args f ctxt =
|
|
54 |
f |> fastype_of
|
|
55 |
|> binder_types
|
|
56 |
|> map (pair "z")
|
|
57 |
|> Variable.variant_frees ctxt [f]
|
|
58 |
|> map Free
|
|
59 |
|> tap (fn x => pwriteln (Pretty.str (@{make_string} x)))
|
|
60 |
|> curry list_comb f
|
|
61 |
*}
|
|
62 |
|
|
63 |
ML {*
|
|
64 |
let
|
|
65 |
val trm = @{term "P::nat => int => unit => bool"}
|
|
66 |
val ctxt = ML_Context.the_local_context ()
|
|
67 |
in
|
|
68 |
apply_fresh_args trm ctxt
|
|
69 |
|> pretty_term ctxt
|
|
70 |
|> pwriteln
|
|
71 |
end
|
|
72 |
*}
|
|
73 |
|
|
74 |
ML {*
|
|
75 |
fun inc_by_three x =
|
|
76 |
x |> (fn x => x + 1)
|
|
77 |
|> tap (fn x => pwriteln (Pretty.str (@{make_string} x)))
|
|
78 |
|> (fn x => x + 2)
|
|
79 |
*}
|
|
80 |
|
|
81 |
ML {*
|
|
82 |
fun `f = fn x => (f x, x)
|
|
83 |
*}
|
|
84 |
|
|
85 |
ML {*
|
|
86 |
fun inc_as_pair x =
|
|
87 |
x |> `(fn x => x + 1)
|
|
88 |
|> (fn (x, y) => (x, y + 1))
|
|
89 |
*}
|
|
90 |
|
|
91 |
ML {*
|
|
92 |
3 |> inc_as_pair
|
|
93 |
*}
|
|
94 |
|
|
95 |
ML {*
|
|
96 |
fun acc_incs x =
|
|
97 |
x |> (fn x => (0, x))
|
|
98 |
||>> (fn x => (x, x + 1))
|
|
99 |
||>> (fn x => (x, x + 1))
|
|
100 |
||>> (fn x => (x, x + 1))
|
|
101 |
*}
|
|
102 |
|
|
103 |
ML {*
|
|
104 |
2 |> acc_incs
|
|
105 |
*}
|
|
106 |
|
|
107 |
ML {*
|
|
108 |
let
|
|
109 |
val ((names1, names2), _) =
|
|
110 |
@{context}
|
|
111 |
|> Variable.variant_fixes (replicate 4 "x")
|
|
112 |
|> tap (fn x => pwriteln (Pretty.str (@{make_string} x)))
|
|
113 |
||>> Variable.variant_fixes (replicate 5 "x")
|
|
114 |
|> tap (fn x => pwriteln (Pretty.str (@{make_string} x)))
|
|
115 |
in
|
|
116 |
(names1, names2)
|
|
117 |
end
|
|
118 |
*}
|
|
119 |
|
|
120 |
ML {*
|
|
121 |
@{context}
|
|
122 |
|> Local_Defs.add_def ((@{binding "One"}, NoSyn), @{term "1::nat"})
|
|
123 |
||>> Local_Defs.add_def ((@{binding "Two"}, NoSyn), @{term "2::nat"})
|
|
124 |
||>> Local_Defs.add_def ((@{binding "Three"}, NoSyn), @{term "3::nat"})
|
|
125 |
*}
|
|
126 |
|
|
127 |
ML {*
|
|
128 |
let
|
|
129 |
val ctxt = @{context}
|
|
130 |
in
|
|
131 |
Syntax.parse_term ctxt "m + n"
|
|
132 |
|> singleton (Syntax.check_terms ctxt)
|
|
133 |
|> pretty_term ctxt
|
|
134 |
|> pwriteln
|
|
135 |
end
|
|
136 |
*}
|
|
137 |
|
|
138 |
ML {*
|
|
139 |
val term_pat_setup =
|
|
140 |
let
|
|
141 |
val parser = Args.context -- Scan.lift Args.name_source
|
|
142 |
fun term_pat (ctxt, str) =
|
|
143 |
str |> Proof_Context.read_term_pattern ctxt
|
|
144 |
|> ML_Syntax.print_term
|
|
145 |
|> ML_Syntax.atomic
|
|
146 |
in
|
|
147 |
ML_Antiquote.inline @{binding "term_pat"} (parser >> term_pat)
|
|
148 |
end
|
|
149 |
*}
|
|
150 |
|
|
151 |
setup {* term_pat_setup *}
|
|
152 |
|
|
153 |
|
|
154 |
ML {*
|
|
155 |
val type_pat_setup =
|
|
156 |
let
|
|
157 |
val parser = Args.context -- Scan.lift Args.name_source
|
|
158 |
fun typ_pat (ctxt, str) =
|
|
159 |
let
|
|
160 |
val ctxt' = Proof_Context.set_mode Proof_Context.mode_schematic ctxt
|
|
161 |
in
|
|
162 |
str |> Syntax.read_typ ctxt'
|
|
163 |
|> ML_Syntax.print_typ
|
|
164 |
|> ML_Syntax.atomic
|
|
165 |
end
|
|
166 |
in
|
|
167 |
ML_Antiquote.inline @{binding "typ_pat"} (parser >> typ_pat)
|
|
168 |
end
|
|
169 |
*}
|
|
170 |
|
|
171 |
setup {* type_pat_setup *}
|
|
172 |
|
|
173 |
end |