17
22
23:- op(300,fx,'~'). 24
25cmdalias(d, down).
26cmdalias(e, east).
27cmdalias(i, inventory).
28cmdalias(l, look).
29cmdalias(n, north).
30cmdalias(s, south).
31cmdalias(u, up).
32cmdalias(goto, go).
33cmdalias(w, west).
34cmdalias(x, examine).
35cmdalias(z, wait).
36cmdalias(a, auto).
37
38cmdalias(whom,who).
39cmdalias(whois,who).
40
41cmdalias(turn, switch).
42cmdalias(flip, switch).
43
44preposition(_,P) :- notrace(member(P, [at, down, in, inside, into, of, off, on, onto, out, over, to, under, up, with])).
45
46preposition(_Other, P) :-
47 member(P, [of, beside]).
48
49compass_direction(D) :-
50 member(D, [north, south, east, west, up, down]).
51maybe_compass_direction(D, Actual) :- (cmdalias(D,Actual);D=Actual), compass_direction(Actual).
52
53reflexive_self(W) :- member(W, [self, me, myself , i]). 54
55strip_noise_words([to|Tokens], NewTokens) :- strip_noise_words(Tokens, NewTokens).
56strip_noise_words(Tokens, NewTokens) :-
57 findall(Token,
58 ( member(Token, Tokens),
59 \+ member(Token, ['please' )),
60 NewTokens).
61
62convert_reflexive_self(Agent, Words, NewWords) :-
63 64 findall(Token,
65 ( member(Word, Words),
66 ( reflexive_self(Word), Token = Agent;
67 Token = Word )),
68 NewWords).
69
70
72parse_command(_Self, NotList, Action, _Memory) :- \+ is_list(NotList), !, Action = NotList.
73parse_command(Doer, Tokens, Action, Memory) :-
74 (Tokens = [_] -> Tokens2 = Tokens ; strip_noise_words(Tokens, Tokens2)),
75 if_tracing((dmsg(parse_command(Doer, Tokens -> Tokens2)))),
76 parse2logical(Doer, Tokens2, Action, Memory).
77
78:- discontiguous(parse2logical/4). 79:- discontiguous(parse_imperative/4). 80
84
85
86:- nb_setval(parsemem,[inst(error)]). 87
88:- meta_predicate(with_parse_mem(*,0)). 89with_parse_mem(Mem, Goal):-
90 b_getval(parsemem,MemWas),
91 setup_call_cleanup(
92 b_setval(parsemem,Mem),
93 Goal,
94 b_setval(parsemem,MemWas)).
95
96
97parse2logical(_Self, NotList, Action, _) :- \+ is_list(NotList), !, Action = NotList.
98parse2logical(_Self, [NonAtom], Action, _) :- \+ atom(NonAtom), !, Action=NonAtom.
99parse2logical(Doer, [rtrace|Args], Action, M) :- Args\==[], !, rtrace(parse2logical(Doer, Args, Action, M)).
100parse2logical(Doer, [cls|Args], Action, M) :- Args\==[], !, cls, notrace(parse2logical(Doer, Args, Action, M)).
101parse2logical(Doer, [wait], wait(Doer), _Mem) :- !.
102parse2logical(Agent, [look], look(Agent), _).
103parse2logical(_Self, [Verb|Args], Action, _M) :- verbatum_anon(Verb), !,
104 Action =.. [Verb|Args].
105parse2logical(Doer, Tokens, Action, Mem) :-
106 with_parse_mem(Mem, phrase(parse_imperative(Doer, Action),Tokens, [])).
107
111
112self_prop(done_by,mem,memory).
113self_prop(object,props,props).
114
115parse_imperative(Doer, inspect(Doer,getprop(Target,PropPred))) --> [PropText], {self_prop(Type, PropText, PropPred)},!, parse_for_optional(Type,Target,Doer).
116
117
118parse_for_optional(Type, Target, _Else) --> parse_for(Type,Target).
119parse_for_optional(_Type, Else, Else) --> [].
120
121parse_for(_,_) --> [], !, {fail}.
122parse_for(agent,Target) --> !, parse_for(object,Target).
123parse_for(place,Target) --> !, parse_for(object,Target).
124parse_for(object,Target) --> {list_len_between(3,1,List)},List,{parse2object(List,Target,inst('player~1'))}.
127
128list_len_between(N,M,List):- length(List, N) ;
129 (N\=M , (N<M -> N2 is N+1 ; N2 is N-1), list_len_between(N2,M,List)).
130
131word_next_arg_type(who,done_by).
132word_next_arg_type(what,object).
133word_next_arg_type(where,place).
134
135parse_imperative(Doer, recall(Doer,Who,Target)) --> [Who], {word_next_arg_type(Who, Type)}, parse_for_optional(Type,Target, Doer).
136
137any_text(Text,Text,[]).
138
142parse_imperative(Doer, emote(Doer, Action)) --> [emote], parse_imperative(Doer, Action).
143
144parse_imperative(Doer, say(Doer, Text)) --> [say], any_text(Text).
145parse_imperative(Doer, emote(Doer, Say, Dest, Text)) --> [Ask], {ask_to_say(Ask,Say)}, parse2object(Dest), any_text(Text).
146
147ask_to_say(Ask,say):- arg(_,v(ask,say,request,tell,talk),Ask).
148
152parse_imperative(Doer, emote(Doer, say, Dest, Text)) --> parse_for(agent, Dest), [','], any_text(Text).
153
154
155parse2logical(Doer, Words, Action, M) :-
156 fail,
157 Words \== [i], 158 159 append(Before, [Doer|After], Words),
160 reflexive_self(Doer),
161 thought(inst(Agent), M),
162 append(Before, [Agent|After], NewWords),
163 parse2logical(Doer, NewWords, Action, M).
164
165parse2logical(Doer, Words, Action, M) :- parse_imperative_movement(Doer, Words, Action, M).
166
170parse2logical(Doer, [get| Args], TAKE, M) :- parse2logical(Doer, [take| Args], TAKE, M).
171parse2logical(Doer, [take, Object], take(Doer, Object), _Mem) :- !.
172
173
186acdb(F,A,B):- ttholds(F,A,B).
187acdb(F,A,B):- assertion_content(F,A,B,_).
188
189
191
192verb_formtense_str(GiveStr, RootStr, Else):-
193 acdb(baseForm, GiveTheWord, GiveStr),
194 acdb(posForms, GiveTheWord, xtVerb), !,
195 RootStr = GiveStr,
196 Else = baseForm.
197verb_formtense_str(GaveStr, GiveStr, Past):-
198 acdb(Past, GiveTheWord, GaveStr), Past \= inflVerb, Past \= baseForm,
199 acdb(posForms, GiveTheWord, xtVerb),
200 (acdb(baseForm, GiveTheWord, GiveStr);acdb(inflVerb, GiveTheWord, GiveStr)),
201 GaveStr\=GiveStr,!.
202
203verb_formtense_atom(Giving, Give, F-N):-
204 (F=transitive;F=intransitive),
205 quietly_talk_db([F,Give|Forms]),
206 nth0(N,Forms,Giving).
207verb_formtense_atom(Giving, Give, Past):-
208 clex_verb(Giving, Give,_, Past).
209
210
211verb_formtense(Var,_,_):- var(Var),!,fail.
212verb_formtense(Gave,Give,Past):- atom(Gave),
213 atom_string(Gave,GaveStr),
214 verb_formtense_str(GaveStr,GiveStr,Past),
215 atom_string(Give,GiveStr).
216verb_formtense(GaveStr,GiveStr,Past):- verb_formtense_str(GaveStr,GiveStr,Past).
217verb_formtense(Gave,Give,Past):- atom(Gave), !, verb_formtense_atom(Gave, Give, Past).
218verb_formtense(GaveStr,GiveStr,Past):-
219 atom_string(Gave,GaveStr),
220 verb_formtense_atom(Gave,Give,Past),
221 atom_string(Give,GiveStr).
222
223do_eval_or_same(G,GG):- \+ compound(G),!,GG=G.
224do_eval_or_same([G1|G2],[GG1|GG2]):- !, do_eval_or_same(G1,GG1), do_eval_or_same(G2,GG2).
225do_eval_or_same({O},{O}):- !.
226do_eval_or_same(G,GG):- compound_name_arguments(G,HT,[F|GL]), atom(F), member(HT,[t,h]), !,
227 compound_name_arguments(GM,F,GL),!,do_eval_or_same(GM,GG).
228
229do_eval_or_same(textString(P,G),textString(P,GG)):- ground(G),!, must(to_string_lc(G,GG)),!.
235do_eval_or_same(isa(P,G),isa(P,GG)):- ground(G),!, must(asCol(G,GG)),!.
236
237do_eval_or_same(xfn(P,G),GG):- !, must( call(P,G,GG)),!.
238do_eval_or_same(G,GG):- compound_name_arguments(G,F,GL), F\==percept_props, !,
239 maplist(do_eval_or_same,GL,GGL),!,compound_name_arguments(GG,F,GGL).
240do_eval_or_same(G,G).
241
242frame_var(_,Frame,_):- \+ compound(Frame),!,fail.
243frame_var(Name,Frame,Var):- nonvar(Var), !,frame_var(Name,Frame,NewVar),!,NewVar=Var.
244frame_var(Name,Frame,Var):- compound(Name), !, arg(_,Name,E), frame_var(E,Frame,Var), !.
245frame_var(Name,[Frame1|Frame2],Var):- !, frame_var(Name,Frame1,Var);frame_var(Name,Frame2,Var).
246frame_var(Name,Prop = Var,Var):- !, same_word(Name,Prop).
247frame_var(Name,f(Pred,1,[Var]),Var):- !, same_name(Name,Pred).
248frame_var(Name,f(_,_,[Prop|List]),Var):- !, same_name(Name,Prop),last(List,Var).
249frame_var(Name,Frame,Var):- compound_name_arity(Frame,Pred,Arity), Arity > 0, compound_name_arguments(Frame,Pred,List),
250 frame_var(Name,f(Pred,Arity,List),Var).
251frame_var(Name,Frame,Var):- arg(_,Frame,E), frame_var(Name,E,Var), !.
252
253asCol(A,A):- var(A),!.
254asCol(A,'TypeFn'(A)):- \+ callable(A),!.
255asCol(A,S):- format(atom(S),'~w',[A]).
256
257to_upcase_name(V,V):- var(V),!.
258to_upcase_name(T,N):- compound(T), !, compound_name_arity(T,A,_),!,to_upcase_name(A,N).
259to_upcase_name(T,N):- format(atom(A),'~w',[T]),upcase_atom(A,N).
260
261same_name(T1,T2):- ground(T1),ground(T2),to_upcase_name(T1,N1),to_upcase_name(T2,N2),!,N1==N2.
262
263push_frame(Info,Frame):- var(Frame), !, gensym(frame,F), Frame = [lbl(F)], push_frame(Info,Frame).
264push_frame(Info,Frame):- do_eval_or_same(Info,BetterInfo),Info\=@=BetterInfo,push_frame(BetterInfo,Frame).
265push_frame(Info,Frame):- member(Sub,Frame),Sub==Info,!.
266push_frame(Info,Frame):- Frame = [H|T], setarg(2,Frame,[H|T]),setarg(1,Frame,Info).
267
268
269
270assign_var_name(_Frame,with-using:Type,Var):- !,upcase_atom(Type,UP),debug_var(UP,Var),!.
271assign_var_name(_Frame,_-_:Type,Var):- atom(Type), !,debug_var(Type,Var),!.
272assign_var_name(Frame,_Prep-Prop:_Type,Var):- !,assign_var_name(Frame,Prop,Var),!.
273assign_var_name(Frame,Prop:_Type,Var):- !,assign_var_name(Frame,Prop,Var),!.
274assign_var_name(Frame,_Prep-Prop,Var):- !,assign_var_name(Frame,Prop,Var),!.
275assign_var_name(_Frame,Prop,Var):- debug_var(Prop,Var),!.
276
277add_dataframe_types([],[],_Frame,[]).
278add_dataframe_types([Prep-Prop:Type| FrameArgs], [NewArg|VarsOf], Frame, NextProps):-
279 push_frame(isa(NewArg,Type),Frame), !,
280 add_dataframe_types([Prep-Prop| FrameArgs], [NewArg|VarsOf] , Frame, NextProps).
281add_dataframe_types([PrepProp:Type| FrameArgs], [NewArg|VarsOf], Frame, NextProps):-
282 push_frame(isa(NewArg,Type),Frame), !,
283 add_dataframe_types([PrepProp| FrameArgs], [NewArg|VarsOf] , Frame, NextProps).
284add_dataframe_types([PrepProp| FrameArgs], [_|VarsOf], Frame,[PrepProp| NextProps]):-
285 add_dataframe_types(FrameArgs, VarsOf , Frame, NextProps).
286
287
288parse_dataframe(FrameArgs, VarsOf, Action, Frame, TextArgs):-
289 nth0(Nth,FrameArgs,Prep-Prop, NewFrameArgs), atom(Prop),
290 append(Left,[SamePrep, TextArg| Right], TextArgs),
291 same_word(Prep, SamePrep),!,
292 append(Left, Right, NewTextArgs),
293 nth0(Nth,VarsOf,NewArg,NewVarsOf),
294 push_frame(textString(NewArg,TextArg),Frame),
295 push_frame(t(Prop,Action, NewArg),Frame),
296 parse_dataframe(NewFrameArgs, NewVarsOf, Action, Frame, NewTextArgs).
297
298parse_dataframe(FrameArgs, VarsOf, Action, Frame, TextArgs):-
299 nth0(Nth,FrameArgs,Prop, NewFrameArgs), atom(Prop), Prep = Prop,
300 append(Left,[SamePrep, TextArg| Right], TextArgs),
301 same_word(Prep,SamePrep),!,
302 append(Left, Right, NewTextArgs),
303 nth0(Nth,VarsOf,NewArg,NewVarsOf),
304 delete(NewArg,VarsOf,NewVarsOf),
305 push_frame(textString(NewArg,TextArg),Frame),
306 push_frame(t(Prop,Action, NewArg),Frame),
307 parse_dataframe(NewFrameArgs, NewVarsOf, Action, Frame, NewTextArgs).
308
309parse_dataframe(FrameArgs, VarsOf, Action, Frame, TextArgs):-
310 make_dataframe_simple(FrameArgs ,TextArgs, VarsOf, Action, Frame).
311
312make_dataframe_simple([], [], _VarsOf, _Action, _Frame):- !.
313make_dataframe_simple([], TextArgs, VarsOf, Action, Frame):- !, push_frame(zexistsLeftOverText(VarsOf, Action,TextArgs),Frame).
314make_dataframe_simple(_FrameArgs, [], VarsOf, Action, Frame):- !, push_frame(zexistsLeftOver(VarsOf, Action),Frame).
315
316make_dataframe_simple([_Prep-Prop| FrameArgs],TextArgs, VarsOf, Action, Frame):- !,
317 make_dataframe_simple([Prop| FrameArgs],TextArgs, VarsOf, Action, Frame).
318
319make_dataframe_simple([Prop| FrameArgs],TextArgs, [NewArg|VarsOf], Action, Frame):- !,
320 Left = [],
321 append(Left,[TextArg| Right], TextArgs),
322 push_frame(textString(NewArg,TextArg),Frame),
323 push_frame(t(Prop,Action, NewArg),Frame),
324 append(Left, Right, NewTextArgs),
325 make_dataframe_simple(FrameArgs, NewTextArgs, VarsOf, Action, Frame).
326
327:- discontiguous(verb_frame1/5).
334verb_frame1(Action, give,
335 [does-done_by:tAnimate,to-recipient:tAnimate,some-objectActedOn:object,with-using:bpart],
336 [the,Doer,does,$verb,to,Recipient,the,Object,using,Instrument],
337 [done_by(Action,Doer),
338
339 normally(
340 isa(Instrument,tBodyPart),
341 cntrls(Doer, Instrument),
342 can_reach(Instrument, Recipient)),
343 pre(
344 cntrls(Doer, Object),
345 ~cntrls(Recipient, Object)),
346 post(
347 ~cntrls(Doer, Object),
348 cntrls(Recipient, Object)),
349 end_of_list]).
350
351
361
367
376
377
392verb_frame1(Action,etch,
393 [does-done_by:tAnimate,text-depliction:glyphic,on-target:surface,of-objectActedOn,with-using:tTool],
394 [the,Doer,does,$verb,some,Depliction,on,Surface,of,Object,using,Instrument],
395 [done_by(Action,Doer),
396 pre(isa(Instrument,tKnife),cntrls(Doer, Instrument),can_reach(Instrument, Object)),
397 part_of(Surface, Object),
398 ~pre(exists(Depliction)),
399 pre(~part_of(Depliction, Surface)),
400 post(part_of(Depliction, Surface))]).
401
402verb_frame1(Action,put,
403 [does-done_by:tAnimate,some-objectActedOn:object,to-region,of-container,with-using:bpart],
404 [the,Doer,does,$verb,some,Object,at,Region,of,Container,using,Instrument],
405 [done_by(Action,Doer),
406 cntrls(Doer, Instrument), can_reach(Instrument, Region),
407 part_of(Region, Container),
408 post(h(Region,Container,Object))]).
409
410
420
421verb_frame1(Action, dig,
422 [does-done_by:tAnimate,some-shape_of,on-faceOf:surfaceOf(Object),in-objectActedOn:tGround,with-using:tTool],
423 [the,Doer,does,$verb,some,ShapeHole,on,Surface,into,Object,using,Instrument],
424[done_by(Action,Doer),
425 normally(
426 isa(Instrument,tKnife),
427 cntrls(Doer, Instrument),
428 can_reach(Instrument, Surface)),
429 part_of(Surface, Object),
430 ~pre(exists(ShapeHole)),
431 pre(~part_of(ShapeHole, Object)),
432 post(part_of(ShapeHole, Object))]):- debug_var(tool,Instrument),debug_var(hole,ShapeHole).
433
434
435
436
437parse2logical(Doer, [VerbText|TextArgs], Frame, _Mem):-
438 439 verb_formtense(VerbText,VerbD,Tense) ->
440 verb_frame1(Action,Verb,DoerFrame,English,UNormals),
441 correct_normals(UNormals,Normals),
442 DoerFrame=[DoerAgent|FrameArgs],
443 term_variables(English,VarsOf),
444 all_different_bindings([Action|VarsOf]),
445 once(VerbText=Verb;same_word(VerbD,Verb)),
446 select(done_by(Action,Doer),Normals, Frame),
447 must_det((push_frame(isa(Action,'tAction'),Frame),
448 push_frame(textString(Action,VerbText),Frame),
449 push_frame(occurs(Action,Tense),Frame),
450 debug_var([Verb,'Event'],Action),
451 debug_var("Actor",Doer),
452 maplist(assign_var_name(Frame),[DoerAgent|FrameArgs],VarsOf),
453 add_dataframe_types([DoerAgent|FrameArgs], VarsOf, Frame, BetterFrameArgs),
454 parse_dataframe(BetterFrameArgs,VarsOf, Action, Frame, [Doer|TextArgs]),
455 pprint(Frame, always))).
456
457frmprint(Frame) :-
458 make_pretty2(Frame),
459 predsort(frcmp,Frame,FrameA),
460 reverse(FrameA,FrameO),
461 maplist(frmprint_e,FrameO).
462frmprint_e(Frame) :- format('~N ',[]),fmt90(Frame).
463
464sortDeref(P,PP):- \+ compound(P),!, P=PP.
466sortDeref(~(P),PP):-!,sortDeref(P,PP).
467sortDeref(P,PP):- arg(1,P,PP),compound(PP).
468sortDeref(P,PP):- functor(P,F,N),wrapper_funct_sortin(F),arg(N,P,E),!,sortDeref(E,PP).
469sortDeref(P,P).
470
471
472all_different_bindings([]):- !.
473all_different_bindings([_]):- !.
474all_different_bindings([X,Y]):- !, dif(X,Y).
475all_different_bindings([X,Y,Z]):- !, dif(X,Y),dif(X,Z),dif(Z,Y).
476all_different_bindings([X|Rest]):- maplist(dif(X),Rest),all_different_bindings(Rest).
477
478wrapper_funct_sortin(F):- arg(_,v(~,post,pre),F).
479wrapper_funct_correction(F):- arg(_,v(~,post,normally,pre),F).
480
481correct_normals(Nil,Nil):- Nil==[],!.
482correct_normals(EOL,[]):- EOL==end_of_list,!.
483correct_normals(UNormals,Normals):- \+ compound(UNormals),!,[UNormals]=Normals.
484correct_normals((U,UU),Normals):- !, correct_normals(U,UC),correct_normals(UU,UUC),!,append(UC,UUC,Normals).
485correct_normals([U|UU],Normals):- !, correct_normals(U,UC),correct_normals(UU,UUC),!,append(UC,UUC,Normals).
486correct_normals(P,Normals):- P=..[F,A1,A2|List],wrapper_funct_correction(F),
487 P1=..[F,A1], P2=..[F,A2|List], !,
488 correct_normals([P1|P2],Normals).
489correct_normals(Normal,[Normal]).
490
491frcmp(P1,P2,Cmp):- (\+ compound(P1) ; \+ compound(P2)),!, compare(P1,P2,Cmp).
492frcmp(P2,P1,Cmp):- sortDeref(P1,PP1)->P1\=@=PP1,!,frcmp(P2,PP1,Cmp).
493frcmp(P1,P2,Cmp):- sortDeref(P1,PP1)->P1\=@=PP1,!,frcmp(PP1,P2,Cmp).
494frcmp(P1,P2,Cmp):- N=1,arg(N,P1,F1),arg(N,P2,F2),F1==F2,!,compare(P1,P2,Cmp).
495frcmp(P1,P2,Cmp):- functor(P1,F1,_),functor(P2,F2,_),F1\==F2,compare(F1,F2,Cmp),Cmp \= (=),!.
496frcmp(P1,P2,Cmp):- arg(N,P1,F1),arg(N,P2,F2),frcmp(F1,F2,Cmp),Cmp \= (=),!.
497frcmp(P1,P2,Cmp):- compare(P1,P2,Cmp).
507verb_frame1(Action, bite,
508 [does-done_by:tAnimate,some-victem,with-using:teeth],
509 [the,Doer,does,$verb,the,Object,using,BPart],
510 [done_by(Action,Doer),
511 part_of(BPart, Doer),
512 can_reach(BPart, Object),
513 normally(isa(BPart,tBodyPart))]).
514
515verb_frame1(Action, like,
516 [does-done_by:tAnimate,some-targetObject,so-amount],
517 [the,Doer,does,$verb,the,Object,a,LotsOrLittle],
518 [done_by(Action,Doer),
519 feelsAbout(Doer,Object,LotsOrLittle)]).
520
521verb_frame1(Action, want,
522 [does-done_by:tAnimate,to-targetAction:action],
523 [the,Doer,does,$verb,want,to,AlsoDo],
524 [done_by(Action,Doer),
525 wantsToDo(Doer,Action,AlsoDo)]).
526
527
529bpart_contol(break,broken).
530bpart_contol(repair,unbroken).
531bpart_contol(light,lit).
532bpart_contol(unlight,unlit).
534verb_frame1(Action,Light,
535 \[does-done_by:tAnimate,some-objectActedOn,with-using:bpart],
536 [the,Doer,does,$verb,the,Object,using,Instrument],
537 [done_by(Action,Doer),
538 pre(cntrls(Doer, Instrument),can_reach(Instrument, Object)),
539 symetrically(opposite_values(Lit,Unlit)),
540 pre(status(Object,Unlit)),
541 pre(~status(Object,Lit)),
542 post(~status(Object,Unlit)),
543 post(status(Object,Lit)),
544 end_of_list]):- bpart_contol(Light,Lit).
545
546
547
548
550
551verb_frame1(Action,switch,
552 [does-done_by:tAnimate,some-objectActedOn,to-state:on_off,with-using:bpart],
553 [the,Doer,does,$verb,the,Object,to,On,using,Instrument],
554 [done_by(Action,Doer),
555 pre(cntrls(Doer, Instrument),can_reach(Instrument, Object)),
556 pre(position(Object,Off)),
557 pre(~position(Object,On)),
558 symetrically(opposite_values(On,Off)),
559 post(~position(Object,Off)),
560 post(position(Object,On)),
561 end_of_list]):- On = on.
562
563
565verb_undos(unlight,lit,bpart).
566verb_undos(close,opened,bpart).
567verb_undos(unlock,locked,key).
569verb_frame1(Action,Unlock,
570 [does-done_by:tAnimate,some-objectActedOn,with-using:Key],
571 [the,Doer,does,$verb,the,Object,using,Instrument],
572 [done_by(Action,Doer),
573 pre(cntrls(Doer, Instrument),can_reach(Instrument, Object)),
574 pre(status(Object,Locked)),
575 post(~status(Object,Locked))]):- verb_undos(Unlock,Locked,Key).
576
578verb_cantbe_causes(open,locked,opened).
580verb_frame1(Action,Open,
581 [does-done_by:tAnimate,some-objectActedOn,with-using:bpart],
582 [the,Doer,does,$verb,the,Object,using,Instrument],
583 [done_by(Action,Doer),
584 pre(cntrls(Doer, Instrument),can_reach(Instrument, Object)),
585 pre(~status(Object,Opened)),
586 pre(~status(Object,Locked)),
587 post(~status(Object,Locked)),
588 post(status(Object,Opened)),
589 end_of_list]):- verb_cantbe_causes(Open,Locked,Opened).
590
592verb_undos_causes1(lock,opened,locked,key).
594verb_frame1(Action,Lock,
595 [does-done_by:tAnimate,some-objectActedOn,with-using:Key],
596 [the,Doer,does,$verb,the,Object,using,Instrument],
597 [done_by(Action,Doer),
598 pre(cntrls(Doer, Instrument),can_reach(Instrument, Object)),
599 pre(~status(Object,Locked)),
600 post(~status(Object,StateOpened)),
601 post(status(Object,Locked)),
602 end_of_list]) :-
603 verb_undos_causes1(Lock,StateOpened,Locked,Key).
604
606verb_tool_ends_ensures(burn,match,unflaming,burned).
607verb_tool_ends_ensures(extinguish,extinguiser,flaming,unburned).
609verb_frame1(Action,Burn,
610 [does-done_by:tAnimate,some-objectActedOn,with-using:Match],
611 [the,Doer,does,$verb,the,Object, with, Instrument],
612 [done_by(Action,Doer),
613 pre(cntrls(Doer, Instrument),can_reach(Instrument, Object)),
614 symetrically(opposite_values(Unflaming, Flaming)),
615 pre(status(Object,Unflaming)),
616 post(~status(Object,Unflaming)),
617 post(status(Object,Flaming)),
618 symetrically(opposite_values(Burnt, Unburnt)),
619 post(~status(Object,Unburnt)),
620 post(status(Object,Burnt)),
621 end_of_list]):-
622 verb_tool_ends_ensures(Burn,Match,Unflaming,Burnt).
623
624
625
626
627parse2logical(Doer, [CmdAlias|Tail], Action, M) :-
628 cmdalias(CmdAlias, Verb),
629 parse2logical(Doer, [Verb|Tail], Action, M).
630
631
632
633parse2logical(Doer, [TheVerb|Args], Action, M) :- fail,
634 quietly_talk_db([F,Verb|Forms]),
635 notrace(F==intransitive;F==transitive),
636 member(TheVerb,Forms),!,
637 parse2logical(Doer, [Verb|Args], Action, M).
638
639parse2logical(Doer, [TheVerb|Args], Action, M) :- fail,
640 clex_verb(TheVerb,Verb,_,_),
641 Verb\==TheVerb,!,
642 parse2logical(Doer, [Verb|Args], Action, M).
643
644parse2logical(Doer, [Verb], Action, _M) :- Action=..[Verb,Doer], !.
645
646parse2logical(Doer, [Verb|TheArgs], Action, M) :-
647 args2logical(TheArgs, Args, M), wdmsg( TheArgs->Args), !,
648 Action =.. [Verb,Doer|Args].
649
650verbatum_anon(Verb):- member(Verb, [prolog, make, cls, mem, types, props, ls, debug, cd, pwd,
651 useragent, create, delprop, destroy, echo, halt, getprops,
652 memory, model, path, properties, setprop, state, status, perceptq, help, threads,
653 spy,nospy,call,
654 rtrace, nortrace,
655 trace, notrace 656 ]).
657
658
659parse2object(List,Agent,M):- append(LList,[R],List),member(R,[(?),(.)]),!,parse2object(LList,Agent,M).
660parse2object([am, i], Agent, M):- thought(inst(Agent), M), !.
661
662parse2object([BE| List], Agent, M):- fail, quietly_talk_db([_,BE,is|_More]), parse2object(List,Agent,M),!.
663parse2object([HAS| List], Agent, M):- fail, quietly_talk_db([_,have|HASHAVE]), member(HAS,HASHAVE), !, parse2object(List,Agent,M).
664parse2object([Det| Type], TheThing, M):-
665 (nth0(_N, [(unknown), the, thee, old, some, a], Det)), !,
666 parse2object(Type, TheThing, M).
667
668parse2object(Type, TheThing, M):-
669 show_call(as1object(Type, TheThing, M)), !.
670
671
672
673as1object([TheThing], Thing, M):- !, nonvar(TheThing), as1object(TheThing, Thing, M).
674as1object(TheThing, Thing, _Mem):- atom(TheThing), atom_number(TheThing,Thing),!.
675as1object(TheThing, Thing, M):- obj_props(M,Thing,Props),(same_word(TheThing,Thing)->true;(sub_term(Sub,Props),(atom(Sub);string(Sub)),same_word(TheThing,Sub))).
676as1object(TheThing, Thing, _Mem):- \+ atom(TheThing),!, TheThing=Thing.
677as1object(TheThing, Thing, M):- atom_of(inst, TheThing, Thing, M),!.
678as1object(TheThing, Thing, M):- get_advstate(Mem2),Mem2\=M,as1object(TheThing, Thing, Mem2).
680
681to_string_lc(A,S):- var(A),!,freeze(A,to_string_lc(A,S)).
682to_string_lc(S,L):- atomic(S), S\=[], !, string_lower(S,L).
683to_string_lc(S,L):- catch(text_to_string(L,S),_,fail),!, string_lower(S,L).
684to_string_lc(S,L):- is_list(S),!, maplist(to_string_lc,S,W),atomics_to_string(W,' ',L).
685to_string_lc(A,S):- format(string(S),'~w',[A]).
686
687same_word(T1,T2):- notrace((to_string_lc(T1,S1),to_string_lc(T2,S2),!,S1=S2)).
688same_verb(Verb,Text):- to_string_lc(Verb,LVerb),to_string_lc(Text,LText), atom_concat(LVerb,_,LText).
689
690same_props(Props1,Props1):- !.
691same_props(Props1,Props2):- each_prop(Props1,Prop1),each_prop(Props2,Prop2),same_prop(Prop1,Prop2).
692each_prop(Props,Prop):- is_list(Props),!,member(PropsZ,Props),each_prop(PropsZ,Prop).
693each_prop(PropC,Prop):- compound(PropC),PropC=Prop.
694
695
696obj_props(M,Obj,Props):- var(M),!,get_advstate(Mem2),obj_props(Mem2,Obj,Props).
697obj_props(M,Obj,Props):- nonvar(Obj),!,obj_props(M,Obj2,Props),Obj=@=Obj2.
698obj_props(M,Obj,Props):- nonvar(Props),!,obj_props_v(M,Obj,Props2),same_props(Props,Props2).
699obj_props(M,Obj,Props):- obj_props_v(M,Obj,Props).
700
701obj_props_v(M,_,_):- \+ compound(M),!,fail.
702obj_props_v(M,Obj,Props):- is_list(M),!,member(E,M),obj_props_v(E,Obj,Props).
703obj_props_v(props(Obj,Props),Obj,Props):- !.
704obj_props_v(percept_props(_,_,Obj,_,Props),Obj,Props):- !.
705obj_props_v(Term,Obj,Props):- arg(_,Term,M),obj_props_v(M,Obj,Props).
706
707same_prop(X,Y):- X=@=Y,X=Y.
708
709args2logical(TheArgs, [Thing], M):- parse2object(TheArgs, Thing, M),!. 710args2logical(TheArgs, TheArgs, _M).
711
712quietly_talk_db(L):- quietly(talk_db(L)).
713
714is_kind(Thing,inst):- get_advstate(M), member(props(Thing,_),M).
715is_kind(Thing,type):- get_advstate(M), member(type_props(Thing,_),M).
717
718atom_of(Kind,TheThing,Thing,M):- sub_term_atom(Thing,M),is_kind(Thing,Kind),TheThing==Thing,!.
719atom_of(Kind,TheThing,Thing,M):- sub_term_atom(Thing,M),is_kind(Thing,Kind),atom_concat(TheThing,_,Thing),!.
720atom_of(Kind,TheThing,Thing,M):- sub_term_atom(Thing,M),is_kind(Thing,Kind),atom_concat(_,TheThing,Thing),!.
721atom_of(Kind,TheThing,Thing,M):- sub_term_atom(Thing,M),is_kind(Thing,Kind),atom_contains(Thing,TheThing),!.
722
723
724sub_term_atom(Term, TermO):- \+ compound(Term), !, atom(Term), TermO = Term.
725sub_term_atom(Term, [Head|_]) :- nonvar(Head),
726 sub_term_atom(Term, Head).
727sub_term_atom(Term, [_|Tail]) :- !, nonvar(Tail),
728 sub_term_atom(Term, Tail).
729sub_term_atom(Term, T) :-
730 \+ is_list(T),
731 T =.. List,
732 sub_term_atom(Term, List).
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
771
772flee_run_escape(flee).
773flee_run_escape(run).
774flee_run_escape(escape).
775
777parse_imperative_movement(Doer, [get, Prep, Object], goto_prep_obj(Doer, walk, Prep, Object), _Mem) :- preposition(spatial, Prep).
779parse_imperative_movement(Doer, [Dir], Logic, M):- maybe_compass_direction(Dir,Actual), !, must_det(txt2goto(Doer, walk, [Actual], Logic, M)).
781parse_imperative_movement(Doer, [Escape|Info], Logic, M):- flee_run_escape(Escape), !, must_det(txt2goto(Doer, run, Info, Logic, M)).
783parse_imperative_movement(Doer, [Prep], Logic, M) :- preposition(spatial, Prep), !, must_det(txt2goto(Doer, walk, [Prep], Logic, M)).
785parse_imperative_movement(Doer, [go|Info], Logic, M):- !, must_det(txt2goto(Doer, walk, Info, Logic, M)).
787parse_imperative_movement(Doer, [ExitName], Logic, M) :-
788 in_agent_model(Doer, h(exit(ExitName), _, _), M), txt2goto(Doer, walk, [ExitName], Logic, M),!.
789parse_imperative_movement(Doer, [ExitName], go_dir(Doer, walk, ExitName), M) :-
790 in_agent_model(Doer, h(exit(ExitName), _Place, _), M).
791
792
793parse_imperative_movement(Doer, [get, Prep| More], Logic, M) :- preposition(spatial, Prep), !, must_det(txt2goto(Doer, walk, [Prep| More], Logic, M)).
794
797
798txt2goto(Doer, run, [], go_dir(Doer, run, escape), _Mem) :- !.
799txt2goto(Doer, Walk,[to, Prep| More], Logic, M) :- !, txt2goto(Doer, Walk, [Prep| More], Logic, M).
800txt2goto(Doer, Walk,[Alias| More], Logic, M) :- cmdalias(Alias,Dir), !, txt2goto(Doer, Walk,[Dir| More], Logic, M).
801
804txt2goto(Doer, Walk,[ Prep, Dest], goto_prep_obj(Doer, Walk, Prep, Where), M) :-
805 preposition(spatial, Prep),!,
806 must_det(txt2place(Dest, Where, M)).
807
809txt2goto(Doer, Walk,[ ExitName], go_dir(Doer, Walk, ExitName), M) :-
810 in_agent_model(Doer, h(exit(ExitName), _, _), M).
812txt2goto(Doer, Walk,[ Dir], go_dir(Doer, Walk, Dir), _Mem) :- (compass_direction(Dir);Dir==escape),!.
813txt2goto(Doer, Walk,[ Dir], go_dir(Doer, Walk, Dir), _Mem) :- (Dir=down;Dir==up),!.
815txt2goto(Doer, Walk,[ Prep], go_dir(Doer, Walk, Prep), _Mem) :- preposition(spatial, Prep).
817txt2goto(Doer, Walk, Dest, goto_loc(Doer, Walk, Where), M) :-
818 txt2place(Dest, Where, M).
819
820
821txt2place(List, Place, M):- is_list(List), parse2object(List,Object,M), txt2place(Object, Place, M),!.
822txt2place(Dest, Place, M):- in_agent_model(advstate, h(_, _, Dest), M), Dest = Place.
823txt2place(Dest, Place, M):- in_agent_model(advstate, h(_, Dest, _), M), Dest = Place.
824txt2place(Dest, Place, M):- parse2object(Dest, Place, M)