2:- module(sortalCheck,[sortalCheckDrs/2]).    3
    4:- use_module(knowledge(ontology),[isa/2,isnota/2]).    5:- use_module(knowledge(title),[title/3]).    6:- use_module(library(lists),[member/2,select/3]).    7
    8
    9/*========================================================================
   10   Sortal Check (main)
   11========================================================================*/
   12
   13sortalCheckDrs(B,Var):-
   14   sortalCheckDrs(B,Var,[],P),  
   15   allconsistent(P).
   16
   17
   18/*========================================================================
   19   Sortal Check (DRSs)
   20========================================================================*/
   21
   22sortalCheckDrs(_:drs([],C),Var,P1,P2):- !,
   23   sortalCheckConds(C,Var,P1,P2).
   24
   25sortalCheckDrs(K:drs([_:_:X|D],C),Var,P1,P2):- 
   26   X == Var, !,
   27   sortalCheckDrs(K:drs(D,C),Var,[ref([])|P1],P2).
   28
   29sortalCheckDrs(drs([_|D],C),Var,P1,P2):- !,
   30   sortalCheckDrs(drs(D,C),Var,P1,P2).
   31
   32sortalCheckDrs(merge(B1,B2),Var,P1,P3):- !,
   33   sortalCheckDrs(B1,Var,P1,P2),
   34   sortalCheckDrs(B2,Var,P2,P3).
   35
   36sortalCheckDrs(alfa(_,B1,B2),Var,P1,P3):- !,
   37   sortalCheckDrs(B1,Var,P1,P2),
   38   sortalCheckDrs(B2,Var,P2,P3).
   39
   40
   41/*========================================================================
   42   Sortal Check (DRS-Conditions)
   43========================================================================*/
   44
   45sortalCheckConds([],_,P,P):- !.
   46
   47sortalCheckConds([_:Cond|C],Var,P1,P2):- !,
   48   sortalCheckConds([Cond|C],Var,P1,P2).
   49
   50sortalCheckConds([not(drs([],[_:eq(X,Y)]))|_],_,_,_):- 
   51   X==Y, !, fail.
   52
   53sortalCheckConds([not(B)|C],Var,P1,P3):- !,
   54   sortalCheckDrs(B,Var,P1,P2),
   55   sortalCheckConds(C,Var,P2,P3).
   56
   57sortalCheckConds([nec(B)|C],Var,P1,P3):- !,
   58   sortalCheckDrs(B,Var,P1,P2),
   59   sortalCheckConds(C,Var,P2,P3).
   60
   61sortalCheckConds([pos(B)|C],Var,P1,P3):- !,
   62   sortalCheckDrs(B,Var,P1,P2),
   63   sortalCheckConds(C,Var,P2,P3).
   64
   65sortalCheckConds([prop(_,B)|C],Var,P1,P3):- !,
   66   sortalCheckDrs(B,Var,P1,P2),
   67   sortalCheckConds(C,Var,P2,P3).
   68
   69sortalCheckConds([imp(B1,B2)|C],Var,P1,P4):- !,
   70   sortalCheckDrs(B1,Var,P1,P2),
   71   sortalCheckDrs(B2,Var,P2,P3),
   72   sortalCheckConds(C,Var,P3,P4).
   73
   74sortalCheckConds([duplex(_,B1,_,B2)|C],Var,P1,P4):- !,
   75   sortalCheckDrs(B1,Var,P1,P2),
   76   sortalCheckDrs(B2,Var,P2,P3),
   77   sortalCheckConds(C,Var,P3,P4).
   78
   79sortalCheckConds([or(B1,B2)|C],Var,P1,P4):- !,
   80   sortalCheckDrs(B1,Var,P1,P2),
   81   sortalCheckDrs(B2,Var,P2,P3),
   82   sortalCheckConds(C,Var,P3,P4).
   83
   84sortalCheckConds([pred(X,Sym,_,_)|C],Var,[ref(Ps)|P1],P2):-
   85   X == Var, !,
   86%   select(ref(Ps),P1,P2), !,
   87   sortalCheckConds(C,Var,[ref([Sym|Ps])|P1],P2).
   88
   89sortalCheckConds([pred(_,_,_,_)|C],Var,P1,P2):-  
   90   sortalCheckConds(C,Var,P1,P2).
   91
   92sortalCheckConds([named(X,Title,_,ttl)|C],Var,P1,P3):-  
   93   X == Var,
   94   title(_,Title,Sym),  
   95   select(ref(Ps),P1,P2), !,
   96   sortalCheckConds(C,Var,[ref([Sym|Ps])|P2],P3).
   97
   98sortalCheckConds([named(_,_,_,_)|C],Var,P1,P2):-  
   99   sortalCheckConds(C,Var,P1,P2).
  100
  101sortalCheckConds([rel(_,_,_,_)|C],Var,P1,P2):-  
  102   sortalCheckConds(C,Var,P1,P2).
  103
  104sortalCheckConds([role(_,_,_,_)|C],Var,P1,P2):-  
  105   sortalCheckConds(C,Var,P1,P2).
  106
  107sortalCheckConds([card(_,_,_)|C],Var,P1,P2):-  
  108   sortalCheckConds(C,Var,P1,P2).
  109
  110sortalCheckConds([timex(_,_)|C],Var,P1,P2):-  
  111   sortalCheckConds(C,Var,P1,P2).
  112
  113sortalCheckConds([eq(_,_)|C],Var,P1,P2):-  
  114   sortalCheckConds(C,Var,P1,P2).
  115
  116
  117/*========================================================================
  118   Consistency Check (all referents)
  119========================================================================*/
  120
  121allconsistent([]):- !.
  122
  123allconsistent([ref(Concepts)|L]):-  
  124   consistent(Concepts),
  125   allconsistent(L).
  126
  127
  128/*========================================================================
  129   Consistency Check
  130========================================================================*/
  131
  132consistent([]):- !.
  133
  134consistent([_]):- !.
  135
  136consistent(L1):- 
  137   addSupConcepts(L1,L2),
  138   \+ conflict(L2).
  139
  140
  141/*========================================================================
  142   Add super concepts (by iteration until fixed point is reached)
  143========================================================================*/
  144
  145addSupConcepts(C1,C3):- addSuper(C1,[],C2,Add), addSupConcepts(Add,C2,C3).
  146addSupConcepts([],C1,C2):- !, C2=C1.
  147addSupConcepts(_,C1,C2):- addSupConcepts(C1,C2).
  148
  149
  150/*========================================================================
  151   Add super concepts (one cycle)
  152========================================================================*/
  153
  154addSuper([],L,L,[]).
  155
  156addSuper([X|L1],Accu,L2,[Y|Added]):-
  157   isa(X,Y),
  158   \+ member(Y,L1), \+ member(Y,Accu), !,  % if not yet added
  159   addSuper(L1,[X,Y|Accu],L2,Added).       % then add concept
  160
  161addSuper([X|L1],Accu,L2,Added):-
  162   addSuper(L1,[X|Accu],L2,Added).
  163
  164
  165/*========================================================================
  166   Check for a conflict
  167========================================================================*/
  168
  169conflict(L):-
  170   member(X,L),
  171   isnota(X,Y),
  172   member(Y,L), !