|
15347
|
1 |
(* Author: Jia Meng, Cambridge University Computer Laboratory
|
|
|
2 |
ID: $Id$
|
|
|
3 |
Copyright 2004 University of Cambridge
|
|
|
4 |
|
|
|
5 |
Generation of unique Skolem functions (with types) as Term.term.
|
|
|
6 |
*)
|
|
|
7 |
|
|
|
8 |
signature RES_SKOLEM_FUNCTION =
|
|
|
9 |
sig
|
|
|
10 |
|
|
|
11 |
val gen_skolem: Term.term list -> Term.typ -> Term.term
|
|
|
12 |
|
|
|
13 |
end;
|
|
|
14 |
|
|
|
15 |
structure ResSkolemFunction: RES_SKOLEM_FUNCTION =
|
|
|
16 |
|
|
|
17 |
struct
|
|
|
18 |
|
|
|
19 |
val skolem_prefix = "sk_";
|
|
|
20 |
|
|
|
21 |
(* internal reference starting from 0. *)
|
|
|
22 |
val skolem_id = ref 0;
|
|
|
23 |
|
|
|
24 |
|
|
|
25 |
fun gen_skolem_name () =
|
|
|
26 |
let val new_id = !skolem_id
|
|
|
27 |
val sk_fun = skolem_prefix ^ (string_of_int new_id)
|
|
|
28 |
in
|
|
|
29 |
(skolem_id := new_id + 1; sk_fun) (* increment id by 1. *)
|
|
|
30 |
end;
|
|
|
31 |
|
|
|
32 |
fun sk_type_of_aux [Var(_,tp1)] tp = Type("fun",[tp1,tp])
|
|
|
33 |
| sk_type_of_aux (Var(_,tp1)::vars) tp =
|
|
|
34 |
let val tp' = sk_type_of_aux vars tp
|
|
|
35 |
in
|
|
|
36 |
Type("fun",[tp1,tp'])
|
|
|
37 |
end;
|
|
|
38 |
|
|
|
39 |
|
|
|
40 |
fun sk_type_of [] tp = tp
|
|
|
41 |
| sk_type_of vars tp = sk_type_of_aux vars tp;
|
|
|
42 |
|
|
|
43 |
|
|
|
44 |
|
|
|
45 |
fun gen_skolem univ_vars tp =
|
|
|
46 |
let val new_sk_name = gen_skolem_name ()
|
|
|
47 |
val new_sk_type = sk_type_of univ_vars tp
|
|
|
48 |
val skolem_term = Const(new_sk_name,new_sk_type)
|
|
|
49 |
fun app [] sf = sf
|
|
|
50 |
| app (var::vars) sf= app vars (sf $ var)
|
|
|
51 |
in
|
|
|
52 |
app univ_vars skolem_term
|
|
|
53 |
end;
|
|
|
54 |
|
|
|
55 |
|
|
|
56 |
end; |