equal
deleted
inserted
replaced
1 (* Title: HOL/Tools/Function/relation.ML |
1 (* Title: HOL/Tools/Function/relation.ML |
2 Author: Alexander Krauss, TU Muenchen |
2 Author: Alexander Krauss, TU Muenchen |
3 |
3 |
4 Method "relation" to start a termination proof using a user-specified relation. |
4 Tactics to start a termination proof using a user-specified relation. |
5 *) |
5 *) |
6 |
6 |
7 signature FUNCTION_RELATION = |
7 signature FUNCTION_RELATION = |
8 sig |
8 sig |
9 val relation_tac: Proof.context -> (typ -> term) -> int -> tactic |
9 val relation_tac: Proof.context -> (typ -> term) -> int -> tactic |
10 val setup: theory -> theory |
10 val relation_infer_tac: Proof.context -> term -> int -> tactic |
11 end |
11 end |
12 |
12 |
13 structure Function_Relation : FUNCTION_RELATION = |
13 structure Function_Relation : FUNCTION_RELATION = |
14 struct |
14 struct |
15 |
15 |
25 fun relation_tac ctxt rel i = |
25 fun relation_tac ctxt rel i = |
26 TRY (Function_Common.apply_termination_rule ctxt i) |
26 TRY (Function_Common.apply_termination_rule ctxt i) |
27 THEN inst_state_tac rel; |
27 THEN inst_state_tac rel; |
28 |
28 |
29 |
29 |
30 (* method version (with type inference) *) |
30 (* version with type inference *) |
31 |
31 |
32 fun inst_state_infer_tac ctxt rel st = |
32 fun inst_state_infer_tac ctxt rel st = |
33 case Term.add_vars (prop_of st) [] of |
33 case Term.add_vars (prop_of st) [] of |
34 [v as (_, T)] => |
34 [v as (_, T)] => |
35 let |
35 let |
42 in |
42 in |
43 PRIMITIVE (Thm.instantiate ([], [(cert (Var v), rel')])) st |
43 PRIMITIVE (Thm.instantiate ([], [(cert (Var v), rel')])) st |
44 end |
44 end |
45 | _ => Seq.empty; |
45 | _ => Seq.empty; |
46 |
46 |
47 fun relation_meth rel ctxt = SIMPLE_METHOD' (fn i => |
47 fun relation_infer_tac ctxt rel i = |
48 TRY (Function_Common.apply_termination_rule ctxt i) |
48 TRY (Function_Common.apply_termination_rule ctxt i) |
49 THEN inst_state_infer_tac ctxt rel); |
49 THEN inst_state_infer_tac ctxt rel; |
50 |
|
51 val setup = |
|
52 Method.setup @{binding relation} (Args.term >> relation_meth) |
|
53 "proves termination using a user-specified wellfounded relation"; |
|
54 |
50 |
55 end |
51 end |