1/*
    2% NomicMUD: A MUD server written in Prolog
    3%
    4% Some parts used Inform7, Guncho, PrologMUD and Marty's Prolog Adventure Prototype
    5% 
    6% July 10,1996 - John Eikenberry 
    7% Copyright (C) 2004 Marty White under the GNU GPL
    8% 
    9% Dec 13, 2035 - Douglas Miles
   10%
   11%
   12% Logicmoo Project changes:
   13%
   14% Main file.
   15%
   16*/
   17
   18% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   19% CODE FILE SECTION
   20% :- ensure_loaded('adv_eng2cmd').
   21% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   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]). % 'i' inteferes with inventory
   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' /* , 'the', 'at', 'a', 'an', 'some', 'thee'*/])),
   60   NewTokens).
   61
   62convert_reflexive_self(Agent, Words, NewWords) :-
   63 % Substitute Agent for 'self'.
   64 findall(Token,
   65   ( member(Word, Words),
   66   ( reflexive_self(Word), Token = Agent;
   67    Token = Word )),
   68   NewWords).
   69
   70
   71% -- parse(Doer, WordList, ActionOrQuery, Memory)
   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
   81% %%%%%%%%%%%%%%
   82% parser tracing            
   83% %%%%%%%%%%%%%%
   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
  108% %%%%%%%%%%%%%%
  109% Introspection
  110% %%%%%%%%%%%%%%
  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'))}.
  125%parse_for(place, Dest)--> in_agent_model(Dest, h(_, _, Dest)).
  126%parse_for(place, Dest)--> in_agent_model(Dest, h(_, Dest, _)).
  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
  139% %%%%%%%%%%%%%%
  140% Communication
  141% %%%%%%%%%%%%%%
  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
  149% %%%%%%%%%%%%%%
  150% Communication
  151% %%%%%%%%%%%%%%
  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], % Dont interfere with inventory
  158 % If not talking to someone else, substitute Agent for 'self'.
  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
  167% %%%%%%%%%%%%%%
  168% Take
  169% %%%%%%%%%%%%%%
  170parse2logical(Doer, [get| Args], TAKE, M) :- parse2logical(Doer, [take| Args], TAKE, M).
  171parse2logical(Doer, [take, Object], take(Doer, Object), _Mem) :- !.
  172
  173
  174% %%%%%%%%%%%%%%
  175% Give
  176% %%%%%%%%%%%%%%
  177/*verb(give,
  178 [human(Doer),done_by(Doer, Action),
  179  frame(Action), act_of(give, Action),
  180  inanimate(Object),objectActedOn(Object, Action),
  181  human(Recipient),recipient(Recipient, Action) ] ).
  182*/
  183%lac(verbSemTrans, xGiveTheWord, 0, xDitransitiveNPNPFrame, and(objectGiven('ACTION', 'OBJECT'), isa('ACTION', actGivingSomething), giver('ACTION', 'SUBJECT'), givee('ACTION', 'OBLIQUE-OBJECT')), 2046576).
  184%lac(infinitive, xGiveTheWord, "give", 638997)
  185% talkdb:talk_db(transitive, give, gives, gave, giving, given).
  186acdb(F,A,B):- ttholds(F,A,B).
  187acdb(F,A,B):- assertion_content(F,A,B,_).
  188
  189
  190%acdb(Past, 'TTWord_Give', "gave")
  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)),!.
  230/*
  231do_eval_or_same(PEG,PEGG):- notrace((compound_name_arguments(PEG,F,Args),downcase_atom(F,D),(atom_concat(_,'text',D);atom_concat(_,'string',D)), 
  232  append(Left,[G],Args))),ground(G), \+ string(G), !, must(to_string_lc(G,GG)),!,
  233  append(Left,[GG],NewArgs),compound_name_arguments(PEGG,F,NewArgs).
  234*/
  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). 
  328% to sally give love
  329% to sally does player1 give love
  330% did player1 give love to sally?
  331% give sally love
  332% give love to sally
  333% give sally some love
  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
  352% player~1 etches name onto the tree's bark with a knife
  353% etch name on tree knife
  354% write name in book with pen
  355% 
  356% surface 
  357%    tree
  358%    on tree
  359%    in tree
  360%    at tree
  361
  362%    at bark
  363%    at tree bark
  364%    on tree bark
  365%    in tree bark
  366%    at bark of tree
  367
  368%    trunk of tree
  369% ======================
  370%    under trunk of tree
  371%    on trunk of tree
  372%    in trunk of tree
  373%    at trunk of tree
  374%    lower part of trunk of tree
  375%    in part of trunk of tree
  376
  377
  378%    on tree = on tree trunk = on tree bark
  379%    at tree trunk = under tree bark
  380%    book
  381%    on book
  382%    in book
  383%    at book
  384%    at book page
  385%    on book page
  386%    in book page
  387%    at page of book
  388%    at page
  389%    at book cover
  390%    at cover of book
  391% 
  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
  411% %%%%%%%%%%%%%%
  412% Dig
  413% %%%%%%%%%%%%%%
  414/*
  415parse2logical(Agent, [dig, ShapeHole], dig(Agent, ShapeHole, Where, Instrument), M) :- fail,
  416 in_agent_model(Agent, inst(Agent), M),
  417 in_agent_model(Agent, h(_, Agent, Where), M),
  418 Instrument=shovel.
  419*/
  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    %talkdb:talk_db(transitive, give, gives, gave, giving, given).     
  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.
  465%sortDeref(isa(X,Y),visa(X,Y)):-!.
  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).
  498%parse2logical(Doer, [give, Object, to, Recipient], give(Doer, Object, Recipient), _Mem):- !.
  499/*
  500verb(bite, 
  501 [tAnimate(Doer), done_by(Doer, Action),
  502  frame(Action), act_of(Action, biting), 
  503  tAnimate(Object), object(Object, Action),
  504  type_of(Instrument, teeth), using(Instrument, Action), 
  505  part_of(Instrument, Doer) ] ).
  506*/
  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
  528% %%%%%%%%%%%%%%
  529bpart_contol(break,broken).
  530bpart_contol(repair,unbroken).
  531bpart_contol(light,lit).
  532bpart_contol(unlight,unlit).
  533% %%%%%%%%%%%%%%
  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
  549%parse2logical(Doer, [switch, Thing, OnOff], Result, M) :- preposition(_, OnOff), !, parse2logical(Doer, [switch, OnOff, Thing], Result, M).
  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
  564% %%%%%%%%%%%%%%
  565verb_undos(unlight,lit,bpart).
  566verb_undos(close,opened,bpart).
  567verb_undos(unlock,locked,key).
  568% %%%%%%%%%%%%%%
  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
  577% %%%%%%%%%%%%%%
  578verb_cantbe_causes(open,locked,opened).
  579% %%%%%%%%%%%%%%
  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
  591% %%%%%%%%%%%%%%
  592verb_undos_causes1(lock,opened,locked,key).
  593% %%%%%%%%%%%%%%
  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
  605% %%%%%%%%%%%%%%
  606verb_tool_ends_ensures(burn,match,unflaming,burned).
  607verb_tool_ends_ensures(extinguish,extinguiser,flaming,unburned).
  608% %%%%%%%%%%%%%%
  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 %, %whereami, whereis, whoami
  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).
  679% as1object(Thing, Thing, _Mem).
  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),!. % TheArgs\==[Thing],!.
  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).
  716%is_kind(Thing,inst):- 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
  768% %%%%%%%%%%%%%%
  769% Movement
  770% %%%%%%%%%%%%%%
  771
  772flee_run_escape(flee).
  773flee_run_escape(run).
  774flee_run_escape(escape).
  775
  776% get [out,in,..] Object
  777parse_imperative_movement(Doer, [get, Prep, Object], goto_prep_obj(Doer, walk, Prep, Object), _Mem) :- preposition(spatial, Prep).
  778% n/s/e/w/u/d
  779parse_imperative_movement(Doer, [Dir], Logic, M):- maybe_compass_direction(Dir,Actual), !, must_det(txt2goto(Doer, walk, [Actual], Logic, M)).
  780% escape/flee/run .. 
  781parse_imperative_movement(Doer, [Escape|Info], Logic, M):- flee_run_escape(Escape), !, must_det(txt2goto(Doer, run, Info, Logic, M)).
  782% out/into
  783parse_imperative_movement(Doer, [Prep], Logic, M) :- preposition(spatial, Prep), !, must_det(txt2goto(Doer, walk, [Prep], Logic, M)).
  784% go .. 
  785parse_imperative_movement(Doer, [go|Info], Logic, M):- !, must_det(txt2goto(Doer, walk, Info, Logic, M)).
  786% outside
  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
  795% x shelf~1
  796% go on shelf~1
  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
  802% go in kitchen
  803% go in car
  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
  808% go north
  809txt2goto(Doer, Walk,[ ExitName], go_dir(Doer, Walk, ExitName), M) :-
  810 in_agent_model(Doer, h(exit(ExitName), _, _), M).
  811% go escape
  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),!.
  814% go [out,in,..] 
  815txt2goto(Doer, Walk,[ Prep], go_dir(Doer, Walk, Prep), _Mem) :- preposition(spatial, Prep).
  816% go kitchen
  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)