13
14
15:- dynamic(kb_index/1). 16
17:- op(850,fx,~). 18:- op(900,xfy,'#'). 19:- op(900,xfy,&). 20:- op(950,xfy,->). 21
22
23
24:- dynamic seed1/1. 25
27
28a_concat(S1,S2,S):-
29 name(S1,L1),name(S2,L2),append(L1,L2,L),
30 name(S,L).
31
32
33seed1(0).
34
35concat1(S1,S2,S):-
36 name(S1,L1),name(S2,L2),append(L1,L2,L),
37 name(S,L).
38
39
40translate_ind(ind(_A,Name,Ind),S):- S=..[Name,Ind].
41
44translate_cgraph(Id,Formula):- var(Id),!, isCG(Id),translate_cgraph(Id,Formula).
45translate_cgraph(Id,Formula):- number(Id),!,cg(Id,Rels,A,B),translate_cgraph(cg(Id,Rels,A,B),Formula).
46translate_cgraph(cg(Id,Rels,A,B),Formula):-
47 expand_names(cg(Id,Rels,A,B),cg(Id,Rels1,A,B)),
48 translate_cg(cg(Id,Rels1,A,B),Formula).
49
50translate_cg(cg(_,Rels,_,_),Formula):-
51 get_concepts_pred(Rels,CIDs),
52 assign_varsn_pred(CIDs,ListIdsConcs),
53 make_formula(Rels,ListIdsConcs,FormulaBody),
54 make_cg_prefix1(ListIdsConcs,Formula, FormulaBody),guess_varnames(Formula).
55
56expand_names(cg(Id,Rels,A,B),cg(Id,Rels1,A,B)):-
57 get_named_concepts(Rels,CIDs),
58 add_relations(CIDs,Relations),
59 append(Rels,Relations,Rels1).
60
61add_relations([],[]).
62add_relations([Id|Next],[Rel|Next1]):-
63 cgc(Id,_,_,Ref,_),ground(Ref),
64 member(fs(name,Name),Ref),
65 kb_index(X),
66 X1 is X+1,
67 assert(ind(X1,word,Name)),
68 retract(kb_index(X)),
69 assert(kb_index(X1)),
70 Rel=cgr(name,[Id,X1],_),
71 add_relations(Next,Next1).
72
73
74
75get_named_concepts([],[]).
76
77get_named_concepts([cgr(_,Ids,_)|Next],List) :-
78 get_named_concepts(Next,List1),
79 get_n_concepts(Ids,Ids1),
80 append3_pred(Ids1,List1,List).
81
82get_n_concepts([],[]).
83
84get_n_concepts([Id|Next],[Id|Next1]):-
85 cgc(Id,simple,_,Ref,_),ground(Ref),
86 member(fs(name,_),Ref),
87 \+ member(fs(num,pl),Ref),!,
88 get_n_concepts(Next,Next1).
89
90get_n_concepts([_|Next],Next1):-
91 get_n_concepts(Next,Next1).
92
93get_concepts_pred([],[]).
94
95get_concepts_pred([cgr(_,Ids,_)|Next],List) :-
96 get_concepts_pred(Next,List1),
97 append3_pred(Ids,List1,List).
98
99assign_vars([],[]).
100assign_vars([Id|Next],[Id-_Var|NextVars]):-
101 cgc(Id,simple,_,_,_),!,
102 assign_vars(Next,NextVars).
103
104assign_vars([Id|Next],[ind-Id|NextVars]):-
105 ind(Id,_,_),
106 assign_vars(Next,NextVars).
107
108
109assign_vars([Id|Next],[cg-Id|NextVars]):-
110 cgc(Id,situation,_,_,_),
111 assign_vars(Next,NextVars).
112assign_varsn_pred([],[]).
113assign_varsn_pred([Id|Next],[Id-Var|NextVars]):-
114 cgc(Id,_,_,_,_),!,next_var_pred(Var),
115 assign_varsn_pred(Next,NextVars).
116assign_varsn_pred([Id|Next],[_Var-Id|NextVars]):-
117 assign_varsn_pred(Next,NextVars).
118
119
120next_var_pred(_):- !.
121next_var_pred(?(Var)):- retract(seed1(N)),
122 N1 is N+1,
123 assert(seed1(N1)),
124 concat1('a',N,Var).
125
126
127
128
129append3_pred([],L,L).
130append3_pred([H|T],L,Lresult):-member(H,L),!,
131 append3_pred(T,L,Lresult).
132
133append3_pred([H|T],L,[H|Lresult]):- append3_pred(T,L,Lresult).
134
135
136make_cg_prefix1([] ,F,F).
137make_cg_prefix1([Id-_Var|Next],F,F1):- (Id=ind;Id=cg),!, make_cg_prefix1(Next,F,F1).
138make_cg_prefix1([Id-Var|Next],F,F1):- cgc(Id,simple,Name,Refs,_),ground(Refs),
139 member(fs(quant,every),Refs),
140 \+ member(fs(number,pl),Refs),!,
141 T=..[Name,Var],
142 F=..[all,Var,F2],
143 F2=..[->, T ,F3],
144 make_cg_prefix1(Next,F3,F1).
145
146make_cg_prefix1([_Id-Var|Next],F,F1):- F2=..[exists,Var,F1],
147 make_cg_prefix1(Next,F,F2).
148
149
150make_formula([cgr(Rname,Ids,_)|OtherRels],ListIdsConcs,F):-
151 make_formula(OtherRels,ListIdsConcs,F1),!,
152 construct_term(Rname,Ids,ListIdsConcs,Term),
153 ( F1=[] -> F=Term;
154 F=.. [&, Term, F1]).
155
156make_formula([],[Id- _Var|Next],F):-
157 make_formula([],Next,F1),
158 cgc(Id,_,_Name,Refs,_),
159 sing_every(Refs),!,
160 F=F1.
161
162make_formula([],[Id-Var|Next],F):-
163 make_formula([],Next,F1),
164 cgc(Id,_,Name,_,_),!,
165 construct_term(Name,[Id],[Id-Var],Term),
166 ( F1=[] -> F=Term;
167 F=.. [&, Term, F1]).
168
169make_formula([],[_Var-Id|Next],F):-
170 make_formula([],Next,F1),
171 ind(Id,Type,Ind),!,
172 Term=..[Type,Ind],
173 ( F1=[] -> F=Term;
174 F=.. [&, Term, F1]).
175
176
177make_formula([],[_Var-Id|Next],F):-
178 cgc(Id,situation,_,[_GID],_),
179 make_formula([],Next,F).
180
181
182
183make_formula([],[],[]).
184
185
186
187construct_term(not,[Id],_ListIdsConcs,Term) :- !,
188 cgc(Id,situation,_,[GID],_),
189 cg(GID,Rels,A,B),
190 translate_cgraph(cg(GID,Rels,A,B),Term1),
191 Term=..[~, Term1].
192
193construct_term(and,[Id1,Id2],_ListIdsConcs,Term) :- !,
194 cgc(Id1,situation,_,[GID1],_),
195 cg(GID1,Rels1,A1,B1),
196 translate_cgraph(cg(GID1,Rels1,A1,B1),Term1),
197 cgc(Id2,situation,_,[GID2],_),
198 cg(GID2,Rels2,A2,B2),
199 translate_cgraph(cg(GID2,Rels2,A2,B2),Term2),
200 Term=..[&, Term1,Term2].
201
202construct_term(Rname,Ids,ListIdsConcs,Term) :-
203 length(Ids,1),
204 Ids=[Id],
205 cgc(Id,simple,Rname,Refs,_),
206 member(fs(num,pl),Refs),
207 member(Id-Var,ListIdsConcs),
208 M=..[Rname,'X'],
209 Term=(every('X',member('X',Var)->M)&set(Var)).
210
211
212
213construct_term(Rname,Ids,ListIdsConcs,Term) :-
214 length(Ids,N), functor(Term,Rname,N),
215 insert_args(Term,Ids,ListIdsConcs,1).
216
217insert_args(Term,[Id|Next],ListIdsConcs,Num):- member(Id-Var,ListIdsConcs),
218 arg(Num,Term,Var),Num1 is Num + 1,
219 insert_args(Term,Next,ListIdsConcs,Num1).
220
221insert_args(Term,[Id|Next],ListIdsConcs,Num):- ind(Id,_Type,Ind),
222 arg(Num,Term,Ind),Num1 is Num + 1,
223 insert_args(Term,Next,ListIdsConcs,Num1).
224
225insert_args(Term,[Id|Next],ListIdsConcs,Num):- cgc(Id,situation,Dummy,_,_),
226 arg(Num,Term,Dummy),Num1 is Num + 1,
227 insert_args(Term,Next,ListIdsConcs,Num1).
228
229
230insert_args(_Term,[],_,_).
231
232sing_every(Refs):- ground(Refs),
233 member(fs(quant,every),Refs),
234 \+ member(fs(num,pl),Refs).
235
236
237
238make_string_f(F,S):-
239 functor(F,Name,1),
240 arg(1,F,Arg),
241 make_string_f(Arg,S4),
242 a_concat('(',S4,S5),
243 a_concat(S5,')',S6),
244 a_concat(Name,S6,S).
245
246make_string_f(F,S):-
247 functor(F,A,2),
248 member(A,[&,'#','->']),!,
249 arg(1,F,Arg),
250 make_string_f(Arg,S4),
251 a_concat(S4,' ',S5),
252 a_concat(S5,A,S51),
253 a_concat(S51,' ',S52),
254 arg(2,F,Arg2),
255 make_string_f(Arg2,S6),
256 a_concat(S52,S6,S).
257
258make_string_f(F,S):-
259 functor(F,Name,2),
260 arg(1,F,Arg),
261 make_string_f(Arg,S4),
262 a_concat(S4,',',S5),
263 arg(2,F,Arg2),
264 make_string_f(Arg2,S6),
265 a_concat(S5,S6,S7),
266 a_concat('(',S7,S8),
267 a_concat(S8,')',S9),
268 a_concat(Name,S9,S).
269
270
271make_string_f(F,F):- atom(F).
272
273
274
275
276
277translate_pred_id(Id,F):- check_fol_graph(Id),!,
278 cg(Id,A,B,C),translate_cgraph(cg(Id,A,B,C),F1),
279 make_string_f(F1,F).
280
281translate_pred_id(_Id,F):- F='This graph can not be translated to First Order Predicate Calculus'.
282
283check_fol_graph(Id):- cg(Id,A,_B,_C),member(Rel,A),Rel=cgr(Name,Args,_),
284 member(Id1,Args),
285 cgc(Id1,situation,_,_,_),
286 \+(member(Name,[and,or,not])),!, fail.
287
288check_fol_graph(_).
289
290
291:- fixup_exports.