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
12
13sortalCheckDrs(B,Var):-
14 sortalCheckDrs(B,Var,[],P),
15 allconsistent(P).
16
17
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
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, !,
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
120
121allconsistent([]):- !.
122
123allconsistent([ref(Concepts)|L]):-
124 consistent(Concepts),
125 allconsistent(L).
126
127
131
132consistent([]):- !.
133
134consistent([_]):- !.
135
136consistent(L1):-
137 addSupConcepts(L1,L2),
138 \+ conflict(L2).
139
140
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
153
154addSuper([],L,L,[]).
155
156addSuper([X|L1],Accu,L2,[Y|Added]):-
157 isa(X,Y),
158 \+ member(Y,L1), \+ member(Y,Accu), !, 159 addSuper(L1,[X,Y|Accu],L2,Added). 160
161addSuper([X|L1],Accu,L2,Added):-
162 addSuper(L1,[X|Accu],L2,Added).
163
164
168
169conflict(L):-
170 member(X,L),
171 isnota(X,Y),
172 member(Y,L), !