2:- module(freeVarCheck,[freeVarCheckDrs/1,boundVarCheckContext/2,drsCondition/2]). 3
4:- use_module(library(lists),[member/2,append/3]). 5:- use_module(semlib(errors),[error/2,warning/2]). 6
10
11boundVarCheckContext(Context,ADRS):-
12 \+ \+ ( numbervars(Context,0,_),
13 boundVarDrs(Context,[],[],ADRS) ).
14
15
19
20boundVarDrs([K1:drs(D1,_),K2:B2|L],D2,S,ADRS):- !,
21 append(D1,D2,D3),
22 boundVarDrs([K2:B2|L],D3,[sub(K2,K1)|S],ADRS).
23
24boundVarDrs([_,X|_],_,_,_):- !,
25 warning('unknown context while checking bound variables: ~p',[X]).
26
27boundVarDrs([K:drs(D1,_)],D2,S1,ADRS):- !,
28 append(D1,D2,D3),
29 freePointers(D3,K,S1,S2),
30 bound(D3,S2,ADRS).
31
32boundVarDrs([X],_,_,_):- !,
33 warning('unknown context while checking bound variables: ~p',[X]).
34
35
36
40
41freePointers([],_,S,S):- !.
42freePointers([X:_:_|L],K,S1,S2):- member(sub(X,_),S1), !, freePointers(L,K,S1,S2).
43freePointers([X:_:_|L],K,S1,S2):- member(sub(_,X),S1), !, freePointers(L,K,S1,S2).
44freePointers([X:_:_|L],K,S1,S2):- \+ X=K, !, freePointers(L,K,[sub(X,K)|S1],S2).
45freePointers([_:_:_|L],K,S1,S2):- freePointers(L,K,S1,S2).
46
47
51
52bound(Dom,Sub,ADRS):- \+ free(Dom,Sub,ADRS).
53
54
59
60free(Dom,Sub,_:drs(_,Conds)):-
61 member(L2:_:Cond,Conds),
62 drsCondition(X,Cond),
63 \+ (subordinates(L1,L2,Sub), member(L1:_:X,Dom)).
64
65
69
70subordinates(L1,L2,_):- L1=L2.
71subordinates(L1,L2,S):- member(sub(L1,L2),S).
72subordinates(L1,L2,S):- member(sub(L1,L3),S), subordinates(L3,L2,S).
73
74
78
79drsCondition(X,pred(X,_,_,_)).
80drsCondition(X,named(X,_,_,_)).
81drsCondition(X,card(X,_,_)).
82drsCondition(X,timex(X,_)).
83drsCondition(X,rel(X,_,_,_)).
84drsCondition(X,rel(_,X,_,_)).
85drsCondition(X,eq(X,_)).
86drsCondition(X,eq(_,X)).
87drsCondition(X,role(X,_,_,_)).
88drsCondition(X,role(_,X,_,_)).
89
90
94
95freeVarCheckDrs(Drs):-
96 freeVarCheckDrs(Drs,[]-_).
97
98
102
103freeVarCheckDrs([],L-L):- !.
104
105freeVarCheckDrs([B|L],L1-L3):- !,
106 freeVarCheckDrs(B,L1-L2),
107 freeVarCheckDrs(L,L2-L3).
108
109freeVarCheckDrs(K:drs([_:_:X|D],C),L1-L2):- !,
110 freeVarCheckDrs(K:drs(D,C),[X|L1]-L2).
111
112freeVarCheckDrs(_:drs([],C),L-L):- !,
113 freeVarCheckConds(C,L).
114
115freeVarCheckDrs(merge(B1,B2),L1-L3):- !,
116 freeVarCheckDrs(B1,L1-L2),
117 freeVarCheckDrs(B2,L2-L3).
118
119freeVarCheckDrs(sdrs([lab(K,B)|O],C),L1-L3):- !,
120 freeVarCheckDrs(B,[K|L1]-L2),
121 freeVarCheckDrs(sdrs(O,C),L2-L3).
122
123freeVarCheckDrs(sdrs([sub(lab(K1,B1),lab(K2,B2))|O],C),L1-L3):- !,
124 freeVarCheckDrs(B1,[K1|L1]-L2),
125 freeVarCheckDrs(B2,[K2|L2]-_),
126 freeVarCheckDrs(sdrs(O,C),[K2|L2]-L3).
127
128freeVarCheckDrs(sdrs([],C),L-L):- !,
129 freeVarCheckConds(C,L).
130
131freeVarCheckDrs(lab(K,B),L1-L2):- !,
132 freeVarCheckDrs(B,[K|L1]-L2).
133
134freeVarCheckDrs(alfa(_,B1,B2),L1-L3):- !,
135 freeVarCheckDrs(B1,L1-L2),
136 freeVarCheckDrs(B2,L2-L3).
137
138
142
143freeVarCheckConds([],_):- !.
144
145freeVarCheckConds([_:_:X|C],L):-
146 freeVarCheckCond(X,L),
147 freeVarCheckConds(C,L).
148
149
153
154freeVarCheckCond(not(B),L):- !,
155 freeVarCheckDrs(B,L-_).
156
157freeVarCheckCond(nec(B),L):- !,
158 freeVarCheckDrs(B,L-_).
159
160freeVarCheckCond(pos(B),L):- !,
161 freeVarCheckDrs(B,L-_).
162
163freeVarCheckCond(prop(X,B),L):- !,
164 checkTerm(X,L),
165 freeVarCheckDrs(B,L-_).
166
167freeVarCheckCond(imp(B1,B2),L1):- !,
168 freeVarCheckDrs(B1,L1-L2),
169 freeVarCheckDrs(B2,L2-_).
170
171freeVarCheckCond(duplex(_,B1,X,B2),L1):- !,
172 freeVarCheckDrs(B1,L1-L2),
173 checkTerm(X,L2),
174 freeVarCheckDrs(B2,L2-_).
175
176freeVarCheckCond(or(B1,B2),L):- !,
177 freeVarCheckDrs(B1,L-_),
178 freeVarCheckDrs(B2,L-_).
179
180freeVarCheckCond(pred(Arg,_,_,_),L):- !,
181 checkTerm(Arg,L).
182
183freeVarCheckCond(rel(Arg1,Arg2,_,_),L):- !,
184 checkTerm(Arg1,L), checkTerm(Arg2,L).
185
186freeVarCheckCond(role(Arg1,Arg2,_,_),L):- !,
187 checkTerm(Arg1,L), checkTerm(Arg2,L).
188
189freeVarCheckCond(rel(Arg1,Arg2,_),L):- !,
190 checkTerm(Arg1,L), checkTerm(Arg2,L).
191
192freeVarCheckCond(card(Arg1,Arg2,_),L):- !,
193 checkTerm(Arg1,L), checkTerm(Arg2,L).
194
195freeVarCheckCond(named(Arg,_,_,_),L):- !,
196 checkTerm(Arg,L).
197
198freeVarCheckCond(timex(Arg,_),L):- !,
199 checkTerm(Arg,L).
200
201freeVarCheckCond(eq(Arg1,Arg2),L):- !,
202 checkTerm(Arg1,L), checkTerm(Arg2,L).
203
204
208
209checkTerm(X,L):- var(X), member(Y,L), X==Y, !.
210checkTerm(X,_):- atomic(X), !