2:- module(pdrs2drs,[pdrs2drs/2]). 3
6:- use_module(library(lists),[select/3,append/3]). 7
8
12
13pdrs2drs(PDRS,DRS):-
14 pdrs2drs(PDRS,[dom(g):[]-D,con(g):[]-C],Projected,B),
15 G = drs(D,C),
16 accommodate(Projected),
17 ( G = drs([],[]), !, DRS = B; DRS = merge(G,B) ).
18
19
23
24accommodate([]):- !.
25accommodate([dom(_):X-X|L]):- !, accommodate(L).
26accommodate([con(_):X-X|L]):- !, accommodate(L).
27
28
32
33pdrs2drs(lab(X,B1),G1,G2,lab(X,B2)):- !,
34 pdrs2drs(B1,G1,G2,B2).
35
36pdrs2drs(sub(B1,B2),G1,G3,sub(B3,B4)):- !,
37 pdrs2drs(B1,G1,G2,B3),
38 pdrs2drs(B2,G2,G3,B4).
39
40pdrs2drs(merge(B1,B2),G1,G3,merge(B3,B4)):- !,
41 pdrs2drs(B1,G1,G2,B3),
42 pdrs2drs(B2,G2,G3,B4).
43
44pdrs2drs(alfa(T,B1,B2),G1,G3,alfa(T,B3,B4)):- !,
45 pdrs2drs(B1,G1,G2,B3),
46 pdrs2drs(B2,G2,G3,B4).
47
48pdrs2drs(B:drs(D1,C1),G1,G3,drs(D2,C2)):- !,
49 dom2drs(D1,[dom(B):[]-D2|G1],G2),
50 cons2drs(C1,[con(B):[]-C2|G2],G3).
51
52pdrs2drs(sdrs(S1,C),G1,G2,sdrs(S2,C)):- !,
53 pdrs2drs(S1,G1,G2,S2).
54
55pdrs2drs([B1|L1],G1,G3,[B2|L2]):- !,
56 pdrs2drs(B1,G1,G2,B2),
57 pdrs2drs(L1,G2,G3,L2).
58
59pdrs2drs([],G,G,[]):- !.
60
61
65
66dom2drs([],G,G).
67
68dom2drs([B1:Ind1:Ref1|L],G1,G3):-
69 select(dom(B1),G1,G2,dom(B2):D1-D2),
70 select(Ind2:Ref2,D1,D3), Ref1 == Ref2, !,
71 append(Ind1,Ind2,Ind),
72 dom2drs(L,[dom(B2):[Ind:Ref1|D3]-D2|G2],G3).
73
74dom2drs([B1:Ind:Ref|L],G1,G3):-
75 select(dom(B1),G1,G2,dom(B2):D1-D2),
76 dom2drs(L,[dom(B2):[Ind:Ref|D1]-D2|G2],G3).
77
78
82
83cons2drs([],G,G).
84
85cons2drs([B1:Ind1:Con1|L],G1,G4):-
86 con2drs(Con1,G1,G2,Con2),
87 select(con(B1),G2,G3,con(B2):C1-C2),
88 select(Ind2:Con3,C1,C3), Con2 == Con3, !,
89 append(Ind1,Ind2,Ind),
90 cons2drs(L,[con(B2):[Ind:Con2|C3]-C2|G3],G4).
91
92cons2drs([B1:Ind:Con1|L],G1,G4):-
93 con2drs(Con1,G1,G2,Con2),
94 select(con(B1),G2,G3,con(B2):C1-C2),
95 cons2drs(L,[con(B2):[Ind:Con2|C1]-C2|G3],G4).
96
97
101
102con2drs(not(B1),G1,G2,not(B2)):- !,
103 pdrs2drs(B1,G1,G2,B2).
104
105con2drs(pos(B1),G1,G2,pos(B2)):- !,
106 pdrs2drs(B1,G1,G2,B2).
107
108con2drs(nec(B1),G1,G2,nec(B2)):- !,
109 pdrs2drs(B1,G1,G2,B2).
110
111con2drs(prop(X,B1),G1,G2,prop(X,B2)):- !,
112 pdrs2drs(B1,G1,G2,B2).
113
114con2drs(or(B1,B2),G1,G3,or(B3,B4)):- !,
115 pdrs2drs(B1,G1,G2,B3),
116 pdrs2drs(B2,G2,G3,B4).
117
118con2drs(imp(B1,B2),G1,G3,imp(B3,B4)):- !,
119 pdrs2drs(B1,G1,G2,B3),
120 pdrs2drs(B2,G2,G3,B4).
121
122con2drs(whq(B1,B2),G1,G3,whq(B3,B4)):- !,
123 pdrs2drs(B1,G1,G2,B3),
124 pdrs2drs(B2,G2,G3,B4).
125
126con2drs(duplex(X,B1,Y,B2),G1,G3,duplex(X,B3,Y,B4)):- !,
127 pdrs2drs(B1,G1,G2,B3),
128 pdrs2drs(B2,G2,G3,B4).
129
130con2drs(role(X,Y,Rel,1),G,G,rel(X,Y,Rel,0)):- !.
131
132con2drs(role(X,Y,Rel,-1),G,G,rel(Y,X,Rel,0)):- !.
133
134con2drs(C,G,G,C).
135
136
140
141select(dom(B1),G1,G2,dom(B1):C1-C2):-
142 select(dom(B2):C1-C2,G1,G2), B1==B2, !.
143
144select(dom(_),G1,G2,dom(g):C1-C2):-
145 select(dom(B):C1-C2,G1,G2), B==g, !.
146
147
151
152select(con(B1),G1,G2,con(B1):C1-C2):-
153 select(con(B2):C1-C2,G1,G2), B1==B2, !.
154
155select(con(_),G1,G2,con(g):C1-C2):-
156 select(con(B):C1-C2,G1,G2), B==g, !