2 * Copyright (c) 2000-2001
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the University nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 DECLARE_UFIND(tv_elt
,gen_e
)
39 DEFINE_UFIND(tv_elt
,gen_e
)
41 DEFINE_LIST(term_var_list
,term_var
)
55 static term_var
make_var(region r
, const char *name
, stamp st
)
57 term_var result
= ralloc(r
, struct term_var
);
58 gen_e info
= (gen_e
) result
;
60 result
->type
= VAR_TYPE
;
62 result
->pending
= new_gen_e_list(r
);
63 result
->name
= name
? rstrdup(r
,name
) : "fv";
64 result
->elt
= new_tv_elt(r
,info
);
69 term_var
tv_fresh(region r
, const char *name
)
71 return make_var(r
,name
,stamp_fresh());
74 term_var
tv_fresh_small(region r
, const char *name
)
76 return make_var(r
,name
,stamp_fresh_small());
79 term_var
tv_fresh_large(region r
, const char *name
)
81 return make_var(r
,name
,stamp_fresh_large());
84 static term_var
tv_get_v_ecr(term_var v
)
86 term_var ecr
= (term_var
)tv_get_ecr(v
);
87 assert (ecr
->type
== VAR_TYPE
); /* this is a hack, but should be ok */
92 const char *tv_get_name(term_var v
)
94 return tv_get_v_ecr(v
)->name
;
97 gen_e_list
tv_get_pending(term_var v
)
99 return tv_get_v_ecr(v
)->pending
;
102 void tv_add_pending(term_var v
,gen_e e
)
104 gen_e_list_cons(e
,tv_get_v_ecr(v
)->pending
);
107 void tv_unify(term_var v
, gen_e e
)
109 tv_elt_update(v
->elt
,e
);
111 assert(tv_get_ecr(v
) == e
);
114 static gen_e
tv_combine(gen_e e1
, gen_e e2
)
116 term_var v1
= (term_var
)e1
,
120 gen_e_list_append(tv_get_pending(v1
), tv_get_pending(v2
));
125 void tv_unify_vars(term_var v1
, term_var v2
)
127 tv_elt_unify(tv_combine
,v1
->elt
, v2
->elt
);
130 gen_e
tv_get_ecr(term_var v
)
132 return tv_elt_get_info(v
->elt
);