1%:- if(( ( \+ ((current_prolog_flag(logicmoo_include,Call),Call))) )). 
    2/*
    3:- module(parser_imperative, [
    4                  
    5]).
    6*/
    7%:- endif.
    8/* * <module>  parser_imperative - Imperitive Sentence Parser (using DCG)
    9%
   10% Logicmoo Project PrologMUD: A MUD server written in Prolog
   11% Maintainer: Douglas Miles
   12% Dec 13, 2035
   13%
   14*/
   15:- include(prologmud(mud_header)).   16:- expects_dialect(pfc).   17
   18:- ensure_loaded(library(instant_prolog_docs)).   19
   20:- virtualize_source_file.   21
   22:-export((
   23    parse_agent_text_command/5,            
   24    parse_agent_text_command_0/5,            
   25    objects_match/3,
   26    match_object/2,
   27    object_string/2,
   28    save_fmt_a_0/2,
   29    save_fmt_a/2,
   30    % coerce/3,
   31    parseIsa//2,
   32    get_agent_text_command_0/4,
   33    phrase_parseForTypes_9//2,
   34    guess_nameStrings/2,
   35    parseForTypes//
   36    2)).   37
   38% :- register_module_type (utility).
   39
   40:- if(false).   41:- set_prolog_flag(gc,true).   42:- trim_stacks.   43:- garbage_collect_atoms.   
   44:- garbage_collect_clauses.   45:- garbage_collect.   46:- statistics.   47%:- set_prolog_flag(%%gc,false).
   48:- endif.   49
   50some_term_to_atom(Term,Atom):- must(\+ is_list(Term)), term_to_atom(Term,Atom).
   51
   52% =====================================================================================================================
   53% get_agent_text_command/4
   54% =====================================================================================================================
   55:-export(get_agent_text_command/4).   56:-export(get_agent_text_command_0/4).   57
   58get_agent_text_command(Agent,VERBOrListIn,AgentR,CMD):-
   59   on_x_debug(loop_check(get_agent_text_command_0(Agent,VERBOrListIn,AgentR,CMD),fail)).
   60
   61get_agent_text_command_0(Agent,ListIn,AgentR,CMD):- 
   62   (is_list(ListIn) -> UseList=ListIn ; UseList=[ListIn]),
   63       call_no_cuts(baseKB:agent_text_command(Agent,UseList,AgentR,CMD)).
   64
   65
   66want_more_question(G):-call(G),!.
   67
   68% ===========================================================
   69% PARSE command
   70% ===========================================================
   71:-ain((==>baseKB:type_action_info(tHumanControlled,actParse(tCol,ftListFn(ftString)),"Development test to parse some Text for a human.  Usage: parse 'item' the blue backpack"))).
   72
   73baseKB:agent_command(_Gent,actParse(Type,StringM)):-
   74   want_more_question(parse_for(Type,StringM,_Term,_LeftOver)).
   75
   76% ===========================================================
   77% CMDPARSE command
   78% ===========================================================
   79:-ain((==>baseKB:type_action_info(tHumanControlled,actCmdparse(ftListFn(ftTerm)),"Development test to parse some Text for a human.  Usage: cmdparse take the blue backpack"))).
   80
   81baseKB:agent_command(_Gent,actCmdparse(StringM)):- !, want_more_question(parse_for(ftAction,StringM,Term,LeftOver)),fmt('==>'(parse_for(StringM) , [Term,LeftOver])).
   82
   83% baseKB:mud_test("cmdparse test",...)
   84  
   85
   86% ===========================================================
   87% parsetempl command
   88% ===========================================================
   89:-ain((==>baseKB:type_action_info(tHumanControlled,actParsetempl(ftListFn(ftTerm)),"Development test to see what verb phrase heads are found. (uses get_vp_templates/4)  Usage: parsetempl who"))).
   90
   91
   92% :- use_module(library(func)).
   93% guess_nameStrings $ actParsetempl
   94% baseKB:agent_text_command(Agent,[guess_nameStrings $ actParsetempl|List],Agent,actParsetempl(List)):- cwc.
   95baseKB:agent_text_command(Agent,[Result|List],Agent,actParsetempl(List)):- guess_nameStrings( actParsetempl, Result).
   96
   97
   98baseKB:agent_command(Agent,actParsetempl(StringM)):-
   99  to_word_list(StringM,[SVERB|ARGS]),
  100  get_vp_templates(Agent,SVERB,ARGS,TEMPLATES),fmt(templates=TEMPLATES),
  101  ignore((
  102     parse_for(ftAction,StringM,Goal,LeftOver),
  103     fmt([goal=Goal,lfto=LeftOver]))).
  104
  105% ===========================================================
  106% parse_for/2-N
  107% ===========================================================
  108% should not be used really
  109% parse_for(Type,StringM):- parse_for(Type,StringM, _Term).
  110
  111parse_for(Type,StringM, Term):-parse_for(Type,StringM, Term, Out),Out==[].
  112
  113list_tail(_,[]).
  114list_tail(String,LeftOver):-ground(String),to_word_list(String,List),length(List,L),!,between(1,L,X),length(LeftOver,X).
  115
  116:-export(parse_for/4).  117parse_for(Type,StringM,Term,LeftOver):-
  118   to_word_list(StringM,String),  
  119   list_tail(String,LeftOver),
  120   HOW = phrase(parseIsa(Type,Term),String,LeftOver),
  121   fmt('parsing with ~q ~n.',[HOW]),
  122   (on_x_debug(HOW)*->
  123      fmt('Success! parse \'~q\' "~q" = ~q   (leftover=~q) . ~n',[Type,String,Term,LeftOver]);
  124      (fmt('No Success.~n',[]),!,fail)).
  125
  126meets_desc_spec(T,_L):- some_term_to_atom(T,S0),string_to_atom(S0,A),atomic_list_concat_catch([_,_|_],'mudBareHandDa',A),!,fail.
  127meets_desc_spec(_,[]):-!.
  128meets_desc_spec(S,[DS|SL]):-!,meets_desc_spec(S,DS),meets_desc_spec(S,SL),!.
  129meets_desc_spec(S,From-To):-!, desc_len(S,Len),!, between(From,To,Len).
  130meets_desc_spec(_,_).
  131
  132desc_len(S0,Region):- call(some_term_to_atom(S0,S)),
  133   atomic_list_concat_catch(Words,' ',S),length(Words,Ws),atomic_list_concat_catch(Sents,'.',S),length(Sents,Ss),Region is Ss+Ws,!.
  134
  135
  136:-export(objects_match_for_agent/3).  137objects_match_for_agent(Agent,Text,ObjList):- 
  138   objects_match_for_agent(Agent,Text,
  139   [mudPossess(Agent,isThis),
  140    isSame(mudAtLoc),
  141    isSame(localityOfObject),tAgent,tItem,tRegion],ObjList).  
  142:-export(objects_match_for_agent/4).  143objects_match_for_agent(Agent,Text,Match,ObjList):- trace,
  144 objects_for_agent(Agent,isOneOf([text_means(Agent,Text,isThis),
  145    isAnd([isOneOf(Match),match_object(Text,isThis)])]),ObjList).  
  146
  147
  148text_means(Agent,Text,Agent):- string_equal_ci(Text,"self"),!.
  149text_means(Agent,Text,Loc):- string_equal_ci(Text,"here"),where_atloc(Agent,Loc).
  150text_means(Agent,Text,Region):- string_equal_ci(Text,"region"),where_atloc(Agent,Loc),locationToRegion(Loc,Region).
  151text_means(_Agent,_Text,_Value):-fail.
  152
  153relates(Agent,Relation,Obj):-loop_check(relates_ilc(Agent,Relation,Obj),fail).
  154relates_ilc(Agent,Relation,Obj):-text_means(Agent,Relation,Obj),!.
  155relates_ilc(_    ,Relation,Obj):- atom(Relation),tCol(Relation),!,isa(Obj,Relation).
  156relates_ilc(_    ,Relation,Obj):-contains_var(Relation,isThis),subst(Relation,isThis,Obj,Call),!,req1(Call).
  157relates_ilc(Agent,isSame(Relation),Obj):- !, relates(Agent,Relation,Value),relates(Obj,Relation,Value).
  158relates_ilc(Agent,Relation,Obj):- atom(Relation),!, prop(Agent,Relation,Obj).
  159relates_ilc(_    ,Relation,Obj):-contains_var(Relation,Obj),!,req1(Relation).
  160relates_ilc(Agent,Relation,Obj):-contains_var(Relation,Agent),append_term(Relation,Obj,Call),!,req1(Call).
  161relates_ilc(Agent,Relation,Obj):-objects_for_agent(Agent,Relation,MatchList),MatchList\=[],!,member(MatchList,Obj).
  162
  163
  164objects_for_agent(_Agent,isAnd([]),[]):-!.
  165objects_for_agent(_Agent,isMost([]),[]):-!.
  166objects_for_agent(_Agent,isOneOf([]),[]):-!.
  167
  168objects_for_agent(Agent,isOneOf([Possible|Relations]),MatchList):-!,
  169   objects_for_agent(Agent,Possible,L1),
  170   objects_for_agent(Agent,Relations,L2),
  171   append(L1,L2,MatchListL),!,
  172   list_to_set(MatchListL,MatchList),!.
  173
  174objects_for_agent(Agent,members(List,Relations),MatchList):-!, findall(Obj,(member(Obj,List),relates(Agent,Relations,Obj)),MatchListL),list_to_set(MatchListL,MatchList),!.
  175
  176objects_for_agent(Agent,isAnd([Possible|Relations]),MatchList):-!,
  177   objects_for_agent(Agent,Possible,L1),
  178   objects_for_agent(Agent,members(L1,Relations),MatchListL),
  179   list_to_set(MatchListL,MatchList),!.
  180objects_for_agent(Agent,Relation,MatchList):- findall(Obj, relates(Agent,Relation,Obj), MatchListL),list_to_set(MatchListL,MatchList),!.
  181
  182
  183objects_match(Text,Possibles,MatchList):- findall(Obj,(member(Obj,Possibles),match_object(Text,Obj)), MatchList).
  184
  185:-dynamic(object_string/2).  186object_string(O,String):-nameString(O,String).
  187object_string(O,String):-mudKeyword(O,String).
  188
  189nameString(O,S)==>mudKeyword(O,S).
  190
  191%:- begin_tests(parser_imparative,[setup(foc_current_agent(_))]).
  192
  193%:- end_tests(parser_imparative).
  194        
  195/*
  196object_string(O,String) :-  object_string(_,O,1-4,String),!.
  197object_string_0_5(O,String):-object_string(_,O,0-5,String),!.
  198
  199:-export(object_string/4).
  200:-dynamic lmcache:object_string_fmt/3.
  201:-retractall(lmcache:object_string_fmt(_,_,_)).
  202object_string(_,O,DescSpecs,String):- lmcache:object_string_fmt(O,DescSpecs,String),!.
  203object_string(Agent,O,DescSpecs,String):- String = [O], 
  204   object_print_details(save_fmt(String),Agent,O,DescSpecs,[tCol,tItem,ftProlog,ftID,ftTerm,tAgent,tChannel]),
  205   asserta(lmcache:object_string_fmt(O,DescSpecs,String)),!.
  206
  207save_fmt(OS,' ~w ',[A]):-!,save_fmt_e(OS,A),!.
  208save_fmt(OS,'~w',[A]):-!,save_fmt_e(OS,A),!.
  209save_fmt(OS,'~w',[A]):-!,save_fmt_e(OS,A),!.
  210save_fmt(OS,Fmt,[A|KW]):-sformat(Str,Fmt,[A|KW]),to_word_list(Str,WL),save_fmt_e(OS,WL),!.
  211
  212save_fmt_e(_,E):-var(E),!.
  213save_fmt_e(_,[]):-!.
  214save_fmt_e(O,A):-atom(A),!,save_fmt_a(O,A),!.
  215save_fmt_e(O,[E|L]):-!,save_fmt_e(O,E),!,save_fmt_e(O,L),!.
  216save_fmt_e(O,isa(A)):-!,must(save_fmt_e(O,A)).
  217save_fmt_e(O,t(A,_)):-!,must(save_fmt_e(O,A)).
  218save_fmt_e(O,xti(A,_)):-!,must(save_fmt_e(O,A)).
  219save_fmt_e(_,E):-compound(E),!. % cycPred(_),predStub(_),cycPlus2(_),predStub(_),predicateConventionMt(_),arity(_),
  220%save_fmt_e(O,E):- string(E),!,must((to_word_list(E,WL),save_fmt_e(O,WL))),!.
  221save_fmt_e(O,E):- member_eq0(E,O) -> true ; (O=[_|CDR],nb_setarg(2,O,[E|CDR])).
  222
  223member_eq0(X, [Y|Ys]) :- X==Y;member_eq0(X,Ys).
  224
  225save_fmt_a(P,A):-loop_check(save_fmt_a_0(P,A),true),!.
  226
  227save_fmt_a_0(_,E):-var(E),!.
  228save_fmt_a_0(O,xti(E,_)):-!,save_fmt_a(O,E).
  229save_fmt_a_0(O,t(E,_)):-!,save_fmt_a(O,E).
  230save_fmt_a_0(O,E):-compound(O),arg(1,O,E),!,save_fmt_a(O,E).
  231save_fmt_a_0(_,A):-atom(A),atom_length(A,L),L =< 1.
  232save_fmt_a_0(_,A):-vtSkippedPrintNames(A),!.
  233save_fmt_a_0(O,E):-to_case_breaks(E,List),must_maplist(save_fmt_a(O),List).
  234
  235
  236object_name_is_descriptive(O):- (isa(O,tCol);isa(O,tPred);t(functorDeclares,O);isa(O,ttValueType),isa(O,name_is_descriptive)).
  237*/
  238
  239/*
  240:-export(object_print_details/5).
  241
  242
  243object_print_details(Print,Agent,O,DescSpecs,Skipped):- dumpST, break,atoms_of(O,OS),!,
  244   forall(member(M,OS),object_print_details0(Print,Agent,M,DescSpecs,Skipped)).
  245
  246object_print_details0(Print,Agent,O,DescSpecs,Skipped):-
  247   member(O,Skipped) -> true ;
  248  (    
  249    ignore(forall(name_text(O,KW),ignore((meets_desc_spec(KW,DescSpecs)->call(Print,' ~w ',[KW]))))),
  250   (object_name_is_descriptive(O) -> true ; 
  251    (( 
  252       forall(is_asserted(descriptionHere(O,KW)),ignore((meets_desc_spec(KW,DescSpecs)->call(Print,' ~w ',[KW])))),
  253       forall(isa(O,S),ignore(( \+ (vtSkippedPrintNames(S)),object_print_details0(Print,Agent,S,DescSpecs,[O|Skipped])))))))).
  254
  255%tCol(ttTypeType).
  256vtSkippedPrintNames(T):-var(T),!,fail.
  257vtSkippedPrintNames(T):-ttExpressionType(T).
  258%vtSkippedPrintNames(T):-isa(T,ttTypeType).
  259vtSkippedPrintNames(E):-member(E,[tObj,isThis,the,is,tSpatialThing,ttNotSpatialType,ttSpatialType,prologHybrid,t,prologPTTP,prologKIF,prologDynamic,tRelation,tPred,'',[]]).
  260
  261
  262must_make_object_string_list(_,Obj,WList):- object_string(Obj,WList),!.
  263must_make_object_string_list(P,Obj,WList):- lc_tcall(must_make_object_string_list_cached(P,Obj,WList)).
  264must_make_object_string_list_cached(P,Obj,WList):-
  265  must((object_string(P,Obj,0-5,String),nonvar(String),non_empty(String),string_ci(String,LString),convert_to_string_list(LString,WList))).
  266*/
  267same_ci(A,B):-quietly((must((non_empty(A),non_empty(B))),any_to_string(A,StringA),any_to_string(B,StringB),!,string_ci(StringA,StringB))),!.
  268
  269match_object(S,Obj):-var(S),!,fail,freeze(S,match_object(S,Obj)).
  270match_object(S,Obj):-var(Obj),!,fail,freeze(Obj,match_object(S,Obj)).
  271match_object(S,Obj):-number(S),atom_number(A,S),!,match_object(A,Obj).
  272match_object(S,Obj):-same_ci(S,Obj),!.
  273match_object(S,Obj):-atomic(S),string_to_atom(S,ID),call_u(tKnownID(ID)),!,(var(Obj)->Obj=ID;same_ci(ID,Obj)).
  274match_object(S,Obj):-name_text(Obj,S),!.
  275match_object(S,Obj):-i_name(Obj,S),!.
  276match_object([S],Obj):-!,match_object(S,Obj).
  277match_object([S1|S],Obj):-match_object(S1,Obj),match_object(S,Obj),!.
  278% match_object(S,Obj):-atomic(S),string_to_atom(S,ID),call_u(tIndividual(ID)),!,(var(Obj)->Obj=ID;same_ci(ID,Obj)).
  279match_object(S,Obj):-to_case_breaks(Obj,List)->member(xti(Str,_),List),string_equal_ci(S,Str),!.
  280/*
  281match_object(S,Obj):-ground(S:Obj),match_object_exp(S,Obj),!.
  282
  283match_object_exp(S,Obj):-sanity(ground(S:Obj)),must(((atoms_of(S,Atoms),!,Atoms\=[]))),match_object_0(Atoms,Obj).
  284
  285match_object_0([S],Obj):-nonvar(S),match_object_1(S,Obj),!.
  286match_object_0(Atoms,Obj):-
  287   current_agent_or_var(P),quietly(must_make_object_string_list(P,Obj,WList)),!,
  288   forall(member(A,Atoms),(member(W,WList),quietly(string_equal_ci(A,W)))).
  289
  290match_object_1(A,Obj):-same_ci(A,Obj),!.
  291match_object_1(A,Obj):-isa(Obj,Type),same_ci(A,Type),!.
  292*/
  293:-nodebug(logicmoo(parser)).  294:-debug(logicmoo(parser)).  295
  296% dmsg_parserm(D):-dmsg(D),!.
  297dmsg_parserm(D):- dmsg_parserm('~N~q~n',[D]).
  298dmsg_parserm(F,A):-ignore((debugging_logicmoo(logicmoo(parser)),dmsg(F,A))).
  299
  300
  301% ===========================================================
  302% PARSER
  303% ===========================================================
  304
  305
  306must_atomics(A):-must(atomic(A)).
  307
  308destringify_arg(A,A).
  309
  310parse_agent_text_command(Agent,SVERB,Args,NewAgent,GOAL):- destringify_arg(SVERB,AVERB),SVERB \=@= AVERB,!,
  311   parse_agent_text_command(Agent,AVERB,Args,NewAgent,GOAL).
  312parse_agent_text_command(Agent,SVERB,Args,NewAgent,GOAL):- is_list(Args),maplist(destringify_arg,Args,AArgs),AArgs \=@= Args,!,
  313   parse_agent_text_command(Agent,SVERB,AArgs,NewAgent,GOAL).
  314parse_agent_text_command(Agent,SVERB,[],NewAgent,GOAL):-compound(SVERB),!,must((NewAgent=Agent,GOAL=SVERB)),!.
  315parse_agent_text_command(_Agent,SVERB,ARGS,_,_):-slow_sanity((must(atomic(SVERB)),maplist(must_atomics,ARGS))),fail.
  316
  317parse_agent_text_command(Agent,SVERB,ARGS,NewAgent,GOAL):-
  318  dmsg(parse_agent_text_command(Agent,SVERB,ARGS,NewAgent,GOAL)),
  319  parse_agent_text_command_0(Agent,SVERB,ARGS,NewAgent,GOAL),
  320   dmsg_parserm(succeed_parse_agent_text_command_0(Agent,SVERB,ARGS,NewAgent,GOAL)),!.
  321
  322parse_agent_text_command(Agent,VERB,[PT2|ARGS],NewAgent,GOAL):-
  323   atomic_list_concat_catch([VERB,PT2],'_',SVERB),
  324   parse_agent_text_command_0(Agent,SVERB,ARGS,NewAgent,GOAL),!,
  325   dmsg_parserm(special_succeed_parse_agent_text_command_0(Agent,SVERB,ARGS,NewAgent,GOAL)),!.
  326
  327parse_agent_text_command(Agent,PROLOGTERM,[],Agent,actProlog(PROLOGTERM)):- nonvar(PROLOGTERM),predicate_property(PROLOGTERM,_),!.
  328
  329parse_agent_text_command(Agent,SVERB,ARGS,NewAgent,GOAL):-
  330 dmsg(failed_parse_agent_text_command_0(Agent,SVERB,ARGS,NewAgent,GOAL)),
  331 debugging_logicmoo(logicmoo(parser)),
  332 % debug,visible(+all),leash(+all), 
  333 parse_agent_text_command_0(Agent,SVERB,ARGS,NewAgent,GOAL),!.
  334
  335parse_agent_text_command(Agent,IVERB,ARGS,Agent,GOAL):- 
  336  ground(IVERB), string_to_atom(IVERB,VERB),GOAL=..[VERB|ARGS],!.
  337
  338% try directly parsing first
  339parse_agent_text_command_0(Agent,SVERB,ARGS,NewAgent,GOAL):- 
  340   call_no_cuts(baseKB:agent_text_command(Agent,[SVERB|ARGS],NewAgent,GOAL)),nonvar(NewAgent),nonvar(GOAL),!.   
  341
  342% try indirectly parsing
  343parse_agent_text_command_0(Agent,SVERB,ARGS,NewAgent,GOAL):- 
  344   call_no_cuts(baseKB:agent_text_command(Agent,[VERB|ARGS],NewAgent,GOAL)),ground(GOAL),nonvar(VERB),
  345   verb_matches(SVERB,VERB).
  346
  347parse_agent_text_command_0(Agent,SVERB,ARGS,Agent,GOAL):-
  348   parse_agent_text_command_1(Agent,SVERB,ARGS,Agent,GOAL).
  349
  350parse_agent_text_command_0(Agent,IVERB,ARGS,NewAgent,GOAL):-
  351   verb_alias_to_verb(IVERB,SVERB), IVERB\=SVERB,!,
  352   parse_agent_text_command(Agent,SVERB,ARGS,NewAgent,GOAL).
  353
  354parse_agent_text_command_0(Agent,PROLOGTERM,[],Agent,actProlog(req1(PROLOGTERM))):- compound(PROLOGTERM),functor(PROLOGTERM,F,A),
  355  mpred_prop(_,F,A,_),!.
  356parse_agent_text_command_0(Agent,PROLOGTERM,[],Agent,actProlog(req1(PROLOGTERM))):- compound(PROLOGTERM),pfc_is_callable(PROLOGTERM),!.
  357
  358:-export(parse_agent_text_command_1/5).  359% parses a verb phrase and retuns one interpretation (action)
  360parse_agent_text_command_1(Agent,SVERB,ARGS,Agent,GOAL):-
  361
  362   parse_vp_real(Agent,SVERB,ARGS,GOALANDLEFTOVERS),
  363   dmsg_parserm(parserm("GOALANDLEFTOVERS"=GOALANDLEFTOVERS)),
  364   GOALANDLEFTOVERS \= [],
  365   must(chooseBestGoal(GOALANDLEFTOVERS,GOAL)),
  366   dmsg_parserm(parserm("chooseBestGoal"=GOAL)).
  367
  368
  369==>baseKB:text_actverb("i",actInventory).
  370==>baseKB:text_actverb("l",actLook).
  371==>baseKB:text_actverb("lo",actLook).
  372==>baseKB:text_actverb("s",actMove(vSouth)).
  373==>baseKB:text_actverb("go",actMove).
  374==>baseKB:text_actverb("where is",actWhere).
  375% baseKB:text_actverb(["where","is"],actWhereTest).
  376
  377% remove nonstringed aliases
  378:-ain(((baseKB:text_actverb(NonStr, Act), {\+ is_ftText(NonStr),convert_to_cycString(NonStr,EStr)}) ==> 
  379    baseKB:text_actverb(EStr, Act),
  380   { ignore(call(call,retractall(( baseKB:text_actverb(NonStr, Act)) ))) } )).
  381                     
  382==>ttTypeType(ttCoercable).
  383
  384==>genls(ttStringType,ttCoercable).
  385
  386nameString(O,S):-nonvar(O),nonvar(S),nameString(O,SU),same_ci(S,SU).
  387
  388:- ain(((ttCoercable(StringType),argIsa(F,N,StringType),arity(F,A),
  389  {functor(P,F,A),P,arg(N,P,NonStr),\+ isa(NonStr,StringType),coerce(NonStr,StringType,EStr),replace_arg(P,N,EStr,Q)})
  390  ==> 
  391   ( \+ P,{coerce(NonStr,StringType,EStr)},Q))).
  392
  393:- dmsg(call(listing(baseKB:text_actverb/2))).  394
  395
  396% :- sanity((clause_u(baseKB:text_actverb(S,actWhere)),argIsa(text_actverb,1,C),isa(S,C))).
  397
  398:- must((clause_u(baseKB:text_actverb(S,actWhere))))
  399  ->must(((argIsa(text_actverb,1,C);call_u(argQuotedIsa(text_actverb,1,C))),(isa(S,C);quotedIsa(S,C)))).  400
  401%:- listing(baseKB:text_actverb/2).
  402%:- break.
  403
  404% pos_word_formula('infinitive',Verb,Formula):- 'infinitive'(TheWord, Verb, _, _G183), 'verbSemTrans'(TheWord, 0, 'TransitiveNPCompFrame', Formula, _, _).
  405
  406verb_alias_to_verb(IVERB,SVERB):- baseKB:text_actverb(L,Look),verb_matches(L,IVERB),SVERB=Look,!.
  407verb_alias_to_verb(IVERB,SVERB):- coerce(IVERB,vtVerb,SVERB), IVERB \= SVERB.
  408
  409subst_parser_vars(Agent,TYPEARGS,TYPEARGS_R):- subst(TYPEARGS,isSelfAgent,Agent,S1),where_atloc(Agent,Here),subst(S1,vHere,Here,TYPEARGS_R).
  410
  411% verb_matches("go",VERB):-!,VERB=go.
  412verb_matches(SVERB,VERB):- samef(VERB,SVERB)*->true;name_text_matches(SVERB,VERB).
  413
  414name_text_matches(SVERB,VERB):-name_text(SVERB,SSTR),name_text(VERB,STR),same_ci(SSTR,STR),!.
  415
  416
  417get_vp_templates(_Agent,SVERB,_ARGS,TEMPLATES):-
  418   findall([VERB|TYPEARGS],
  419    ((
  420      get_all_templates(TEMPL),
  421     %isa(Agent,What),
  422     %baseKB:action_info(What,TEMPL,_),
  423     TEMPL=..[VERB|TYPEARGS],
  424     (verb_matches(SVERB,VERB)))),
  425     TEMPLATES_FA),
  426    % ( TEMPLATES_FA=[] -> (dmsg(noTemplates(Agent,SVERB,ARGS)),!,fail); true),
  427   predsort(mostIdiomatic,TEMPLATES_FA,TEMPLATES).
  428   
  429% parses a verb phrase and retuns multiple interps
  430parse_vp_real(Agent,SVERB,ARGS,Sorted):- locally_tl(infSkipFullExpand,parse_vp_real_no_arg_checking(Agent,SVERB,ARGS,Sorted)).
  431parse_vp_real_no_arg_checking(Agent,SVERB,ARGS,Sorted):-
  432   get_vp_templates(Agent,SVERB,ARGS,TEMPLATES),   
  433   dmsg_parserm(("TEMPLATES"= (orig([SVERB|ARGS]) = TEMPLATES))),
  434   TEMPLATES \= [],
  435   list_to_set(TEMPLATES,TEMPLATESSET),
  436   findall(LeftOver-GOAL,
  437     (( 
  438      member([VERB|TYPEARGS],TEMPLATESSET),
  439      once(((subst_parser_vars(Agent,TYPEARGS,TYPEARGS_R),
  440      subst_parser_vars(Agent,ARGS,ARGS_R)))),
  441      dmsg_parserm(("parseForTypes"=phrase_parseForTypes(TYPEARGS_R,ARGS_R,GOODARGS,LeftOver))),      
  442      phrase_parseForTypes(TYPEARGS_R,ARGS_R,GOODARGS,LeftOver),
  443      GOAL=..[VERB|GOODARGS])),
  444      GOALANDLEFTOVERS_FA),
  445   sort(GOALANDLEFTOVERS_FA,GOALANDLEFTOVERS),
  446   predsort(bestParse,GOALANDLEFTOVERS,Sorted),!.
  447
  448chooseBestGoal([_LeftOver - GOAL],GOAL):-!.
  449chooseBestGoal(GOALANDLEFTOVERS,GOAL):-
  450   predsort(bestParse,GOALANDLEFTOVERS,Sorted),
  451   dmsg_parserm(("Sorted"=Sorted)),
  452   member(_LeftOver - GOAL,Sorted),!.
  453
  454% mostIdiomatic(?Order, @Term1, @Term2)
  455mostIdiomatic(Order, Term1, Term2):-mostComplex(Order, Term1, Term2).
  456% mostComplex(?Order, @Term1, @Term2)
  457mostComplex(Order, Term1, Term2):-complexity_count(Term1,Complexity1),complexity_count(Term2,Complexity2),compare(Order,Complexity2,Complexity1),Order \== '=' ,!.
  458mostComplex(Order, Term1, Term2):-compare(Order,Term1,Term2).
  459
  460complexity_count(S,-1):-var(S).
  461complexity_count(S,L):-string(S),!,string_length(S,L).
  462complexity_count(S,1):-atomic(S),!.
  463complexity_count([H|T],L):-!,complexity_count(H,HL),complexity_count(T,TL),L is HL+TL.
  464complexity_count(S,L):-functor(S,_,A),S=..[_|ARGS],!,complexity_count(ARGS,AL),L is A+AL.
  465
  466% bestParse(?Order, @Term1, @Term2)
  467bestParse(Order,LeftOver1-GOAL1,LeftOver2-GOAL2):-
  468   length(LeftOver1,L1),length(LeftOver2,L2),
  469   functor_safe(GOAL1,_,A1),functor_safe(GOAL2,_,A2),
  470   must(once(bestParse(Order,LeftOver1-GOAL2,LeftOver1-GOAL2,L1,L2,A1,A2))).
  471
  472:-style_check(-singleton).  473
  474bestParse(Order,LeftOver1-GOAL2,LeftOver1-GOAL2,L1,L2,A1,A2):-
  475   compare(Order,L1,L2), Order \== '='.
  476bestParse(Order,LeftOver1-GOAL2,LeftOver1-GOAL2,L1,L2,A1,A2):-
  477   compare(Order,-A1,-A2), Order \== '='.
  478bestParse(Order,LeftOver1-GOAL2,LeftOver1-GOAL2,L1,L2,A1,A2):-
  479   compare(Order,GOAL1,GOAL2).
  480
  481:-style_check(+singleton).  482
  483:-  dynamic(name_text_compute_now/2).  484:-multifile(name_text_compute_now/2).  485:-   export(name_text_compute_now/2).  486name_text_compute_now(Obj,Text):- name_text_cached(Obj,Text),!.
  487name_text_compute_now(Obj,Text):- atomic(Obj),
  488  guess_nameStrings(Obj,Text),!,
  489  maybe_ain_nameString(Obj,Text).
  490
  491maybe_ain_nameString(Obj, Text):- name_text_cached(Obj,Text),!.
  492maybe_ain_nameString(_Obj,Text):- Text=="",!,fail.
  493maybe_ain_nameString(Obj, Text):- Obj=Text,!.
  494%maybe_ain_nameString(Obj,_Text):- string(Obj),!.
  495maybe_ain_nameString(Obj,Text):- ain(nameString(Obj,Text)).
  496
  497:-multifile(name_text/2).  498:-dynamic(name_text/2).  499:-export(name_text/2).  500name_text(I,O):- nonvar(O),!,name_text(I,M),string_equal_ci(M,O).
  501name_text(I,O):- nonvar(I),no_repeats(O,(name_text_compute_now(I,M),any_to_string(M,S), \+ empty_string(S), text_to_string(S,O))).
  502
  503
  504name_text_cached(Obj,Text):-clause_b(nameString(Obj,Text)).
  505name_text_cached(Obj,Text):-clause_b(mudKeyword(Obj,Text)).
  506
  507:- ain('==>'(prologBuiltin(name_text_compute_now(ftTerm,ftString)))).  508
  509:- baseKB:import(logicmoo_util_strings:convert_to_cycString/2).  510
  511guess_mudDescription(O,S):-guess_mudDescription_0(O,OS),!,convert_to_cycString(OS,S).
  512guess_mudDescription_0([],_):-!,fail.
  513guess_mudDescription_0('',_):-!,fail.
  514guess_mudDescription_0("",_):-!,fail.
  515guess_mudDescription_0(Name,Text):-string(Name),!,Name=Text.
  516guess_mudDescription_0(Name,Text):-is_list(Name),!,
  517    maplist(as_atom,Name,RealName),atomic_list_concat(RealName,Obj),!,guess_mudDescription_0(Obj,Text).
  518guess_mudDescription_0(Name,Desc):- arity(Name,Int),integer(Int), \+ isa(Name,tCol),atomic(Name),make_summary([],Name,Desc).
  519guess_mudDescription_0(Name,Desc):- atomic(Name),!,atom(Name),to_case_breaks(Name,TextT),
  520   maplist(to_descriptive_name(Name),TextT,TextL),!,atomics_to_string(TextL,' ',Desc).
  521
  522guess_nameStrings(O,S):- guess_nameStrings_0(O,OS),must(nonvar(OS)),!,convert_to_cycString(OS,S),!,OS\=="".
  523guess_nameStrings_0([],_):-!,fail.
  524guess_nameStrings_0('',_):-!,fail.
  525guess_nameStrings_0("",_):-!,fail.
  526guess_nameStrings_0(Name,Text):-string(Name),!,Name=Text.
  527guess_nameStrings_0(Name,Text):-is_list(Name),!,
  528    maplist(as_atom,Name,RealName),atomic_list_concat(RealName,Obj),!,guess_nameStrings_0(Obj,Text).
  529guess_nameStrings_0(Name,Text):-compound(Name),!, \+ is_ftVar(Name),Name=..[F,A|List],!,guess_nameStrings_0([F,A|List],Text).
  530guess_nameStrings_0(Name,Text):-atom(Name),to_case_breaks(Name,ListN),to_case_breaks_trimed(Name,ListN,Text).
  531
  532to_case_breaks_trimed(Name,[xti(TextL,Class),xti(TextR,Class)|ListN],Text):-  
  533    maplist(to_descriptive_name(Name),[xti(TextL,Class),xti(TextR,Class)|ListN],Desc),
  534    atomics_to_string(Desc,' ',Text),!.
  535
  536to_case_breaks_trimed(Name,[_|ListN],Text):- is_list(ListN),!,
  537    maplist(to_descriptive_name(Name),ListN,Desc),
  538    atomics_to_string(Desc,' ',Text).
  539
  540type_descriptive_name(_,Str,Str):-string(Str),!.
  541type_descriptive_name(Name,xti(Atom,Class),Out):- !,Class\==digit,type_descriptive_name(Name,Atom,Out).
  542type_descriptive_name(tCol,t,'First-Order').
  543type_descriptive_name(tPred,Desc,Atom):-longer_sumry(Desc,Atom).
  544type_descriptive_name(tCol,tt,'Second-Order').
  545type_descriptive_name(tCol,vt,'Type-Class').
  546type_descriptive_name(tCol,'Col','Class').
  547type_descriptive_name(ftNonvar,'Fn','Function').
  548type_descriptive_name(tFunction,'a','Prototypical').
  549type_descriptive_name(tFunction,'i','Instance').
  550type_descriptive_name(ftAtom,'i','Instance').
  551type_descriptive_name(tCol,'Voprop','Verb-Object Properties').
  552type_descriptive_name(ftNonvar,Pefix,Desc):-
  553   type_prefix(Pefix,TypeName),guess_nameStrings(TypeName,Desc).
  554
  555
  556to_descriptive_name(For,Desc,Atom):- type_descriptive_name(Type,Desc,Atom),isa(For,Type),!.
  557to_descriptive_name(_For,Pefix,Desc):- call_u(type_prefix(Pefix,TypeName)), guess_nameStrings(TypeName,Desc).
  558to_descriptive_name(For,xti(Pefix,lower),Desc):-!,to_descriptive_name(For,Pefix,Desc).
  559to_descriptive_name(_For,Desc,Atom):- longer_sumry(Desc,Atom),!.
  560to_descriptive_name(_For,Desc,Atom):-any_to_atom(Desc,Atom),!.
  561
  562:-dynamic(baseKB:ttKeyworded/1).  563
  564% :- mpred_trace_exec.
  565:-ain((tSet(ttKeyworded))).  566:-ain((completelyAssertedCollection(ttKeyworded))).  567:-ain((vtActionTemplate(AT)/(get_functor(AT,F))) ==> vtVerb(F)).
  568
  569freeze_safe(A,G):- nonvar(A),freeze(A,G).
  570
  571:- kb_shared(baseKB:(onSpawn)/1).  572
  573onSpawn((ttKeyworded(T),{freeze_safe(F,atomic(F))},isa(F,T),{ \+ call_u(nameString(F,_)),once(guess_nameStrings(F,Txt))}==>(nameString(F,Txt)))).
  574onSpawn((ttKeyworded(T),{freeze_safe(F,atomic(F))},isa(F,T),{ \+ call_u(mudDescription(F,_)),once(guess_mudDescription(F,Txt))}==>(mudDescription(F,Txt)))).
  575:-ain((ttKeyworded(vtVerb))).  576%:-ain((ttKeyworded(tCol))).
  577% :-ain((ttKeyworded(tRelation))).
  578:- mpred_notrace_exec.  579
  580impl_coerce_hook(TextS,vtDirection,Dir):- !,
  581  member(Dir-Text,[vNorth-"n",vSouth-"s",vEast-"e",vWest-"w",vNE-"ne",vNW-"nw",vSE-"se",vSW-"sw",vUp-"u",vDown-"d"]),
  582  (name_text(Dir,TextS);string_equal_ci(TextS,Text)).
  583
  584impl_coerce_hook(Text,Subclass,X):- 
  585   \+ (memberchk(Subclass,[tSpatialThing])),!,
  586   once((isa_asserted(X,Subclass),
  587   arg_to_var(ftText,Text,TextVar),
  588   req1(mudKeyword(X,TextVar)),   
  589   same_arg(ftText,TextVar,Text))). % dmsg(todo(impl_coerce_hook(Text,Subclass))),impliedSubClass(Subclass,tSpatialThing).
  590
  591
  592phrase_parseForTypes(TYPEARGS,ARGS,GOODARGS,LeftOver):- % length(TYPEARGS,N),length(GOODARGS,N),!,
  593  to_word_list(ARGS,ARGSL),!,phrase_parseForTypes_0(TYPEARGS,ARGSL,GOODARGS,LeftOver).
  594
  595string_append(A,[B1,B2],C,ABC):-append(A,[B1,B2|C],ABC).
  596string_append(A,[B],C,ABC):-append(A,[B|C],ABC).
  597
  598
  599is_counted_for_parse(I):-t(tCountable,I), \+ (excluded_in_parse(I)),!.
  600
  601excluded_in_parse(apathFn(_, _)).
  602excluded_in_parse(I):-tCol(I).
  603excluded_in_parse(I):-ttExpressionType(I).
  604excluded_in_parse(I):-mpred_prop(_,_,meta_argtypes(I)).
  605excluded_in_parse(apathFn(_ = _)).
  606
  607instance_for_parse(I):-is_counted_for_parse(I).
  608insttype_for_parse(I):-findall(C,(instance_for_parse(I),isa_or_type(I,C)),List),list_to_set(List,Set),member(I,Set).
  609
  610optional_strings_opt.
  611
  612% optimization for isOptional strings
  613phrase_parseForTypes_0(TYPEARGS,ARGS,GOODARGS,LeftOver):- optional_strings_opt,
  614      (string_append(T1,[isOptionalStr(Str)],T2,TYPEARGS),
  615      (StrT =[_] /*;StrT=[_,_]*/),
  616      string_append(A1,StrT,A2,ARGS),
  617      string_equal_ci(Str,StrT)),!,
  618      show_call((phrase_parseForTypes_1(T1,A1,G1,[]),
  619         phrase_parseForTypes_9(T2,A2,G2,LeftOver),      
  620         string_append(G1,[Str],G2,GOODARGS))).
  621      
  622phrase_parseForTypes_0(TYPEARGS,ARGS,GOODARGS,LeftOver):-
  623   show_call(phrase_parseForTypes_1(TYPEARGS,ARGS,GOODARGS,LeftOver)).
  624
  625phrase_parseForTypes_1(TYPEARGS,ARGS,GOODARGS,LeftOver):- catch(phrase_parseForTypes_9(TYPEARGS,ARGS,GOODARGS,LeftOver),_,fail),!.    
  626phrase_parseForTypes_1([isOptional(_, W)|TYPEARGS], [], [W|GOODARGS], LeftOver):- phrase_parseForTypes_1(TYPEARGS,[],GOODARGS,LeftOver).
  627phrase_parseForTypes_1([isOptionalStr(W)|TYPEARGS], [], [W|GOODARGS], LeftOver):- phrase_parseForTypes_1(TYPEARGS,[],GOODARGS,LeftOver).
  628phrase_parseForTypes_1(TYPEARGS,In,Out,[]):- length(TYPEARGS,L),between(1,4,L),length(In,L),must(Out=In),!,nop(fmt(fake_phrase_parseForTypes_l(foreach_isa(In,TYPEARGS)))),fail.
  629phrase_parseForTypes_1(TYPEARGS,ARGS,GOODARGS,LeftOver):- on_x_debug(phrase_parseForTypes_9(TYPEARGS,ARGS,GOODARGS,LeftOver)).    
  630
  631phrase_parseForTypes_9(TYPEARGS,ARGS,GOODARGS,LeftOver):- (LeftOver=[];LeftOver=_ ), phrase(parseForTypes(TYPEARGS,GOODARGS),ARGS,LeftOver).
  632
  633parseForTypes([], [], A, A):-!.
  634parseForTypes([TYPE|TYPES], [B|E], [C|C1], G) :- ground(TYPE:C),
  635        no_repeats_old(parseIsa_Call(TYPE, B, [C|C1], F)),
  636        parseForTypes(TYPES, E, F, G),!.
  637parseForTypes([isOptional(_, W)|TYPEARGS], [W|GOODARGS], A, A):- parseForTypes(TYPEARGS,GOODARGS,A,A).
  638
  639
  640parseIsa_Call(FT, BO, CIn, D):- once((ground(FT:CIn), list_tail(CIn,D), to_word_list(CIn,C))),
  641   parseIsa(FT, B, C, D),to_arg_value(B,BO).
  642
  643
  644% this parseIsa(T)-->parseIsa(T,_).
  645parseIsa(A, B, C) :- parseIsa(A, _, B, C).
  646
  647is_parsable_type(T):-ttExpressionType(T).
  648is_parsable_type(T):-tCol(T).
  649is_parsable_type(ftAction).
  650
  651
  652%:- begin_tests(test_bad_verb).
  653
  654baseKB:mud_test(test_bad_verb, [ true(
  655        \+ (phrase(parseIsa(vtVerb,ff),[ff],[]))
  656       )] ).
  657
  658
  659baseKB:mud_test(food_is_a_droppable, [ true(
  660       parse_agent_text_command(iExplorer1,actDrop,[food],_D2,_E2))]).
  661
  662
  663%:- end_tests(test_bad_verb).
  664
  665
  666query_trans_subft(FT,Sub):-subFormat(FT,Sub).
  667query_trans_subft(FT,Sub):-subFormat(FT,A),genls(A,Sub).
  668query_trans_subft(FT,Sub):-subFormat(FT,A),subFormat(A,B),subFormat(B,Sub).
  669
  670
  671parseFmt_vp1(Agent, do(NewAgent,Goal),[SVERB|ARGS],[]):- parse_agent_text_command(Agent,SVERB,ARGS,NewAgent,Goal),!.
  672parseFmt_vp2(Agent,GOAL,[SVERB|ARGS],UNPARSED):- parse_vp_real(Agent,SVERB,ARGS,TRANSLATIONS),!,member(UNPARSED-GOAL,TRANSLATIONS).
  673
  674to_arg_value(Var,Var):-is_ftVar(Var),!.
  675to_arg_value(Val,What):- parserVars((Val;isParserVar(Val)),What,_),!. 
  676to_arg_value(vHere,Here):-must((current_agent(Who),where_atloc(Who,Here))).
  677to_arg_value(isSelfAgent,Who):-must((current_agent(Who))).
  678to_arg_value(isRandom(Type),Term):- nonvar(Type),!,must((to_arg_value(Type,TypeR),random_instance(TypeR,Term,true))).
  679to_arg_value(Call,TermO):-compound(Call),Call=..[call|CALLARGS],must((subst(CALLARGS,isThis,Term,CALLARGS2),maplist(to_arg_value,CALLARGS2,CALLARGS3),NewCall=..[call|CALLARGS3],must(req1(NewCall)),to_arg_value(Term,TermO))).
  680to_arg_value(Term,TermO):-must((map_term(to_arg_value,Term,TermO))).
  681
  682map_term(Pred,Term,TermO):-var(Term),!,must(call(Pred,Term,TermO)).
  683map_term(Pred,Term,TermO):-is_list(Term),!,must(maplist(Pred,Term,TermO)).
  684map_term(Pred,Term,TermO):-compound(Term),Term=..TermL,!,must(maplist(Pred,TermL,TermOL)),TermO=..TermOL.
  685map_term(_,Term,Term):-!.
  686
  687/*
  688
  689some tests
  690
  691 phrase_parseForTypes([isOptional(tAgent, isRandom(tAgent))], ['Crush'], A, B).
  692
  693  phrase_parseForTypes([isOptional(tAgent, isRandom(tAgent))], ['Crush'], A, B).
  694
  695parser_imperative:phrase_parseForTypes_9([isOptional(isAnd([obj, isNot(tRegion)]), 'NpcCol1000-Geordi684'), isOptionalStr("to"), isOptional(tRegion, isRandom(tRegion))], [food, 'Turbolift'], GOODARGS,[]).
  696parser_imperative:phrase_parseForTypes_9([isOptional(isAnd([obj, isNot(tRegion)]), 'NpcCol1000-Geordi684')], [food], GOODARGS,[]).
  697parser_imperative:phrase_parseForTypes_9([isOptional(tRegion, isRandom(tRegion))], ['Turbolift'], GOODARGS,[]).
  698
  699
  700*/
  701 % :- set_prolog_flag(subclause_expansion,false).
  702
  703:- dynamic(parseIsa/4).  704
  705parseIsa(_T, _, [AT|_], _):- var(AT),!,fail.
  706parseIsa(FT, B, C, D):- var(FT),trace_or_throw(var_parseIsa(FT, B, C, D)).
  707parseIsa(Str,A,B,C) :-string(Str),!, parseIsa(exactStr(Str),A,B,C).
  708
  709% this parseIsa(isNot(T),Term) --> dcgAnd(dcgNot(parseIsa(T)),theText(Term)).
  710
  711:- call(call,assert((parseIsa(isNot(Type), Term, C, D) :- !, dcgAnd(dcgNot(parseIsa(Type)), theText(Term), C, D)))).  712
  713parseIsa(ftAction,Goal,Left,Right):-!,one_must(parseFmt_vp1(isSelfAgent,Goal,Left,Right),parseFmt_vp2(isSelfAgent,Goal,Left,Right)).
  714
  715:- baseKB:ensure_loaded(library(multimodal_dcg)).  716
  717parseIsa(t(P,S,O),TermV) -->{!},parseIsa(call(t(P,S,O)),TermV).
  718parseIsa(call(Call),TermV) --> {!,subst(Call,isThis,TermV,NewCall)},theText(TermT), {req1(NewCall),match_object(TermT,TermV)}.
  719parseIsa(exactStr(Str),Str) --> {!},[Atom],{string_equal_ci(Atom,Str),!}.
  720parseIsa(isOptionalStr(Str),Str) --> { \+ (optional_strings_opt)},[Atom],{string_equal_ci(Atom,Str),!}.
  721parseIsa(isOptionalStr(_),isMissing) --> {!},[].
  722parseIsa(isOptionalStr(_Str),_) --> {!,fail}.
  723parseIsa(isOptional(_,Term),TermV) --> {to_arg_value(Term,TermV)}, [TermT], {samef(TermV,TermT)}.
  724parseIsa(isOptional(Type, _), TermV, C, D) :- nonvar(Type),parseIsa(Type, TermV, C, D).
  725parseIsa(isOptional(_Type,Default), DefaultV, D, D2):- !,D=D2,to_arg_value(Default,DefaultV).
  726
  727%  parser_imperative:phrase_parseForTypes_9([isOptional(isAnd([obj, isNot(tRegion)]),'NpcCol1000-Geordi684'),isOptionalStr("to"),isOptional(tRegion, isRandom(tRegion))], [food], GOODARGS,[]).
  728%  parser_imperative:phrase_parseForTypes_9([isOptional(isAnd([obj, isNot(tRegion)]),'NpcCol1000-Geordi684'),isOptionalStr("to"),isOptional(tRegion, isRandom(tRegion))], [food,to,'Turbolift'], GOODARGS,[]).
  729%  parser_imperative:phrase_parseForTypes_9([tRegion], ['Turbolift'], GOODARGS,[]).
  730
  731parseIsa(ftString,String)--> {!}, theString(String).
  732parseIsa(FT, B, [AT|C], D) :- nonvar(AT),member_ci(AT,["the","a","an"]),parseIsa(FT, B, C, D).
  733
  734parseIsa(isOneOf(List),Term) --> {!,member(E,List)},parseIsa(E,Term).
  735
  736
  737parseIsa(ftListFn(Type),[Term|List]) --> parseIsa(Type,Term),parseIsa(ftListFn(Type),List).
  738parseIsa(ftListFn(_Type),[]) --> {!},[].
  739
  740parseIsa(countBetween(_Type,_,High),[]) --> {High==0,!}, [].
  741parseIsa(countBetween(Type,Low,High),[Term|List]) --> parseIsa(Type,Term),{!,Low2 is Low -1,High2 is High -1 },
  742   parseIsa(countBetween(Type,Low2,High2),List).
  743parseIsa(countBetween(_Type,Low,_),[]) --> {!, Low < 1}, [].
  744
  745% parseIsa(isAnd([L|List]),Term1) --> dcgAnd(parseIsa(L,Term1),parseIsa(isAnd(List),Term2)),{ignore(Term1==Term2),!}.
  746parseIsa(isAnd([L]),Term1) --> {!},parseIsa(L,Term1).
  747parseIsa(isAnd([L|List]),Term) --> {!},dcgAnd(parseIsa(L,Term),parseIsa(isAnd(List),Term)).
  748
  749parseIsa(isMost(List),Term1) --> {!},parseIsaMost(List,Term1).
  750
  751
  752parseIsa(Type,Term)--> dcgAnd(dcgLenBetween(1,2),theText(String)),{coerce(String,Type,Term)}.
  753
  754parseIsaMost(List,Term) --> parseIsa(isAnd(List),Term),{!}.
  755% parseIsaMost(A, B, C, D) :- parseIsa(isAnd(A), B, C, E), !, D=E.
  756
  757coerce_as(B,A,C):-coerce(A,B,C).
  758
  759% coerce_hook(A,B,C):- (var(A);var(B)),!,fail,trace_or_throw(freeze(A,coerce_hook(A,B,C))).
  760% futureAssertion: THIS IS WHAT I THINKL THE CODE SHOULD LIKE
  761% coerce_hook(A,B,C):- to_arg_value(A,AStr),A\=@=AStr,!,coerce_hook(AStr,B,C).
  762coerce_hook(A,B,C):- to_arg_value(A,AStr),call_u(isa_or_type(AStr,B)),AStr=C,!.
  763coerce_hook(A,B,C):- no_repeats(C,(coerce0(A,B,C0),to_arg_value(C0,C))),(show_failure(isa_or_type(C,B))->!;true).
  764% THIS SHOULD BEEN OK.. coerce_hook(AStr,B,C):- any_to_string(AStr,A), no_repeats(C,(coerce0(A,B,C0),to_arg_value(C0,C))),(show_failure(ereq(isa(C,B)))->!;true).
  765
  766% Error conditions
  767coerce0(String,Type,Inst):- var(Type),!,trace_or_throw(var_specifiedItemType(String,Type,Inst)).
  768
  769% higher order
  770coerce0(String,isNot(Type),Inst):-!, sanity(nonvar(Type)), \+ (coerce(String,Type,Inst)).
  771coerce0(String,isOneOf(Types),Inst):-!, member(Type,Types),coerce(String,Type,Inst),!.
  772
  773% Strings
  774coerce0(String,ftString,String):- is_ftString2(String),!.
  775coerce0(Inst,ftString,String):- \+ is_ftText(Inst),!,must(name_text(Inst,String)).
  776coerce0(Any,ftString,String):- !, any_to_string(Any,String).
  777
  778
  779coerce0(IsList,ftListFn(How),Result):- is_list(IsList),!,maplist(coerce_as(How),IsList,Result).
  780coerce0(IsList,ftListFn(How),Result):- !,maplist(coerce_as(How),[IsList],Result).
  781
  782coerce0([A],B,C):- string(A),coerce_hook(A,B,C),!.
  783coerce0(String,Type,Inst):- string(String),string_to_atom(String,Inst),isa_or_type(Inst,Type),!.
  784
  785
  786% Handles text
  787coerce0(String,ftText,String):- is_ftText(String),!.
  788coerce0(String,ftText,StringO):- !,coerce0(String,ftString,StringO).
  789
  790% User dirrected
  791%coerce0(String,Type,Inst):- var(String),!,instances_of_type(Inst,Type),name_text(Inst,String).
  792coerce0(Inst,Type,Inst):- var(Inst),!,instances_of_type(Inst,Type).
  793% Stop string floundering
  794coerce0(Any,_,_):- empty_string(Any),!,fail.
  795
  796% User overloaded
  797coerce0(Text,Type,Inst):- (no_repeats_old(call_no_cuts(impl_coerce_hook(Text,Type,Inst)))).
  798coerce0(Inst,Type,InstO):- instances_of_type(Inst,Type),!,InstO=Inst.
  799
  800
  801
  802
  803coerce0(isRandom(WhatNot),Type,Inst):- !, must((nonvar(WhatNot),to_arg_value(WhatNot,TypeR),random_instance(TypeR,Inst,isa(Inst,Type)))).
  804coerce0(String,Type,Inst):- Type==tCol, i_name('t',String,Inst),is_asserted(tCol(Inst)),!.
  805coerce0(String,Type,Inst):- ttExpressionType(Type),!,checkAnyType(clause(assert,actParse),String,Type,AAA),Inst=AAA.
  806%coerce0(String,Type,Longest) :- findall(Inst, (impl_coerce_hook(Inst,Type,Inst),string_equal_ci(Inst,String)), Possibles), sort_by_strlen(Possibles,[Longest|_]),!.
  807coerce0(String,C,Inst):- compound(C),!,loop_check(parseIsa(C,Inst,[String],[])).
  808coerce0(String,Type,Inst):- must(tCol(Type)),instances_of_type(Inst,Type),match_object(String,Inst).
  809
  810% coerce0(A,Type,AA):- correctAnyType(change(_,_),A,Type,AA).
  811
  812
  813
  814instances_of_type(Inst,Type):- no_repeats_old(instances_of_type_0(Inst,Type)).
  815
  816available_instances_of_type(Agent,Obj,Type):- must(current_agent(Agent)), current_agent_or_var(Agent), isa(Obj,Type), mudDistance(Agent,Obj,D),D<6.
  817
  818% test_with ?- coerce(s,vtDirection,O).
  819%TODO add back if usefull instances_of_type_0(Inst,Type):- \+ current_prolog_flag(unsafe_speedups , true) , instances_sortable(Type,HOW),!,get_sorted_instances(Inst,Type,HOW).
  820% should never need this but .. instances_of_type_0(Inst,Type):- genls(SubType,Type),isa(Inst,SubType).
  821instances_of_type_0(Inst,Type):- isa_or_type(Inst,Type).
  822
  823instances_sortable(TYPE,HOW):-instances_sortable0(TYPE,HOW),!.
  824instances_sortable(TYPE,HOW):-genls(TYPE,SUPER),instances_sortable0(SUPER,HOW),!.
  825instances_sortable(_,distance_to_current_avatar(Agent)):-current_agent_or_var(Agent).
  826
  827instances_sortable0(tWieldAble,distance_to_current_avatar(Agent)):-current_agent_or_var(Agent).
  828instances_sortable0(tWearAble,distance_to_current_avatar(Agent)):-current_agent_or_var(Agent).
  829
  830distance_to_current_avatar(Agent,ORDEROUT,L,R):-mudDistance(Agent,L,L1),mudDistance(Agent,R,R1),compare(ORDER,L1,R1),!, (ORDER == '=' -> naming_order(ORDEROUT,L,R) ; ORDEROUT=ORDER).
  831
  832% :- register_new_toString_hook(is_mud_object,name_text).
  833
  834 % :- set_prolog_flag(subclause_expansion,true).
  835
  836mudDistance(Agent,_Obj,(-1)):- var(Agent),!.
  837mudDistance(Agent,Obj,0):- mudWielding(Agent,Obj),!.
  838mudDistance(Agent,Obj,1):- wearsClothing(Agent,Obj),!.
  839mudDistance(Agent,Obj,2):- mudStowing(Agent,Obj),!.
  840mudDistance(Agent,Obj,3):- mudPossess(Agent,Obj),!.
  841mudDistance(Agent,Obj,N):- mudPossess(OtherAgent,Obj),mudDistance(OtherAgent,Obj,AD),!,
  842  (same_regions(Agent,OtherAgent)->OAD=5; OAD=20),!,N is AD + OAD.
  843mudDistance(Agent,Obj,5):- same_regions(Agent,Obj),!.
  844mudDistance(_Agent,_Obj,20).
  845
  846naming_order(ORDER,L,R):-compare(ORDER,L,R).
  847
  848get_sorted_instances(Inst,Type,HOW):-findall(Inst,isa(Inst,Type),List),sort(List,NoDupes),predsort(HOW,NoDupes,Sorted),!,member(Inst,Sorted).
  849
  850% instances_of_type(Inst,Type):- atom(Type), Term =..[Type,Inst], on_x_log_cont(req1(Term)).
  851% longest_string(?Order, @Term1, @Term2)
  852/*
  853longest_string(Order,TStr1,TStr2):-
  854   text_to_string(TStr1,Str1),string_length(Str1,L1),
  855   text_to_string(TStr2,Str2),string_length(Str2,L2),
  856   compare(Order,L2-Str2,L1-Str1).
  857*/
  858
  859:- include(prologmud(mud_footer)).  860:- all_source_file_predicates_are_transparent.