1/* *
    2 module
    3% Writer NPC_Interface  for supporting inforation based actions
    4%
    5%
    6% Douglas Miles
    7% Dec 13, 2035
    8%
    9%
   10*/
   11% :-swi_module(world_text,[]).
   12%      default_repl_obj_to_string/3,default_repl_writer/4,show_kb_via_pred/3,show_kb_preds/2,show_kb_preds/3,wasSuccess/2
   13:- include(prologmud(mud_header)).   14
   15% :-export(eng_fully_expand/2).
   16
   17%:- expects_dialect(prolog).
   18
   19when_command_show(Agent,ActionType):- 
   20  findall(Show,on_command_show(Agent,ActionType,Show),MORELOOK),
   21  (MORELOOK==[] -> true;
   22 (must(mudAtLoc(Agent,LOC)),show_kb_preds(Agent,LOC,MORELOOK))).
   23 
   24
   25% ===========================================
   26% generatePhrase_local(+Term,-English).
   27% Generate english version of a message
   28% ===========================================
   29:-export(generatePhrase_local/2).   30
   31:- multifile lmconf:term_to_message_string/2.   32:- dynamic lmconf:term_to_message_string/2.   33
   34lmconf:term_to_message_string(T,T):-var(T),!.
   35lmconf:term_to_message_string(T,T):-!.
   36lmconf:term_to_message_string(txtConcatFn(T),M):-on_x_debug(generatePhrase_local(T,M)),!.
   37lmconf:term_to_message_string(fmt(T),M):-on_x_debug(generatePhrase_local(T,M)),!.
   38lmconf:term_to_message_string(C,C):-compound(C),functor(C,F,_),is_leave_alone_msg(F),!.
   39lmconf:term_to_message_string((T),M):-on_x_fail(generatePhrase_local(T,M)),!.
   40lmconf:term_to_message_string(T,T):-!.
   41
   42is_leave_alone_msg(exact_message).
   43is_leave_alone_msg(todo).
   44is_leave_alone_msg((error)).
   45is_leave_alone_msg(parserm).
   46% is_leave_alone_msg(F):- is_db_prop(F,_,_),!,fail.
   47is_leave_alone_msg(A):-on_x_fail((sub_atom(A,_,1,0,S),atom_number(S,_))),!.
   48
   49prologBuiltin(term_anglify_args/6).
   50prologBuiltin(term_anglify_last/2).
   51:-export(term_anglify_args/6).   52% :-export(term_anglify_last/2).
   53
   54term_anglify_last(Head,English):-compound(Head),
   55   functor(Head,F,A),A>1,
   56   not(ends_with_icase(F,"Fn")),not(starts_with_icase(F,"SKF-")),
   57   atom_codes(F,[C|_]),code_type(C,lower),
   58   Head=..[F|ARGS],
   59   term_anglify_args(Head,F,A,ARGS,prologSingleValued,English).
   60
   61:- discontiguous(baseKB:mudTermAnglify/2).   62prologDynamic(baseKB:mudTermAnglify/2).
   63baseKB:mudTermAnglify(A,B):-mudTermAnglify0(A,B).
   64
   65mudTermAnglify0(A,B):-local_term_anglify(A,B).
   66
   67mudTermAnglify0(Head,EnglishO):- compound(Head), 
   68   Head=..[F|ARGS],mpred_prop(F,_,Info),
   69   member(Info,[prologSingleValued,predArgMulti(_)]),   
   70   term_anglify_args(Head,F,1,ARGS,Info,English),eng_fully_expand(English,EnglishO),!.
   71
   72mudTermAnglify0(verbFn(isa),[is,a]):-!.
   73mudTermAnglify0(verbFn(F),[is|UL]):-not(string_lower(F,F)),unCamelCase(F,U),atomics_to_string(UL,"_",U).
   74mudTermAnglify0(verbFn(F),[is,F]):-atom_concat(_,'ing',F).
   75mudTermAnglify0(verbFn(F),[F,is]).
   76% term_anglify(ftCallable(Term),String):-term_to_atom(Term,Atom),any_to_string(Atom,String).
   77mudTermAnglify0(determinerString(Obj,Text),[posNP(Obj),is,uses,ftString(Text),as,a,determiner]).
   78mudTermAnglify0(nameString(Obj,Text),[posNP(Obj),is,refered,to,as,ftString(Text)]).
   79mudTermAnglify0(mudTermAnglify(Term,Text),[ftCallable(Term),is,converted,to,english,using,ftCallable(Text)]).
   80
   81
   82
   83term_anglify_args(Head,F,A,ARGS,predArgMulti(Which),English):- !,replace_nth_arglist(ARGS,Which,NewVar,NEWARGS),!,
   84   NewHead=..[F|NEWARGS], findall(NewVar,req1(NewHead),ListNewVar),list_to_set_safe(ListNewVar,SetNewVar),NewVar=ftListFn(SetNewVar),
   85   term_anglify_args(Head,F,A,NewHead,prologSingleValued,English).
   86
   87
   88/*
   89
   90term_expansion((term_anglify_args(_Head,F,A,ARGS0,prologSingleValued,English):- add_arg_parts_of_speech(F,1,ARGS0,ARGS),verb_after_arg(F,A,After),
   91   insert_into(ARGS,After,verbFn(F),NEWARGS),
   92   eng_fully_expand(NEWARGS,English),X),O).
   93
   94*/
   95term_anglify_args(_Head,F,A,ARGS0,prologSingleValued,English):- add_arg_parts_of_speech(F,1,ARGS0,ARGS),verb_after_arg(F,A,After),
   96               insert_into(ARGS,After,verbFn(F),NEWARGS),
   97               eng_fully_expand(NEWARGS,English),!.
   98
   99unCamelCase(S,String):-any_to_string(S,Str),S\=Str,!,unCamelCase(Str,String),!.
  100unCamelCase("",""):-!.
  101unCamelCase(S,String):-sub_string(S,0,1,_,Char),sub_string(S,1,_,0,Rest),unCamelCase(Rest,RestString),string_lower(Char,NewChar),
  102(Char\=NewChar->atomics_to_string(['_',NewChar,RestString],String);atomics_to_string([Char,RestString],String)),!.
  103
  104term_anglify_np_last(Obj,T,String):- local_term_anglify_np_last(Obj,T,String).
  105
  106generatePhrase_local(Term,String):- on_x_debug(( eng_fully_expand(Term,EnglishM),!,
  107          % fmt('FR0=~q~n',[eng_fully_expand(Term,EnglishM)]),
  108          eng_fully_expand(EnglishM,EnglishG),fix_grammar(EnglishG,English) , join_for_string(English,String))),!.
  109
  110local_grammar_correction([are,is,"here"],[are,"here"]).
  111local_grammar_correction(["you",is],["you",are]).
  112local_grammar_correction(["you",Verb,is],[your,Verb,is]).
  113
  114local_grammar_correction([at,"right"],["right"]).
  115local_grammar_correction([tRoom,are],[tRoom,is]).
  116local_grammar_correction([in,tRegion,"here"],[is,"here"]).
  117local_grammar_correction([X,X],[X]):-member(X,[is,are]).
  118 
  119get_grammar_correction(C1,C2):-
  120   local_grammar_correction(W1,W2),to_word_list(W1,C1),to_word_list(W2,C2).
  121
  122
  123fix_grammar(String,WordsO):-to_word_list(String,Ws),fix_grammar_0(Ws,Words),(Words\=Ws->fix_grammar_0(Words,WordsO);Words=WordsO),!.
  124
  125fix_grammar_0([],[]).
  126fix_grammar_0(EnglishG,English):-
  127   get_grammar_correction(Before,After),
  128   append_ci(Before,Rest,EnglishG),
  129   append_ci(After,Rest,EnglishNew),
  130   fix_grammar_0(EnglishNew,English),!.
  131fix_grammar_0([Carry|EnglishG],[Carry|English]):-
  132   fix_grammar_0(EnglishG,English),!.
  133
  134join_for_string(English,EnglishS):-on_x_fail(( flatten([English],EnglishF),list_to_atomics_list(EnglishF,EnglishA),atomics_to_string(EnglishA," ",EnglishS))),!.
  135join_for_string(English,English).
  136
  137list_to_atomics_list(L,AL):-list_to_atomics_list0(L,AL),forall(member(E,AL),must(atomic(E))).
  138
  139list_to_atomics_list0(Var,A):-var(Var),!,any_to_string(Var,A),!.
  140list_to_atomics_list0([E|EnglishF],[A|EnglishA]):-
  141   any_to_string(E,A),
  142   list_to_atomics_list0(EnglishF,EnglishA),!.
  143list_to_atomics_list0([],[]):-!.
  144
  145
  146eng_fully_expand(I,O):-loop_check(transitive(eng_fully_expand_ilc,I,O),I=O).
  147eng_fully_expand_ilc(I,O):-copy_term(I,C),flatten([C],FC),eng_fully_expand_0(FC,O).
  148
  149eng_fully_expand_0(FC,O):-catch(eng_fully_expand_1(FC,O),E,(dtrace,dmsg(exact_message(error_m(E,eng_fully_expand_1(FC,O)))),fail)),!.
  150%eng_fully_expand_0(FC,O):-catch((trace,eng_fully_expand_1(FC,O)),_,fail).
  151
  152eng_fully_expand_1(A,B):-loop_check(eng_fully_expand_1_ilc(A,B),A=B).
  153
  154eng_fully_expand_1_ilc(Var,Var):-var(Var),!.
  155eng_fully_expand_1_ilc([],[]):-!.
  156% eng_fully_expand_1(StringIsError,_Out):-string(StringIsError),!,dtrace,fail.
  157eng_fully_expand_1_ilc([T|TT],FTAO):-local_term_anglify_first([T|TT],TA),flatten([TA],FTA),eng_fully_expand_1(FTA,FTAO),!.
  158eng_fully_expand_1_ilc([T|Term],Out):-!,
  159   eng_fully_expand_2(T,E),
  160   eng_fully_expand_1(Term,English),
  161   flatten_append(E,English,Out),!.
  162
  163eng_fully_expand_1_ilc(T,E):-loop_check(eng_fully_expand_2(T,E),(T=E)),!.
  164
  165eng_fully_expand_2(Var,Var):-var(Var),!.
  166eng_fully_expand_2([],[]):-!.
  167eng_fully_expand_2(Var,Var):-not(compound(Var)),!.
  168eng_fully_expand_2(T,FTAO):-local_term_anglify_first(T,TA),flatten([TA],FTA),eng_fully_expand_1(FTA,FTAO).
  169eng_fully_expand_2(StringIsOK,StringIsOK):-string(StringIsOK),!.
  170eng_fully_expand_2([T|Term],Out):-!,
  171   eng_fully_expand_2(T,E),
  172   eng_fully_expand_1(Term,English),
  173   flatten_append(E,English,Out),!.
  174eng_fully_expand_2(Pred,Pred):-!.
  175eng_fully_expand_2(Pred,Out):-
  176   safe_univ(Pred,[F|ARGS]),
  177   eng_fully_expand_1_l(ARGS,NEWARGS),
  178   safe_univ(Out,[F|NEWARGS]),!.
  179
  180eng_fully_expand_1_l([],[]):-!.
  181eng_fully_expand_1_l([T|Term],[E|English]):-!,
  182   eng_fully_expand_1(T,E),
  183   eng_fully_expand_1_l(Term,English).
  184
  185
  186best_nl_phrase(List,Sorted):-predsort(best_nl_phrase,List,Sorted).
  187
  188% longest_string(?Order, @Term1, @Term2)
  189best_nl_phrase(Order,TStr1,TStr2):-
  190   any_to_string(TStr1,Str1),string_length(Str1,L1),
  191   any_to_string(TStr2,Str2),string_length(Str2,L2),
  192   compare(Order,L1-Str1,L2-Str2).
  193
  194is_phrase_type(posNP).
  195
  196prologBuiltin(local_term_anglify/2).
  197prologBuiltin(local_term_anglify_first/2).
  198prologBuiltin(local_term_anglify_last/2).
  199% prologBuiltin(local_term_anglify_np/2).
  200prologBuiltin(enter_term_anglify/2).
  201prologBuiltin(term_anglify_np_last/2).
  202
  203% ========================================
  204% enter_term_anglify(MASK)
  205% ========================================
  206
  207enter_term_anglify(X,Y):-var(X),copy_term(X,Y),!.
  208enter_term_anglify(X,Y):-findall(X-Y-Body,clause( mudTermAnglify(X,Y),Body),List),member(X-Y-Body,List),call(Body),!.
  209enter_term_anglify(X,Y):-findall(X-Y-Body,clause( term_anglify_np(X,Y),Body),List),member(X-Y-Body,List),call(Body),!.
  210enter_term_anglify(X,Y):-findall(X-Y-Body,clause( term_anglify_last(X,Y),Body),List),member(X-Y-Body,List),call(Body),!.
  211enter_term_anglify(X,Y):-findall(X-Y-Body,clause( term_anglify_np_last(X,Y),Body),List),member(X-Y-Body,List),call(Body),!.
  212enter_term_anglify(X,X).
  213
  214
  215local_term_anglify_first(T,TA):-compound(T),loop_check(local_term_anglify(T,TA)),!.
  216% local_term_anglify_first(FmtObj,String):-compound(FmtObj),functor(FmtObj,Fmt,_),corece(FmtObj,Fmt,String),!.
  217local_term_anglify_first(T,TA):-must(enter_term_anglify(T,TA)),!.
  218
  219
  220
  221% :-export(local_term_anglify/2).
  222local_term_anglify(Var,O):- var(Var),!,O=[ftCallable(Var)].
  223% local_term_anglify([Var],O):- var(Var),!,O=[ftCallable([Var])].
  224
  225local_term_anglify(posNP(P),English):- local_term_anglify_np(P,English).
  226local_term_anglify(noun_phrase(P),English):- local_term_anglify_np(P,English).
  227
  228local_term_anglify(actNotice(Who,What),[posNP(Who),notices,What]).
  229local_term_anglify(fN(Region,tRegion),[(String)]):- call_u(nameString(Region,String)),!.
  230local_term_anglify(fN(Region,tRegion),[nameString1(String)]):- holds_t(nameString,Region,String),!.
  231
  232
  233local_term_anglify([P|L],English):-!, local_term_anglify(P,PE),local_term_anglify(L,LE),!,flatten_append(PE,LE,English),!.
  234
  235local_term_anglify(HOLDS,English):-HOLDS=..[H,Pred,A|MORE],atom(Pred),is_holds_true(H),HOLDS2=..[Pred,A|MORE],!,local_term_anglify(HOLDS2,English).
  236local_term_anglify(HOLDS,[A,verbFn(Pred)|MORE]):-HOLDS=..[H,Pred,A|MORE],is_holds_true(H),!.
  237local_term_anglify(HOLDS,English):-HOLDS=..[H,Pred,A|MORE],is_holds_false(H),atom(Pred),HOLDS2=..[Pred,A|MORE],!,local_term_anglify(not(HOLDS2),English).
  238local_term_anglify(HOLDS,[false,that,A,verbFn(Pred)|MORE]):-HOLDS=..[H,Pred,A|MORE],is_holds_false(H),!.
  239local_term_anglify(not(HOLDS),[false,that,English]):-!,local_term_anglify(HOLDS,English).
  240local_term_anglify(notFound(FNum,F,Type),[no,FNum,TypeC,'-s',for,FC]):-copy_term(notFound(F,Type),notFound(FC,TypeC)),ignore(TypeC=tCol),ignore(FC='whatever').
  241local_term_anglify(NPO,String):-NPO=..[NP,Obj],is_phrase_type(NP),!,enter_term_anglify(fN(Obj,NP),String).
  242
  243local_term_anglify(fN(Obj,argIsaFn(_PathName,_NumTwo)),String):- enter_term_anglify(Obj,String),!.
  244local_term_anglify(cmdresult(Cmd,Whatnot),["the","command","result","of",Cmd,"is",Whatnot]):-!.
  245local_term_anglify(string(Obj),[String]):-on_x_fail(any_to_string(Obj,StringUQ)),atomics_to_string(['"',StringUQ,'"'],"",String).
  246% enter_term_anglify(ftCallable(Obj),string(String)):-on_x_fail(any_to_string(Obj,StringUQ)),atomics_to_string(['(',StringUQ,')'],"",String).
  247local_term_anglify(mudAtLoc(Obj,LOC),String):-eng_fully_expand( [fN(Obj,posNP),is,at,fN(LOC,posNP)],String).
  248local_term_anglify(mudDescription(Obj,Term),[fN(Obj,posNP),"description","contains",":",string(Term)]).
  249local_term_anglify(fN(Obj,X),String):- locationToRegion(Obj,Region), Obj \= Region, enter_term_anglify(fN(Region,X),String),!.
  250% should not have searched nouns yet
  251local_term_anglify(fN(Obj,T),String):- local_term_anglify_np(Obj,T,String),!.
  252
  253local_term_anglify(done(Obj,Term),[fN(Obj,posNP),did,:,Term]).
  254local_term_anglify(failed(Obj,Term),[fN(Obj,posNP),didnt,:,Term]).
  255local_term_anglify(do(Obj,Term),[fN(Obj,posNP),begun,:,Term]).
  256
  257
  258% almost all else failed
  259local_term_anglify(fN(Obj,T),String):- anglify_noun_known(Obj,T,String),!.
  260
  261% totally all else failed
  262% %enter_term_anglify(ftCallable(Obj),String):- any_to_string(Obj,StringUQ),!,atomics_to_string(['',StringUQ,''],"",String),!.
  263% %enter_term_anglify(Obj,Obj):-!.
  264
  265
  266term_anglify_np(Obj,Hint,String):-local_term_anglify_np(Obj,Hint,String).
  267
  268local_term_anglify_np(Obj,String):-isa(Obj,Isa),local_term_anglify_np(Obj,Isa,String),!.
  269local_term_anglify_np(Obj,String):-local_term_anglify_np(Obj,ftTerm,String).
  270
  271% specific noun searching
  272local_term_anglify_np(Obj,Hint,String):- anglify_noun_known(Obj,Hint,String),!.
  273local_term_anglify_np(Obj,vtDirection,Obj):- !.
  274local_term_anglify_np(string(Obj),string,Obj):- !.
  275local_term_anglify_np(Obj,string,Obj):- !.
  276
  277local_term_anglify_np_last(Obj,Hint,String):- anglify_noun_known(Obj,Hint,String),!.
  278local_term_anglify_np_last(Obj,FT,String):- ttExpressionType(FT),correctFormatType(change(assert,_),Obj,FT,String),!.
  279local_term_anglify_np_last(Obj,Type,[prolog(Obj)]):-ttExpressionType(Type),!.
  280local_term_anglify_np_last(Obj,Type,["the",Type,ftCallable(Obj)]):-!.
  281local_term_anglify_np_last(apathFn(Region,Dir),_,["a",fN(Dir,vtDirection),"-ern","way","from",fN(Region,posNP)]):-!.
  282local_term_anglify_np_last(Obj,Type,[prolog(Obj),fN,Type]):-!.
  283local_term_anglify_np_last(Obj,_,["the",noun,with,token,Obj]):-!.
  284
  285:-ain_expanded(==>prologBuiltin(anglify_noun_known,3)).
  286
  287% anglify_noun_known(Self,_Hint,["you"]):- current_agent(Self),!.
  288anglify_noun_known(Obj,FT,String):- ttExpressionType(FT),correctFormatType(change(assert,_),Obj,FT,String),!.
  289anglify_noun_known(StringO,_Hint, [StringO]).
  290anglify_noun_known(Obj,_Hint,["right","here"]):- current_agent(Self),mudAtLoc(Self,Obj),!.
  291anglify_noun_known(Obj,_Hint,["here"]):- current_agent(Self),req1(localityOfObject(Self,Obj)),!.
  292anglify_noun_known(Obj,_Hint,StringO):- findall(String,holds_t(nameString,Obj,String),List),List\=[],sort_by_strlen(List,[StringO|_]),!.
  293%anglify_noun_known(Obj,_Hint,String):-
  294%nameString(X,Y,_,_)
  295
  296%:- expects_dialect(prolog).
  297
  298
  299
  300detWithSpace(WithSpace,String):-ddeterminer0(String),atom_concat(String,' ',WithSpace).
  301detWithSpace(WithSpace,String):-ddeterminer1(String),atom_concat(String,' ',WithSpace).
  302
  303:-export(determinerRemoved/3).  304determinerRemoved(S0,Det,S):- fail,detWithSpace(WithSpace,String),string_concat(WithSpace,S,S0),string_lower(String,Det).
  305
  306:-export(query_description/1).  307query_description(mudDescription(I,S)):-  is_asserted(mudDescription(I,S)).
  308query_description(t(mudDescription,I,S)):- is_asserted(mudDescription(I,S));is_asserted(mudKeyword(I,S)).
  309
  310
  311:-export(remove_description/1).  312remove_description(mudDescription(I,S)):- dmsg(trace_or_throw(remove_description(mudDescription(I,S)))).
  313
  314:-export(add_description/1).  315add_description(mudDescription(I,S)):-add_description(I,S).
  316
  317:-export(add_description/2).  318add_description(A,S0):-ainz(mudDescription(A,S0)),fail.
  319add_description(A,S0):- atomic(S0),string_concat('actPunchingSomething ',S,S0),!,add_description(A,S).
  320% add_description(A,S0):-determinerRemoved(S0,String,S),!,add_description(A,S),ainz(determinerString(A,String)).
  321add_description(A,S0):-
  322   any_to_string(S0,S),
  323   atomic_list_concat(Words,' ',S),
  324   atomic_list_concat(Sents,'.',S),!,
  325   length(Words,Ws),
  326   must(add_description(A,S,S0,Ws,Sents,Words)),!.
  327
  328% mudBareHandDamage: 10d10+75
  329add_description(A,S,_S0,Ws,_Sents,_Words):- Ws<3,  
  330   atomic_list_concat([K,V],': ',S),!,add_description_kv(A,K,V).
  331
  332add_description(A,S,_S0,Ws,_Sents,_Words):- Ws<3,
  333   atomic_list_concat([K,V],'=',S),!,add_description_kv(A,K,V).
  334
  335% "NOBACKSTAB","ACT_STAY_ZONE","MEMORY"
  336add_description(A,_S,_S0,1,_,[Word]):-add_description_word(A,Word),!.
  337
  338%actPunchingSomething ..
  339add_description(A,S,S0,Ws,Sents,['actPunchingSomething',B|C]):-add_description(A,S,S0,Ws,Sents,[B|C]).
  340add_description(A,S,S0,Ws,Sents,[Det,B|C]):-ddeterminer(Det,L),add_description(A,S,S0,Ws,Sents,[B|C]),ainz(determinerString(A,L)).
  341add_description(A,S,S0,Ws,_Sents,_Words):-Ws>3,is_here_String(S),text_to_string(S0,String),!,ainz(descriptionHere(A,String)).
  342add_description(A,_S,S0,_Ws,_Sents,_Words):- any_to_string(S0,String),ainz(mudDescription(A,String)).
  343
  344is_here_String(S):- atomic_list_concat_safe([_,is,_,"here",_],S).
  345is_here_String(S):- atomic_list_concat_safe([_,"here"],S).
  346is_here_String(S):- atomic_list_concat_safe([_,is,"here",_],S).
  347
  348
  349ddeterminer1("A").
  350ddeterminer1("An").
  351ddeterminer1("The").
  352
  353ddeterminer0("a").
  354ddeterminer0("an").
  355ddeterminer0("the").
  356
  357ddeterminer(L,L):-ddeterminer0(L).
  358ddeterminer(U,L):-string_lower(U,L),U\=L,!,ddeterminer0(L).
  359
  360add_description_word(A,Word):- string_upper(Word,Word),string_lower(Word,Flag),string_to_atom(Flag,Atom),atom_concat(flagged_,Atom,FAtom),ainz((isa(A,FAtom))).
  361add_description_word(A,Word):- string_lower(Word,Word),ainz((mudKeyword(A,Word))).
  362add_description_word(A,Word):- string_lower(Word,Lower),ainz((mudKeyword(A,Lower))).
  363
  364
  365add_description_kv(A,K,V):- atom_concat('actPunchingSomething ',Key,K),!,add_description_kv(A,Key,V).
  366add_description_kv(A,K,V):- atom_concat('+',Key,K),!,add_description_kv(A,Key,V).
  367add_description_kv(A,K,V):-atom_to_value(V,Term),C=..[K,A,Term],show_load_call(ainz(C))