27
28:- module(scasp_variables,
29 [ is_var/1,
30 is_var/2,
31 body_vars/3,
32 var_list/2, 33 revar/3 34 ]). 35:- use_module(library(assoc)). 36:- use_module(library(apply)). 37:- use_module(library(lists)).
56is_var($X) :-
57 atom(X).
58
59is_var($X, X) :-
60 atom(X).
67:- det(body_vars/3). 68
69body_vars(H, B, Bv) :-
70 empty_assoc(Empty),
71 term_vars(H, _, [], Empty, Hv),
72 term_vars(B, Bv, [], Hv, _).
73
74term_vars(Var, Vars0, Vars, Seen0, Seen) :-
75 is_var(Var, Name),
76 !,
77 ( get_assoc(Name, Seen0, _)
78 -> Vars = Vars0,
79 Seen = Seen0
80 ; put_assoc(Name, Seen0, true, Seen),
81 Vars0 = [Var|Vars]
82 ).
83term_vars(Term, Vars0, Vars, Seen0, Seen) :-
84 compound(Term),
85 !,
86 functor(Term, _Name, Arity),
87 term_vars(1, Arity, Term, Vars0, Vars, Seen0, Seen).
88term_vars(_, Vars, Vars, Seen, Seen).
89
90term_vars(I, Arity, Term, Vars0, Vars, Seen0, Seen) :-
91 I =< Arity,
92 !,
93 arg(I, Term, Arg),
94 term_vars(Arg, Vars0, Vars1, Seen0, Seen1),
95 I2 is I+1,
96 term_vars(I2, Arity, Term, Vars1, Vars, Seen1, Seen).
97term_vars(_, _, _, Vars, Vars, Seen, Seen).
108:- det(var_list/2). 109
110var_list(0, []) :-
111 !.
112var_list(I, [H|T]) :-
113 I2 is I-1,
114 var_list(I2, T),
115 mk_var(I2, H).
116
117mk_var(I, $Name) :-
118 atom_concat('_X', I, Name).
132revar(X,Y,VarNames) :-
133 empty_assoc(Dic0),
134 revar_(X,Y,Dic0,Dic),
135 assoc_to_list(Dic, Pairs),
136 maplist(varname, Pairs, VarNames).
137
138varname(Name-Var, Name=Var).
139
140revar_(X,Y,Dic,Dic) :-
141 var(X),
142 !,
143 Y=X.
144revar_(X,Y,Dic0,Dic) :-
145 is_var(X, Name),
146 !,
147 ( get_assoc(Name, Dic0, Y)
148 -> Dic = Dic0
149 ; put_assoc(Name, Dic0, Y, Dic)
150 ).
151revar_(X,Y,Dic,Dic) :-
152 special_atom(X,Y),
153 !.
154revar_(X,Y,Dic0,Dic) :-
155 X=..[F|As],
156 revars(As,Bs,Dic0,Dic),
157 Y=..[F|Bs].
158
159special_atom(A/B,Rat) :-
160 integer(A),
161 integer(B),
162 !,
163 Rat is rdiv(A,B).
164special_atom(X,Y) :-
165 atom(X),
166 atom_chars(X,Codes),
167 append(['\''|C_Y],['\''],Codes),
168 atom_chars(Y,C_Y).
169
170revars([],[],Dic,Dic).
171revars([X|Xs],[Y|Ys],Dic0,Dic) :-
172 revar_(X,Y,Dic0,Dic1),
173 revars(Xs, Ys, Dic1, Dic)
Variable storage and access
Predicates related to storing, accessing and modifying variables.