author | Christian Urban <urbanc@in.tum.de> |
Thu, 17 Dec 2009 14:58:33 +0100 | |
changeset 758 | 3104d62e7a16 |
child 760 | c1989de100b4 |
permissions | -rw-r--r-- |
758
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1 |
signature QUOTIENT_TERM = |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
2 |
sig |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
3 |
val regularize_trm: Proof.context -> term -> term -> term |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
4 |
val inj_repabs_trm: Proof.context -> (term * term) -> term |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
5 |
end; |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
6 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
7 |
structure Quotient_Term: QUOTIENT_TERM = |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
8 |
struct |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
9 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
10 |
(* |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
11 |
Regularizing an rtrm means: |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
12 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
13 |
- Quantifiers over a type that need lifting are replaced |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
14 |
by bounded quantifiers, for example: |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
15 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
16 |
All P ===> All (Respects R) P |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
17 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
18 |
where the relation R is given by the rty and qty; |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
19 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
20 |
- Abstractions over a type that needs lifting are replaced |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
21 |
by bounded abstractions: |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
22 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
23 |
%x. P ===> Ball (Respects R) %x. P |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
24 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
25 |
- Equalities over the type being lifted are replaced by |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
26 |
corresponding equivalence relations: |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
27 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
28 |
A = B ===> R A B |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
29 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
30 |
or |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
31 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
32 |
A = B ===> (R ===> R) A B |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
33 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
34 |
for more complicated types of A and B |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
35 |
*) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
36 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
37 |
(* builds the relation that is the argument of respects *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
38 |
fun mk_resp_arg lthy (rty, qty) = |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
39 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
40 |
val thy = ProofContext.theory_of lthy |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
41 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
42 |
if rty = qty |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
43 |
then HOLogic.eq_const rty |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
44 |
else |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
45 |
case (rty, qty) of |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
46 |
(Type (s, tys), Type (s', tys')) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
47 |
if s = s' |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
48 |
then let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
49 |
val SOME map_info = maps_lookup thy s |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
50 |
(* FIXME dont return an option, raise an exception *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
51 |
val args = map (mk_resp_arg lthy) (tys ~~ tys') |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
52 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
53 |
list_comb (Const (#relfun map_info, dummyT), args) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
54 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
55 |
else let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
56 |
val SOME qinfo = quotdata_lookup_thy thy s' |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
57 |
(* FIXME: check in this case that the rty and qty *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
58 |
(* FIXME: correspond to each other *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
59 |
val (s, _) = dest_Const (#rel qinfo) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
60 |
(* FIXME: the relation should only be the string *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
61 |
(* FIXME: and the type needs to be calculated as below; *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
62 |
(* FIXME: maybe one should actually have a term *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
63 |
(* FIXME: and one needs to force it to have this type *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
64 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
65 |
Const (s, rty --> rty --> @{typ bool}) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
66 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
67 |
| _ => HOLogic.eq_const dummyT |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
68 |
(* FIXME: check that the types correspond to each other? *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
69 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
70 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
71 |
val mk_babs = Const (@{const_name Babs}, dummyT) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
72 |
val mk_ball = Const (@{const_name Ball}, dummyT) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
73 |
val mk_bex = Const (@{const_name Bex}, dummyT) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
74 |
val mk_resp = Const (@{const_name Respects}, dummyT) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
75 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
76 |
(* - applies f to the subterm of an abstraction, *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
77 |
(* otherwise to the given term, *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
78 |
(* - used by regularize, therefore abstracted *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
79 |
(* variables do not have to be treated specially *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
80 |
fun apply_subt f trm1 trm2 = |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
81 |
case (trm1, trm2) of |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
82 |
(Abs (x, T, t), Abs (_ , _, t')) => Abs (x, T, f t t') |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
83 |
| _ => f trm1 trm2 |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
84 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
85 |
(* the major type of All and Ex quantifiers *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
86 |
fun qnt_typ ty = domain_type (domain_type ty) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
87 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
88 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
89 |
(* produces a regularized version of rtrm *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
90 |
(* *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
91 |
(* - the result is still contains dummyT *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
92 |
(* *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
93 |
(* - for regularisation we do not need any *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
94 |
(* special treatment of bound variables *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
95 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
96 |
fun regularize_trm lthy rtrm qtrm = |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
97 |
case (rtrm, qtrm) of |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
98 |
(Abs (x, ty, t), Abs (_, ty', t')) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
99 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
100 |
val subtrm = Abs(x, ty, regularize_trm lthy t t') |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
101 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
102 |
if ty = ty' then subtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
103 |
else mk_babs $ (mk_resp $ mk_resp_arg lthy (ty, ty')) $ subtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
104 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
105 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
106 |
| (Const (@{const_name "All"}, ty) $ t, Const (@{const_name "All"}, ty') $ t') => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
107 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
108 |
val subtrm = apply_subt (regularize_trm lthy) t t' |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
109 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
110 |
if ty = ty' then Const (@{const_name "All"}, ty) $ subtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
111 |
else mk_ball $ (mk_resp $ mk_resp_arg lthy (qnt_typ ty, qnt_typ ty')) $ subtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
112 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
113 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
114 |
| (Const (@{const_name "Ex"}, ty) $ t, Const (@{const_name "Ex"}, ty') $ t') => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
115 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
116 |
val subtrm = apply_subt (regularize_trm lthy) t t' |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
117 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
118 |
if ty = ty' then Const (@{const_name "Ex"}, ty) $ subtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
119 |
else mk_bex $ (mk_resp $ mk_resp_arg lthy (qnt_typ ty, qnt_typ ty')) $ subtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
120 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
121 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
122 |
| (* equalities need to be replaced by appropriate equivalence relations *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
123 |
(Const (@{const_name "op ="}, ty), Const (@{const_name "op ="}, ty')) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
124 |
if ty = ty' then rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
125 |
else mk_resp_arg lthy (domain_type ty, domain_type ty') |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
126 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
127 |
| (* in this case we check whether the given equivalence relation is correct *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
128 |
(rel, Const (@{const_name "op ="}, ty')) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
129 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
130 |
val exc = LIFT_MATCH "regularise (relation mismatch)" |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
131 |
val rel_ty = (fastype_of rel) handle TERM _ => raise exc |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
132 |
val rel' = mk_resp_arg lthy (domain_type rel_ty, domain_type ty') |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
133 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
134 |
if rel' = rel then rtrm else raise exc |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
135 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
136 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
137 |
| (_, Const _) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
138 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
139 |
fun same_name (Const (s, T)) (Const (s', T')) = (s = s') (*andalso (T = T')*) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
140 |
| same_name _ _ = false |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
141 |
(* TODO/FIXME: This test is not enough. *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
142 |
(* Why? *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
143 |
(* Because constants can have the same name but not be the same |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
144 |
constant. All overloaded constants have the same name but because |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
145 |
of different types they do differ. |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
146 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
147 |
This code will let one write a theorem where plus on nat is |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
148 |
matched to plus on int, even if the latter is defined differently. |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
149 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
150 |
This would result in hard to understand failures in injection and |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
151 |
cleaning. *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
152 |
(* cu: if I also test the type, then something else breaks *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
153 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
154 |
if same_name rtrm qtrm then rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
155 |
else |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
156 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
157 |
val thy = ProofContext.theory_of lthy |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
158 |
val qtrm_str = Syntax.string_of_term lthy qtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
159 |
val exc1 = LIFT_MATCH ("regularize (constant " ^ qtrm_str ^ " not found)") |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
160 |
val exc2 = LIFT_MATCH ("regularize (constant " ^ qtrm_str ^ " mismatch)") |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
161 |
val rtrm' = (#rconst (qconsts_lookup thy qtrm)) handle NotFound => raise exc1 |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
162 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
163 |
if Pattern.matches thy (rtrm', rtrm) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
164 |
then rtrm else raise exc2 |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
165 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
166 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
167 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
168 |
| (t1 $ t2, t1' $ t2') => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
169 |
(regularize_trm lthy t1 t1') $ (regularize_trm lthy t2 t2') |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
170 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
171 |
| (Free (x, ty), Free (x', ty')) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
172 |
(* this case cannot arrise as we start with two fully atomized terms *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
173 |
raise (LIFT_MATCH "regularize (frees)") |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
174 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
175 |
| (Bound i, Bound i') => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
176 |
if i = i' then rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
177 |
else raise (LIFT_MATCH "regularize (bounds mismatch)") |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
178 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
179 |
| _ => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
180 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
181 |
val rtrm_str = Syntax.string_of_term lthy rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
182 |
val qtrm_str = Syntax.string_of_term lthy qtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
183 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
184 |
raise (LIFT_MATCH ("regularize failed (default: " ^ rtrm_str ^ "," ^ qtrm_str ^ ")")) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
185 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
186 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
187 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
188 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
189 |
(* |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
190 |
Injecting of Rep/Abs means: |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
191 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
192 |
For abstractions |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
193 |
: |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
194 |
* If the type of the abstraction doesn't need lifting we recurse. |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
195 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
196 |
* If it needs lifting then we add Rep/Abs around the whole term and |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
197 |
check if the bound variable needs lifting. |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
198 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
199 |
* If it does we recurse and put Rep/Abs around all occurences |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
200 |
of the variable in the obtained subterm. This in combination |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
201 |
with the Rep/Abs from above will let us change the type of |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
202 |
the abstraction with rewriting. |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
203 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
204 |
For applications: |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
205 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
206 |
* If the term is Respects applied to anything we leave it unchanged |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
207 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
208 |
* If the term needs lifting and the head is a constant that we know |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
209 |
how to lift, we put a Rep/Abs and recurse |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
210 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
211 |
* If the term needs lifting and the head is a Free applied to subterms |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
212 |
(if it is not applied we treated it in Abs branch) then we |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
213 |
put Rep/Abs and recurse |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
214 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
215 |
* Otherwise just recurse. |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
216 |
*) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
217 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
218 |
fun mk_repabs lthy (T, T') trm = |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
219 |
Quotient_Def.get_fun repF lthy (T, T') |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
220 |
$ (Quotient_Def.get_fun absF lthy (T, T') $ trm) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
221 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
222 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
223 |
(* bound variables need to be treated properly, *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
224 |
(* as the type of subterms needs to be calculated *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
225 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
226 |
fun inj_repabs_trm lthy (rtrm, qtrm) = |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
227 |
case (rtrm, qtrm) of |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
228 |
(Const (@{const_name "Ball"}, T) $ r $ t, Const (@{const_name "All"}, _) $ t') => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
229 |
Const (@{const_name "Ball"}, T) $ r $ (inj_repabs_trm lthy (t, t')) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
230 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
231 |
| (Const (@{const_name "Bex"}, T) $ r $ t, Const (@{const_name "Ex"}, _) $ t') => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
232 |
Const (@{const_name "Bex"}, T) $ r $ (inj_repabs_trm lthy (t, t')) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
233 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
234 |
| (Const (@{const_name "Babs"}, T) $ r $ t, t' as (Abs _)) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
235 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
236 |
val rty = fastype_of rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
237 |
val qty = fastype_of qtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
238 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
239 |
mk_repabs lthy (rty, qty) (Const (@{const_name "Babs"}, T) $ r $ (inj_repabs_trm lthy (t, t'))) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
240 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
241 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
242 |
| (Abs (x, T, t), Abs (x', T', t')) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
243 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
244 |
val rty = fastype_of rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
245 |
val qty = fastype_of qtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
246 |
val (y, s) = Term.dest_abs (x, T, t) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
247 |
val (_, s') = Term.dest_abs (x', T', t') |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
248 |
val yvar = Free (y, T) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
249 |
val result = Term.lambda_name (y, yvar) (inj_repabs_trm lthy (s, s')) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
250 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
251 |
if rty = qty then result |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
252 |
else mk_repabs lthy (rty, qty) result |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
253 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
254 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
255 |
| (t $ s, t' $ s') => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
256 |
(inj_repabs_trm lthy (t, t')) $ (inj_repabs_trm lthy (s, s')) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
257 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
258 |
| (Free (_, T), Free (_, T')) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
259 |
if T = T' then rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
260 |
else mk_repabs lthy (T, T') rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
261 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
262 |
| (_, Const (@{const_name "op ="}, _)) => rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
263 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
264 |
| (_, Const (_, T')) => |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
265 |
let |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
266 |
val rty = fastype_of rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
267 |
in |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
268 |
if rty = T' then rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
269 |
else mk_repabs lthy (rty, T') rtrm |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
270 |
end |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
271 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
272 |
| _ => raise (LIFT_MATCH "injection") |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
273 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
274 |
end; (* structure *) |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
275 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
276 |
open Quotient_Term; |
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
277 |
|
3104d62e7a16
moved the QuotMain code into two ML-files
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
278 |