2
8
9:- op(450,xfy,:). 10:- op(400,xfy,&). 11:- op(300,fx,~). 12:- op(200,xfx,--). 13
14i_sentence(q(S),question([],P)) :-
15 i_s(S,P,[],0).
16i_sentence(whq(X,S),question([X],P)) :-
17 i_s(S,P,[],0).
18i_sentence(imp(s(_,Verb,VArgs,VMods)),imp(V,Args)) :-
19 i_verb(Verb,V,_,active,pos,Slots0,[],transparent),
20 i_verb_args(VArgs,[],[],Slots0,Slots,Args,Args0,Up,-0),
21 list_conc(Up,VMods,Mods),
22 i_verb_mods(Mods,_,[],Slots,Args0,Up,+0).
23
24i_np(there,Y,quant(void,_X,~true,~true,[],Y),[],_,_,XA,XA).
25i_np(NP,Y,Q,Up,Id0,Index,XA0,XA) :-
26 i_np_head(NP,Y,Q,Det,Det0,X,Pred,QMods,Slots0,Id0),
27 held_arg(XA0,XA,Slots0,Slots,Id0,Id),
28 i_np_rest(NP,Det,Det0,X,Pred,QMods,Slots,Up,Id,Index).
29
30i_np_head(np(_,Kernel,_),Y,
31 quant(Det,T,Head,Pred0,QMods,Y),
32 Det,Det0,X,Pred,QMods,Slots,_Id) :-
33 i_np_head0(Kernel,X,T,Det0,Head,Pred0,Pred,Slots),
34 Type-_=Y, Type-_=T.
35
36i_np_rest(np(_,_,Mods),Det,Det0,X,Pred,QMods,Slots,Up,Id,Index) :-
37 index_args(Det0,Index,Id,Det,IndexA),
38 i_np_mods(Mods,X,Slots,Pred,QMods,Up,Id,IndexA).
39
40held_arg(held_arg(Case,-Id,X),[],S0,S,Id,+Id) :-
41 in_slot(S0,Case,X,Id,S,_).
42held_arg(XA,XA,S,S,Id,Id).
43
44i_np_head0(np_head(Det,Adjs,Noun),X,T,Det,Head0,Pred0,Pred,Slots) :-
45 i_adjs(Adjs,X,T,X,Head0,Head,Pred0,Pred),
46 i_noun(Noun,X,Head,Slots).
47i_np_head0(np_head(int_det(V),Adjs,Noun),
48 Type-X,Type-X,Det,~true,Pred,Pred,
49 [slot(prep(of),Type,X,_,comparator)]) :-
50 comparator(Noun,Type,V,Adjs,Det).
51i_np_head0(np_head(quant(Op0,N),Adjs,Noun),
52 Type-X,Type-X,void,~P,Pred,Pred,[]) :-
53 measure(Noun,Type,Adjs,Units),
54 conversion(N,Op0,Type,V,Op),
55 measure_op(Op,X,V--Units,P).
56i_np_head0(name(Name),
57 Type-Name,Type-Name,id,~true,Pred,Pred,[]) :-
58 name_template(Name,Type).
59i_np_head0(wh(X),X,X,id,~true,Pred,Pred,[]).
60
62i_np_mods(Mods,_,[],~true,[],Mods,_,_).
63i_np_mods([Mod|Mods],X,Slots0,Pred0,QMods0,Up,Id,Index) :-
64 i_np_mod(Mod,X,Slots0,Slots,
65 Pred0,Pred,QMods0,QMods,Up0,-Id,Index),
66 list_conc(Up0,Mods,Mods0),
67 i_np_mods(Mods0,X,Slots,Pred,QMods,Up,+Id,Index).
68i_np_mods(Mods,_,[Slot|Slots],~true,QMods,Mods,Id,_) :-
69 i_voids([Slot|Slots],QMods,Id).
70
71i_voids([],[],_).
72i_voids([Slot|Slots],[quant(void,X,~true,~true,[],_)|QMods],Id) :-
73 74 nominal_slot(Slot,X,-Id), !,
75 i_voids(Slots,QMods,+Id).
76i_voids([_|Slots],QMods,Id) :-
77 i_voids(Slots,QMods,Id).
78
79i_rel(rel(X,S),X,P&Pred,Pred,QMods,QMods,Up,Id) :-
80 i_s(S,P,Up,Id).
81i_rel(reduced_rel(X,S),X,Pred,Pred,[A|QMods],QMods,Up,Id) :-
82 i_s(S,A,Up,Id).
83i_rel(conj(Conj,Left,Right),X,
84 conj(Conj,LPred,LQMods,RPred,RQMods)&Pred,Pred,
85 QMods,QMods,Up,Id) :-
86 i_rel(Left,X,LPred,~true,LQMods,[],[],-Id),
87 i_rel(Right,X,RPred,~true,RQMods,[],Up,+Id).
88
89i_np_mod(pp(Prep,NP),
90 X,Slots0,Slots,Pred,Pred,[QMod|QMods],QMods,Up,Id0,Index0) :-
91 i_np_head(NP,Y,Q,LDet,LDet0,LX,LPred,LQMods,LSlots0,Id0),
92 i_bind(Prep,Slots0,Slots1,X,Y,Id0,Function,P,PSlots,XArg),
93 list_conc(PSlots,Slots1,Slots),
94 i_np_modify(Function,P,Q,QMod,Index0,Index),
95 held_arg(XArg,[],LSlots0,LSlots,Id0,Id),
96 i_np_rest(NP,LDet,LDet0,LX,LPred,LQMods,LSlots,Up,Id,Index).
97i_np_mod(Mod,X,Slots,Slots,Pred0,Pred,QMods0,QMods,Up,Id,_) :-
98 i_rel(Mod,X,Pred0,Pred,QMods0,QMods,Up,Id).
99
100i_noun(Noun,Type-X,P,Slots) :-
101 noun_template(Noun,Type,X,P,Slots).
102
103i_bind(Prep,Slots0,Slots,_,X,Id,arg,P,[],[]) :-
104 in_slot(Slots0,Case,X,Id,Slots,P),
105 deepen_case(Prep,Case).
106i_bind(prep(Prep),Slots,Slots,X,Y,_,adjoin,~P,PSlots,XArg) :-
107 i_adjoin(Prep,X,Y,PSlots,XArg,P).
108
109i_np_modify(adjoin,P,N,N&P,_,unit).
110i_np_modify(arg,F,N,N,Index0,Index) :-
111 index_slot(F,Index0,Index).
112
113in_slot([Slot|Slots],Case,X,Id,Slots,F) :-
114 slot_match(Slot,Case,X,Id,F).
115in_slot([Slot|Slots0],Case,X,Id,[Slot|Slots],F) :-
116 in_slot(Slots0,Case,X,Id,Slots,F).
117
118slot_match(slot(Case,Type,X,Id,F),Case,Type-X,Id,F).
119
120i_adjs([],_X,T,T,Head,Head,Pred,Pred).
121i_adjs([Adj|Adjs],X,T,T0,Head0,Head,Pred0,Pred) :-
122 i_adj(Adj,X,T,T1,Head0,Head1,Pred0,Pred1),
123 i_adjs(Adjs,X,T1,T0,Head1,Head,Pred1,Pred).
124
125i_adj(adj(Adj),Type-X,T,T,Head,Head,~P&Pred,Pred) :-
126 restriction(Adj,Type,X,P).
127i_adj(adj(Adj),TypeX-X,TypeV-V,_,
128 aggr(F,V,[X],Head,Pred),Head,~true,Pred) :-
129 aggr_adj(Adj,TypeV,TypeX,F).
130i_adj(sup(Op0,adj(Adj)),Type-X,Type-V,_,
131 aggr(F,V,[Y,X],Head,~P&Pred),Head,~true,Pred) :-
132 chat_sign(Adj,Sign),
133 inverse(Op0,Sign,Op),
134 i_sup_op(Op,F),
135 attribute(Adj,Type,X,_,Y,P).
142
143i_s(s(Subj,Verb,VArgs,VMods),Pred,Up,Id) :-
144 i_verb(Verb,P,Tense,Voice,Neg,Slots0,XA0,Meta),
145 i_subj(Voice,Subj,Slots0,Slots1,QSubj,SUp,-(-Id)),
146 list_conc(SUp,VArgs,TArgs),
147 i_verb_args(TArgs,XA0,XA,Slots1,Slots,Args0,Args,Up0,+(-Id)),
148 list_conc(Up0,VMods,Mods),
149 i_verb_mods(Mods,Tense,XA,Slots,Args,Up,+Id),
150 reshape_pred(Meta,QSubj,Neg,P,Args0,Pred).
151
152i_verb(verb(Root,Voice,Tense,_Aspect,Neg),
153 P,Tense,Voice,Det,Slots,XArg,Meta) :-
154 verb_template(Root,P,Slots,XArg,Meta),
155 i_neg(Neg,Det).
156
157reshape_pred(transparent,S,N,P,A,pred(S,N,P,A)).
158reshape_pred(have,Subj,Neg,Verb0,
159 [quant(Det,X,Head0,Pred,QArgs,Y)|MRest],
160 pred(Subj,Neg,Verb,[quant(Det,X,Head,Pred,QArgs,Y)|MRest])) :-
161 have_pred(Head0,Verb0,Head,Verb).
162
163have_pred(~Head,Verb,~true,(Head,Verb)).
164have_pred(Head,Verb,Head,Verb) :-
165 meta_head(Head).
166
167meta_head(apply(_,_)).
168meta_head(aggr(_,_,_,_,_)).
169
170i_neg(pos,id).
171i_neg(neg,not).
172
173i_subj(Voice,Subj,Slots0,Slots,Quant,Up,Id) :-
174 subj_case(Voice,Case),
175 verb_slot(arg(Case,Subj),[],[],Slots0,Slots,[Quant],[],Up,Id).
176
177i_verb_args(VArgs,XA0,XA,Slots0,Slots,Args0,Args,Up,Id) :-
178 fill_verb(VArgs,XA0,XA,Slots0,Slots,Args0,Args,Up,Id).
179
180subj_case(active,subj).
181subj_case(passive,s_subj).
182
183fill_verb([],XA,XA,Slots,Slots,Args,Args,[],_).
184fill_verb([Node|Nodes0],XA0,XA,Slots0,Slots,Args0,Args,Up,Id) :-
185 verb_slot(Node,XA0,XA1,Slots0,Slots1,Args0,Args1,Up0,-Id),
186 list_conc(Up0,Nodes0,Nodes),
187 fill_verb(Nodes,XA1,XA,Slots1,Slots,Args1,Args,Up,+Id).
188
189verb_slot(pp(Prep,NP),
190 XArg0,XArg,Slots0,Slots,[Q|Args],Args,Up,Id) :-
191 i_np(NP,X,Q,Up,Id,unit,XArg0,XArg),
192 in_slot(Slots0,Case,X,Id,Slots,_),
193 deepen_case(Prep,Case).
194verb_slot(void,XA,XA,Slots,Slots,Args,Args,[],_) :-
195 in_slot(Slots,pred,_,_,_,_).
196verb_slot(pp(prep(Prep),NP),
197 TXArg,TXArg,Slots0,Slots,[Q& ~P|Args],Args,Up,Id0) :-
198 in_slot(Slots0,pred,X,Id0,Slots1,_),
199 i_adjoin(Prep,X,Y,PSlots,XArg,P),
200 i_np_head(NP,Y,Q,LDet,LDet0,LX,LPred,LQMods,LSlots0,Id0),
201 held_arg(XArg,[],LSlots0,LSlots,Id0,Id),
202 i_np_rest(NP,LDet,LDet0,LX,LPred,LQMods,LSlots,Up,Id,free),
203 list_conc(PSlots,Slots1,Slots).
204verb_slot(arg(SCase,NP),
205 XArg0,XArg,Slots0,Slots,[Q|Args],Args,Up,Id) :-
206 i_np(NP,X,Q,Up,Id,unit,XArg0,XArg),
207 in_slot(Slots0,Case,X,Id,Slots,_),
208 deepen_case(SCase,Case).
214verb_slot(arg(pred,AP),XA,XA,Slots0,Slots,Args0,Args,Up,Id) :-
215 in_slot(Slots0,pred,X,Id,Slots,_),
216 i_pred(AP,X,Args0,Args,Up,Id).
217
218i_pred(conj(Conj,Left,Right),X,
219 [conj(Conj,~true,LQMods,~true,RQMods)|QMods],
220 QMods,Up,Id) :-
221 i_pred(Left,X,LQMods,[],[],-Id),
222 i_pred(Right,X,RQMods,[],Up,+Id).
223i_pred(AP,T,[~Head&Pred|As],As,[],_) :-
224 i_adj(AP,T,_,_,Head,true,Pred,~true).
225i_pred(value(adj(Adj),wh(TypeY-Y)),Type-X,[~H|As],As,[],_) :-
226 attribute(Adj,Type,X,TypeY,Y,H).
227i_pred(comp(Op0,adj(Adj),NP),X,[P1 & P2 & ~P3,Q|As],As,Up,Id) :-
228 i_np(NP,Y,Q,Up,Id,unit,[],[]),
229 chat_sign(Adj,Sign),
230 i_measure(X,Adj,Type,U,P1),
231 i_measure(Y,Adj,Type,V,P2),
232 inverse(Op0,Sign,Op),
233 measure_op(Op,U,V,P3).
234i_pred(pp(prep(Prep),NP),X,[~H,Q|As],As,Up,Id) :-
235 i_np(NP,Y,Q,Up,Id,unit,[],[]),
236 adjunction(Prep,X,Y,H).
237
238i_adjoin(with,TS-S,TV-Y,[slot(prep(of),TV,Z,_,free)],
239 held_arg(poss,-_Id,TS-S),
240 Y=Z).
241i_adjoin(Prep,X,Y,[],[],P) :-
242 adjunction(Prep,X,Y,P).
243
244i_measure(Type-X,Adj,Type,X,~true) :-
245 units(Adj,Type).
246i_measure(TypeX-X,Adj,TypeY,Y,quant(void,TypeY-Y,~P,~true,[],_)) :-
247 attribute(Adj,TypeX,X,TypeY,Y,P).
248
249i_verb_mods(Mods,_,XA,Slots0,Args0,Up,Id) :-
250 fill_verb(Mods,XA,[],Slots0,Slots,Args0,Args,Up,-Id),
251 i_voids(Slots,Args,+Id).
252
253 slot_tag(slot(_,Type,X,Id,_),Type-X,Id).
254
255nominal_slot(slot(Kind,Type,X,Id,_),Type-X,Id) :-
256 nominal_kind(Kind).
257
258nominal_kind(prep(_)).
259nominal_kind(poss).
260nominal_kind(subj).
261nominal_kind(dir).
262nominal_kind(ind).
263
264i_sup_op(least,min).
265i_sup_op(most,max).
266
267conversion(wh(Type-X),same,Type,X,id).
268conversion(nb(N),Op,_,N,Op).
269
270measure_op(id,X,X,true).
271measure_op(same,X,Y,X=Y).
272measure_op(less,X,Y,exceeds(Y,X)).
273measure_op(not+less,X,Y,\+exceeds(Y,X)).
274measure_op(more,X,Y,exceeds(X,Y)).
275measure_op(not+more,X,Y,\+exceeds(X,Y)).
276
277inverse(most,-,least).
278inverse(least,-,most).
279inverse(same,-,same).
280inverse(less,-,more).
281inverse(more,-,less).
282inverse(X,+,X).
283
284noun_template(Noun,TypeV,V,~P,
285 [slot(poss,TypeO,O,Os,index)|Slots]) :-
286 property(Noun,TypeV,V,TypeO,O,P,Slots,Os,_).
287noun_template(Noun,TypeV,V,aggr(F,V,[],~true,~true),
288 [slot(prep(of),TypeS,_,_,free)]) :-
289 aggr_noun(Noun,TypeV,TypeS,F).
290noun_template(Noun,Type,X,~P,Slots) :-
291 thing(Noun,Type,X,P,Slots,_).
292noun_template(Noun,TypeV,V,apply(F,P),
293 [slot(prep(of),TypeX,X,_,apply)]) :-
294 meta_noun(Noun,TypeV,V,TypeX,X,P,F).
295
296verb_template(have,Y=Z,
297 [slot(subj,TypeS,S,-Id,free),
298 slot(dir,TypeV,Y,_,free),
299 slot(prep(of),TypeV,Z,_,free)],
300 held_arg(poss,-(-(+Id)),TypeS-S), have).
301verb_template(have,Y=Z,
302 [slot(subj,TypeS,S,-(-(Id)),free),
303 slot(dir,TypeV,Y,_,free),
304 slot(prep(as),TypeV,Z,_,free)],
305 held_arg(poss,-(-(-(+Id))),TypeS-S), have).
306verb_template(Verb,Pred,
307 [slot(subj,TypeS,S,_,free)|Slots],[],transparent) :-
308 verb_type(Verb,_+Kind),
309 verb_kind(Kind,Verb,TypeS,S,Pred,Slots).
310
311verb_kind(be,_,TypeS,S,S=A,[slot(dir,TypeS,A,_,free)]).
312verb_kind(be,_,TypeS,S,true,[slot(pred,TypeS,S,_,free)]).
313verb_kind(intrans,Verb,TypeS,S,Pred,Slots) :-
314 intrans(Verb,TypeS,S,Pred,Slots,_).
315verb_kind(trans,Verb,TypeS,S,Pred,
316 [slot(dir,TypeD,D,SlotD,free)|Slots]) :-
317 trans(Verb,TypeS,S,TypeD,D,Pred,Slots,SlotD,_).
324deepen_case(prep(at),time).
325deepen_case(s_subj,dir).
326deepen_case(s_subj,ind).
327deepen_case(prep(by),subj).
328deepen_case(prep(to),ind).
329deepen_case(prep(of),poss).
330deepen_case(X,X).
331
334
335index_slot(index,I,I).
336index_slot(free,_,unit).
337index_slot(apply,_,apply).
338index_slot(comparator,_,comparator).
339
340index_args(det(the(plu)),unit,I,set(I),index(I)) :- !.
341index_args(int_det(X),index(I),_,int_det(I,X),unit) :- !.
342index_args(generic,apply,_,lambda,unit) :-!.
343index_args(D,comparator,_,id,unit) :-
344 ( indexable(D); D=generic), !.
345index_args(D,unit,_,D,unit) :- !.
346index_args(det(D),I,_,I,I) :-
347 indexable(D),
348 my_index(I), !.
349index_args(D,I,_,D,I).
350
351indexable(the(plu)).
352indexable(all).
353
354my_index(index(I)).
355
358
359list_conc([],L,L).
360list_conc([X|L1],L2,[X|L3]) :-
361 list_conc(L1,L2,L3)