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
    7/* ========================================================================
    8   Bound Variable Check (main predicate)
    9======================================================================== */
   10
   11boundVarCheckContext(Context,ADRS):-
   12   \+ \+ ( numbervars(Context,0,_),
   13           boundVarDrs(Context,[],[],ADRS) ).
   14
   15
   16/* ========================================================================
   17   Bound Variable Check (traversing lists of DRSs, last one most global)
   18======================================================================== */
   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
   37/* ========================================================================
   38   Adding free pointers to subordination constraints
   39======================================================================== */
   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
   48/* ========================================================================
   49   A variable is bound if it is not free
   50======================================================================== */
   51
   52bound(Dom,Sub,ADRS):- \+ free(Dom,Sub,ADRS).
   53
   54
   55/* ========================================================================
   56   A variable is free if there is a condition with a variable that is not
   57   in the domain of a super-ordinated DRS
   58======================================================================== */
   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
   66/* ========================================================================
   67   Subordination
   68======================================================================== */
   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
   75/* ========================================================================
   76   Basic Conditions
   77======================================================================== */
   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
   91/*========================================================================
   92   Free Variable Check (main predicate)
   93========================================================================*/
   94
   95freeVarCheckDrs(Drs):-
   96   freeVarCheckDrs(Drs,[]-_).
   97
   98
   99/*========================================================================
  100   Free Variable Check (DRSs)
  101========================================================================*/
  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
  139/*========================================================================
  140   Free Variable Check (List of conditions)
  141========================================================================*/
  142
  143freeVarCheckConds([],_):- !.
  144
  145freeVarCheckConds([_:_:X|C],L):-
  146   freeVarCheckCond(X,L),
  147   freeVarCheckConds(C,L).
  148
  149
  150/*========================================================================
  151   Free Variable Check (Conditions)
  152========================================================================*/
  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
  205/*========================================================================
  206   Check Term
  207========================================================================*/
  208
  209checkTerm(X,L):- var(X), member(Y,L), X==Y, !.
  210checkTerm(X,_):- atomic(X), !