author | wenzelm |
Sat, 15 May 2010 23:40:00 +0200 | |
changeset 36953 | 2af1ad9aa1a3 |
parent 35985 | 0bbf0d2348f9 |
child 43329 | 84472e198515 |
permissions | -rw-r--r-- |
19416 | 1 |
(* Title: Pure/conjunction.ML |
2 |
Author: Makarius |
|
3 |
||
4 |
Meta-level conjunction. |
|
5 |
*) |
|
6 |
||
7 |
signature CONJUNCTION = |
|
8 |
sig |
|
9 |
val conjunction: cterm |
|
10 |
val mk_conjunction: cterm * cterm -> cterm |
|
23422 | 11 |
val mk_conjunction_balanced: cterm list -> cterm |
19416 | 12 |
val dest_conjunction: cterm -> cterm * cterm |
30823
eb99b9134f2e
added dest_conjunctions (cf. Logic.dest_conjunctions);
wenzelm
parents:
29606
diff
changeset
|
13 |
val dest_conjunctions: cterm -> cterm list |
19416 | 14 |
val cong: thm -> thm -> thm |
23422 | 15 |
val convs: (cterm -> thm) -> cterm -> thm |
19416 | 16 |
val conjunctionD1: thm |
17 |
val conjunctionD2: thm |
|
18 |
val conjunctionI: thm |
|
19 |
val intr: thm -> thm -> thm |
|
23422 | 20 |
val intr_balanced: thm list -> thm |
19416 | 21 |
val elim: thm -> thm * thm |
23422 | 22 |
val elim_balanced: int -> thm -> thm list |
23 |
val curry_balanced: int -> thm -> thm |
|
24 |
val uncurry_balanced: int -> thm -> thm |
|
19416 | 25 |
end; |
26 |
||
27 |
structure Conjunction: CONJUNCTION = |
|
28 |
struct |
|
29 |
||
30 |
(** abstract syntax **) |
|
31 |
||
26485 | 32 |
fun certify t = Thm.cterm_of (Context.the_theory (Context.the_thread_data ())) t; |
33384 | 33 |
val read_prop = certify o Simple_Syntax.read_prop; |
19416 | 34 |
|
26485 | 35 |
val true_prop = certify Logic.true_prop; |
36 |
val conjunction = certify Logic.conjunction; |
|
23422 | 37 |
|
19416 | 38 |
fun mk_conjunction (A, B) = Thm.capply (Thm.capply conjunction A) B; |
39 |
||
23422 | 40 |
fun mk_conjunction_balanced [] = true_prop |
32765 | 41 |
| mk_conjunction_balanced ts = Balanced_Tree.make mk_conjunction ts; |
23422 | 42 |
|
19416 | 43 |
fun dest_conjunction ct = |
44 |
(case Thm.term_of ct of |
|
26424 | 45 |
(Const ("Pure.conjunction", _) $ _ $ _) => Thm.dest_binop ct |
23422 | 46 |
| _ => raise TERM ("dest_conjunction", [Thm.term_of ct])); |
19416 | 47 |
|
30823
eb99b9134f2e
added dest_conjunctions (cf. Logic.dest_conjunctions);
wenzelm
parents:
29606
diff
changeset
|
48 |
fun dest_conjunctions ct = |
eb99b9134f2e
added dest_conjunctions (cf. Logic.dest_conjunctions);
wenzelm
parents:
29606
diff
changeset
|
49 |
(case try dest_conjunction ct of |
eb99b9134f2e
added dest_conjunctions (cf. Logic.dest_conjunctions);
wenzelm
parents:
29606
diff
changeset
|
50 |
NONE => [ct] |
eb99b9134f2e
added dest_conjunctions (cf. Logic.dest_conjunctions);
wenzelm
parents:
29606
diff
changeset
|
51 |
| SOME (A, B) => dest_conjunctions A @ dest_conjunctions B); |
eb99b9134f2e
added dest_conjunctions (cf. Logic.dest_conjunctions);
wenzelm
parents:
29606
diff
changeset
|
52 |
|
19416 | 53 |
|
54 |
||
55 |
(** derived rules **) |
|
56 |
||
57 |
(* conversion *) |
|
58 |
||
59 |
val cong = Thm.combination o Thm.combination (Thm.reflexive conjunction); |
|
60 |
||
23422 | 61 |
fun convs cv ct = |
62 |
(case try dest_conjunction ct of |
|
63 |
NONE => cv ct |
|
64 |
| SOME (A, B) => cong (convs cv A) (convs cv B)); |
|
19416 | 65 |
|
66 |
||
67 |
(* intro/elim *) |
|
68 |
||
69 |
local |
|
70 |
||
24241 | 71 |
val A = read_prop "A" and vA = read_prop "?A"; |
72 |
val B = read_prop "B" and vB = read_prop "?B"; |
|
73 |
val C = read_prop "C"; |
|
74 |
val ABC = read_prop "A ==> B ==> C"; |
|
28856
5e009a80fe6d
Pure syntax: more coherent treatment of aprop, permanent TERM and &&&;
wenzelm
parents:
28674
diff
changeset
|
75 |
val A_B = read_prop "A &&& B"; |
19416 | 76 |
|
26424 | 77 |
val conjunction_def = |
35845
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
wenzelm
parents:
33384
diff
changeset
|
78 |
Thm.unvarify_global |
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
wenzelm
parents:
33384
diff
changeset
|
79 |
(Thm.axiom (Context.the_theory (Context.the_thread_data ())) "Pure.conjunction_def"); |
19416 | 80 |
|
81 |
fun conjunctionD which = |
|
82 |
Drule.implies_intr_list [A, B] (Thm.assume (which (A, B))) COMP |