1% ===================================================================
    2% File 'logicmoo_module_aiml_graphmaster.pl'
    3% Purpose: An Implementation in SWI-Prolog of AIML
    4% Maintainer: Douglas Miles
    5% Contact: $Author: dmiles $@users.sourceforge.net ;
    6% Version: 'logicmoo_module_aiml_graphmaster.pl' 1.0.0
    7% Revision:  $Revision: 1.7 $
    8% Revised At:   $Date: 2002/07/11 21:57:28 $
    9% ===================================================================
   10
   11:-ensure_loaded(library('programk/logicmoo_module_aiml_gmidx.pl')).
   12:-ensure_loaded(library('programk/logicmoo_module_aiml_convertor.pl')).
   13:-ensure_loaded(library('programk/logicmoo_module_aiml_cxt_path.pl')).
   14
   15% ===============================================================================================
   16% Callable input
   17% ===============================================================================================
   18callableInput(_Ctx,String,_Input,_Output):-traceIf(var(String)),fail.
   19callableInput(Ctx,[S|Tring],Input,Output):- maplist(atomic,[S|Tring]),joinAtoms([S|Tring],' ',String),!,callableInput0(Ctx,String,Input,Output).
   20callableInput(Ctx,String,Input,Output):-string(String),string_to_atom(String,Atom),!,callableInput0(Ctx,Atom,Input,Output).
   21callableInput(Ctx,Atom,Input,Output):-callableInput0(Ctx,Atom,Input,Output).
   22
   23callableInput0(Ctx,[String],Input,Output):-!,callableInput(Ctx,String,Input,Output).
   24callableInput0(_Ctx,NonAtom,_Input,_Output):- not(atom(NonAtom)),!,fail.
   25
   26callableInput0(_Ctx,Atom,_Input,result(Term,Vars)):- notrace(catch(atom_to_term(Atom,Term,Vars),_,fail)),
   27  callable(Term),catch(callInteractive0(Term,Vars /*,Results */),_,fail).
   28callableInput0(Ctx,Atom,_Input,VotesO-Output):-atom_prefix(Atom,'@'),
   29  % re-direct to input
   30  locally(set_prolog_flag(debug,true),
   31   withAttributes(Ctx,[],prolog_must(computeAnswer(Ctx,1,element(system,[],Atom),Output,VotesO)))),!.
   32
   33
   34% ===============================================================================================
   35% Eval a SRAI
   36% ===============================================================================================
   37computeSRAIElement(Ctx,Votes,ATTRIBS,Input0,Output,VotesO):-
   38 withAttributes(Ctx,ATTRIBS, ((
   39   computeSRAIElement0(Ctx,Votes,ATTRIBS,Input0,OutputM,VotesOM),
   40   computeTemplateOutput(Ctx,VotesOM,OutputM,Output,VotesO)))),!.
   41
   42computeSRAIElement0(Ctx,Votes,ATTRIBS,Input0,Output,VotesO):-
   43  prolog_must(ground(Input0)),!,
   44  flatten([Input0],Input),
   45  thread_local_flag(sraiDepth,SraiDepth,SraiDepth+1),
   46  computeSRAIElement1(Ctx,Votes,SraiDepth,ATTRIBS,Input,Output,VotesO),
   47  thread_local_flag(sraiDepth,_,SraiDepth),!.
   48
   49computeSRAIElement1(Ctx,Votes,SraiDepth,ATTRIBS,Input,Output,VotesO):-SraiDepth>1,!,evalSRAI(Ctx,Votes,SraiDepth,ATTRIBS,Input,Output,VotesO),!.
   50computeSRAIElement1(Ctx,Votes,SraiDepth,ATTRIBS,Input,Output,VotesO):-catch(evalSRAI(Ctx,Votes,SraiDepth,ATTRIBS,Input,Output,VotesO),aiml_goto(Output,VotesO),thread_local_flag(sraiDepth,_,0)),!.
   51
   52
   53evalSRAI(Ctx,Votes,SraiDepth,ATTRIBS,_Input,_Unusued,_VotesO):- SraiDepth>80,
   54  getAliceMem(Ctx,bot,'infinite-loop-input',Output),!,VotesO is Votes * 0.8,
   55  throw_aiml_goto(element(srai,ATTRIBS,Output),VotesO).
   56  %%throw_aiml_goto(proof(element(template,ATTRIBS,[element(srai,ATTRIBS,Output)]),loop(sraiDepth,SraiDepth,80,ATTRIBS,Input)),VotesO).
   57
   58/*
   59evalSRAI(Ctx,Votes,_SraiDepth,ATTRIBS,Input,_Unusued,_VotesO):-
   60 frame_depth(Depth),Depth>3000,getAliceMem(Ctx,bot,'infinite-loop-input',Output),!,VotesO is Votes * 0.8,
   61 throw_aiml_goto(proof(element(template,ATTRIBS,[element(srai,ATTRIBS,Output)]),loop(frameDepth,Depth,3000,ATTRIBS,Input)),VotesO).
   62*/

   63
   64
   65evalSRAI(Ctx,Votes,_SraiDepth,ATTRIBS,[I|Input0],Output,VotesO):-atom(I),atom_prefix(I,'@'),!,
   66  % re-direct to input
   67  withAttributes(Ctx,ATTRIBS,prolog_must(computeAnswer(Ctx,Votes,element(system,ATTRIBS,[I|Input0]),Output,VotesO))),!.
   68
   69evalSRAI(Ctx,Votes,_SraiDepth,ATTRIBS,Input,Output,VotesO):-
   70 prolog_must(var(SYM)),
   71 prolog_must(peekNameValue(Ctx,ATTRIBS,['evalsrai','userdict','scope'],SYMPREV,'$value'(user))),
   72 ifThen(var(SYM),evalsrai(SYM)),
   73 nop(ignore(var(Proof))), 
   74   withAttributes(Ctx,['evalsrai'=SYM,proof=Proof],
   75  ((
   76    setup_call_cleanup(addInherit(SYM,SYMPREV),
   77    ((
   78    debugOnError(computeSRAI(Ctx,Votes,SYM,Input,MidIn,VotesM,Proof)),
   79
   80    computeSRAIStars(Ctx,ATTRIBS,Input,MidIn,VotesM,SYM,Proof,Output,VotesO))),
   81    remInherit(SYM,SYMPREV)),
   82    ifThen(nonvar(SYM),retractallSrais(SYM))))).
   83
   84    
   85computeSRAIStars(Ctx,ATTRIBS,Input,MidIn,VotesM,SYM,Proof,Output,VotesO):- fail,
   86    prolog_must((nonvar(MidIn),
   87                 nonvar(SYM),
   88                 singletons([Ctx,ATTRIBS]),
   89                 nonvar(Proof))),
   91      MidIn = Output, 
   92      VotesM = VotesO,
   93      nop(debugFmt(computeSRAIStars(SYM,Input,Output))),
   94      prolog_must((ground(Output),number(VotesO))),!
   94.
   95
   96computeSRAIStars(Ctx,ATTRIBS,Input,MidIn,VotesM,SYM,Proof,Output,VotesO):-
   97    prolog_must((nonvar(MidIn),
   98                 nonvar(SYM),
   99                 nonvar(Proof))),
  100      setCtxValue(Ctx,'evalsrai',SYM),
  101      %%MidProof = Proof, 
  102      computeElementMust(Ctx,VotesM,template,ATTRIBS,MidIn,MidIn9,VotesI9),
  103      prolog_must(answerOutput(MidIn9,Mid9)),
  104      debugFmt(evalSRAI(SYM,Input,MidIn,MidIn9,Mid9)),
  105      prolog_must(computeAnswer(Ctx,VotesI9,Mid9,Output,VotesO)),
  106      prolog_must((ground(Output),number(VotesO))),!.
  107
  108 evalsrai(SYM):-gensym('evalsrai',SYM).
  109
  110% ===============================================================================================
  111% Apply Input Match
  112% ===============================================================================================
  113
  114computeSRAI(_Ctx,_Votes,_SYM,[],_,_,_Proof):- !,atrace,fail.
  115
  116computeSRAI(Ctx,Votes,SYM,Input,Result,VotesO,Proof):-
  117   getAliceMem(Ctx,'bot','me',Robot),
  118   getAliceMem(Ctx,'bot','you',User),
  119   ifThen(var(SYM),evalsrai(SYM)),
  120   getConversationThread(Ctx,User,Robot,ConvThread),
  121   prolog_must(computeSRAI0(Ctx,Votes,ConvThread,SYM,Input,Result,VotesO,Proof)).
  122
  123getConversationThread(Ctx,User,Robot,ConvThread):-
  124   ConvThread = fromTo(User,Robot),
  125   setCtxValue(Ctx,'convthread',ConvThread),!.
  126
  127computeSRAI0(Ctx,Votes,ConvThread,SYM,Input,Result,VotesO,Proof):-   
  128   computeInnerTemplate(Ctx,Votes,Input,NewIn,VotesM),NewIn \== Input,!,
  129   computeSRAI0(Ctx,VotesM,ConvThread,SYM,NewIn,Result,VotesO,Proof),!.
  130
  131computeSRAI0(Ctx,Votes,ConvThread,SYM,Input,Result,VotesO,Proof):- not(is_list(Input)),compound(Input),
  132   answerOutput(Input,InputO),Input\==InputO,!,atrace,
  133   computeSRAI0(Ctx,Votes,ConvThread,SYM,InputO,Result,VotesO,Proof).
  134
  135computeSRAI0(Ctx,Votes,ConvThread,SYM,Input,Result,VotesO,Proof):- not(is_list(Input)),compound(Input),
  136   computeAnswer(Ctx,Votes,Input,InputO,VotesM),Input\==InputO,!,atrace,
  137   computeSRAI0(Ctx,VotesM,ConvThread,SYM,InputO,Result,VotesO,Proof).
  138
  139computeSRAI0(Ctx,Votes,ConvThread,SYM,Input,Result,VotesO,Proof):-
  140  Each = (OutputLevel - e(VotesM,Result,Proof)),
  141  Each2Test = (_ - e(_,Result2Test,_)), 
  142  Call = computeSRAI2(Ctx,Votes,ConvThread,SYM,Input,Result,VotesM,Proof,OutputLevel),
  143  copy_term(Each:Call,EachFound:CallFound),  
  144  findall(EachFound:CallFound, CallFound, FOUND),
  145  FOUND=[_|_],
  146  memberchk(Each2Test:_,FOUND),
  147  nonvar(Result2Test),
  148  sort(FOUND,ORDER),!,
  149 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  150   member(Each:Call,ORDER),
  151   prolog_must(nonvar(Result)),
  152   debugFmt(computeSRAI(Input,SYM,Each)),
  153   VotesO is VotesM * 1.1
  153.
  154
  155computeSRAI0(_Ctx,Votes,ConvThread,SYM,Input,Result,VotesO,Proof):- !, VotesO is Votes * 0.7,
  156     Result = ['I',heard,you,think,SYM,and,'say:'|Input],
  157      Proof = result(Result,failed_computeSRAI2(Votes,Input,ConvThread)),
  158      debugFmt(Proof),!.
  159
  160% now atrace is ok
  161
  162% this next line is what it does on fallback
  163computeSRAI0(Ctx,Votes,ConvThread,SYM,[B|Flat],[B|Result],VotesO,Proof):- fail,
  164   computeSRAI2(Ctx,Votes,ConvThread,SYM,Flat,Result,VotesO,Proof,_PostOutputLevel3),prolog_must(nonvar(Result)).
  165
  166checkSym(_SYM).
  167
  168subclassMakeUserDict(Ctx,UserDict,SYM):-debugFmt(x(subclassMakeUserDict(Ctx,UserDict,SYM))),addInherit(UserDict,SYM).
  169
  170convThreadDict(_Ctx,ConvThreadHint,ConvThread):-answerOutput(ConvThreadHint,First),unlistify(First,ConvThread),!.
  171
  172computeSRAI222(CtxIn,Votes,ConvThreadHint,SYM,Pattern,Compute,VotesO,ProofOut,OutputLevel):-    
  173 prolog_mustEach((
  174   %%convertToMatchable(Pattern,InputPattern),
  175   prolog_must(current_value(CtxIn,'evalsrai',SYM2)),
  176   ifThen(var(SYM),SYM=SYM2),
  177   ifThen(SYM\==SYM2,debugFmt(syms(SYM\==SYM2))),
  178      convThreadDict(Ctx,ConvThreadHint,ConvThread),
  179         getCategoryArg(Ctx,'template',Out, _Out_ ,CateSig),!,
  180         getAliceMemOrSetDefault(CtxIn,ConvThread,SYM,'topic',Topic,['Nothing']),
  181         getAliceMemOrSetDefault(CtxIn,ConvThread,SYM,'userdict',UserDict,'user'), 
  182         %%getAliceMemOrSetDefault(CtxIn,ConvThread,SYM,'convthread',ConvThread,SYM,ConvThreadHint), 
  183         subclassMakeUserDict(CtxIn,UserDict,SYM),
  184         getAliceMemOrSetDefault(CtxIn,ConvThread,SYM,'that',That,['Nothing']),
  185  
  186   PreTopic = ignore(CtxIn=Ctx),PreTopic,
  187   TTP = topicThatPattern(Topic,That,Pattern),
  188   debugFmt(TTP),!,
  189   traceIf(not(ground(TTP))),
  190   must_be_openCate(CateSig),!,
  191   /*
  192   prolog_must(topicThatPattern(Ctx,Topic,That,Pattern,PreTopic,Out,CateSig,OutputLevel,StarSets_All,ClauseNumber,CommitTemplate)),
  193   */

  194   
  195   UNIF= topicThatPattern(Ctx,Topic,That,Pattern,PreTopic,Out,CateSig,OutputLevel,StarSets_All,ClauseNumber,CommitTemplate),
  196   singletons([ClauseNumber]),
  197   findall(UNIF,UNIF,UNIFS),!,
  198   traceIf(UNIFS=[]),
  199   %%%%% iterate from here %%%%%
  200   member(UNIF,UNIFS), 
  201         once(/* prolog_mustEach */((
  202            retractallSrais(SYM),
  203            prolog_must(CommitTemplate),
  204            prolog_must(nonvar(Out)),
  205            cateStrength(CateSig,Mult),
  207            VotesO is Votes * Mult,
  208            makeWithAttributes(StarSets_All,Out,Compute),       
  209            %%MoreProof = [cn(ClauseNumber),CateSig],
  210            MoreProof = [topicThatPatternOutput(Topic,That,Pattern,Out)],
  211            ProofOut=..[proof,Compute|MoreProof])
  211)
  211))
  211)
  211.
  212
  213
  214clauseRef(_CateSig,0):-!.
  215clauseRef(CateSig,Pattern:Template):-arg(6,CateSig,Pattern),arg(11,CateSig,Template),!.
  216clauseRef(CateSig,ClauseNumber):-trace,clause(CateSig,true,ClauseNumber).
  217clauseRef(_CateSig,-1):-!.
  218
  219savedParts(Save,PreTopic,CommitTemplate,OutputLevel,StarSets_All,Out,ClauseNumber,CateSig):-
  220      Save = OutputLevel - StarSets_All - Out - ClauseNumber - CateSig - CommitTemplate - PreTopic.
  221
  222starSetsAll(Ctx,Topic,That,Pattern,Save,PreTopic):-
  223   savedParts(Save,PreTopic,_CAfterPattern,OutputLevel,StarSets_All,Out,ClauseNumber,CateSig),
  224   getCategoryArg(Ctx,'template',Out, _Out_ ,CateSig),
  225   functor(CateSig,CateSigFunctor,_Args),
  226   OutputLevel = OutputLevel1 - OutputLevel2 - OutputLevel3,!,
  227   
  228   %%%%% Iterate here %%%%
  229   cate_match(Ctx,CateSigFunctor,'pattern',Pattern,CateSig,_MatchPattern,StarSets_Pattern,OutputLevel3),   
  230   call(CateSig),
  231   clauseRef(CateSig,ClauseNumber), %%%%%
  232   once(( cate_match(Ctx,CateSigFunctor,'topic',Topic,CateSig,_MatchTopic,StarSets_Topic,OutputLevel1),
  233   cate_match(Ctx,CateSigFunctor,'that',That,CateSig,_MatchThat,StarSets_That,OutputLevel2),
  234   combineStarSets(StarSets_Topic,StarSets_That,StarSets_Pattern,StarSets_All) )).
  235
  236combineStarSets(StarSets_Topic,StarSets_That,StarSets_Pattern,StarSets_All):-
  237   append(StarSets_Topic,StarSets_That,StarSets_TopicThat),
  238   append(StarSets_Pattern,StarSets_TopicThat,StarSets_All),!.
  239
  240cate_match(Ctx,CateSigFunctor,StarName,TextPattern,CateSig,MatchPattern,StarSets,OutputLevel):-
  241    getCategoryArg1(Ctx,StarName,MatchPattern,_StarNumber,CateSig),!,
  242    argNFoundGenerate(CateSigFunctor,StarName,MatchPattern,_IndexPattern,TextPattern),
  243    make_star_binders(Ctx,StarName,1,TextPattern,MatchPattern,OutputLevelInv,StarSets),OutputLevel is 1/OutputLevelInv.
  244
  245ctrace2:-atrace.
  246
  247%%checkStarSets(StarSets):-member(Bad=[],StarSets),!,ctrace2,warnIf(member(Bad=[],StarSets)).
  248checkStarSets(_StarSets). %%ctrace2.
  249
  250
  251argNFoundGenerate(CateSigFunctor,StarName,MatchPattern,IndexPattern,Nothing):-meansNothing(Nothing,_),!,argNFound(CateSigFunctor,StarName,MatchPattern,IndexPattern).
  252argNFoundGenerate(CateSigFunctor,StarName,MatchPattern,IndexPattern,TextPattern):-textPatternToMatchPatternTest(TextPattern,IndexPattern),argNFound(CateSigFunctor,StarName,MatchPattern,IndexPattern),nop(traceIf(not(textPatternToMatchPattern(TextPattern,IndexPattern)))).
  253%%%argNFoundGenerate(CateSigFunctor,StarName,MatchPattern,IndexPattern,TextPattern):-trace,argNFound(CateSigFunctor,StarName,MatchPattern,IndexPattern).
  254
  255argNFoundGenerate(_CateSigFunctor,pattern,MatchPattern,IndexPattern,TextPattern):-textPatternToMatchPattern(TextPattern,IndexPattern),cid_pattern(_,IndexPattern),fromIndexableSArg0(IndexPattern,MatchPattern).
  256argNFoundGenerate(_CateSigFunctor,that,MatchPattern,IndexPattern,TextPattern):-textPatternToMatchPattern(TextPattern,IndexPattern),cid_that(_,IndexPattern),fromIndexableSArg0(IndexPattern,MatchPattern).
  257argNFoundGenerate(_CateSigFunctor,topic,MatchPattern,IndexPattern,TextPattern):-textPatternToMatchPattern(TextPattern,IndexPattern),cid_topic(_,IndexPattern),fromIndexableSArg0(IndexPattern,MatchPattern).
  258
  259
  260toTAtom(Text,Text):-atom(Text),!.
  261toTAtom(Text,Atom):-number(Text),atom_number(Atom,Text),!.
  262toTAtom(Text,Atom):-trace,atom_number(Atom,Text).
  263
  264textPred(element(A,B,C),element(A,B,C)):-!.
  265textPred(Text,Pred):-toTAtom(Text,Atom),toLowercase(Atom,Pred).
  266
  267
  268textPatternToMatchPattern([Text],MatchPattern):-textPred(Text,Pred),!,member(MatchPattern,[Pred,*,'_']).
  269textPatternToMatchPattern([Text,_P|_Attern],MatchPattern):-textPred(Text,Pred),functor(MatchPattern,Pred,1).
  270textPatternToMatchPattern([_Text|Pattern],MatchPattern):-member(T,Pattern),textPred(T,Pred),functor(MatchPattern,Pred,2).
  271textPatternToMatchPattern(_TextPattern,'_').
  272textPatternToMatchPattern(_TextPattern,'*').
  273
  274%%textPatternToMatchPatternTest(I,O):-textPatternToMatchPattern(I,O).
  275textPatternToMatchPatternTest(_TextPattern,_).
  276
  277%%argNFound(aimlCate,pattern,['ARE', *, 'REAL'],are(real(idx_endswith, *, real))).
  278%%argNFound(aimlCate, pattern, ['_', 'OFF'], off(idx_endswith, '_', off)).
  279%%argNFound(aimlCate,pattern,['HOW', 'MANY', 'YEARS', *, 'IN', 'SAN', 'FRANCISCO'],how(many(years(in(idx_startswith(*), san(francisco)))))).
  283topicThatPattern(Ctx,Topic,That,Pattern,PreTopic,Out,CateSig,OutputLevel,StarSets_All,ClauseNumber,CommitTemplate):- useNewCateSigSearch_broken_now,
  284  prolog_mustEach((
  285   debugFmt(debugWarn(useNewCateSigSearch_broken_now)), 
  286   CommitTemplate = (nop(CateSig),prolog_must(PreTopic)),
  287   savedParts(Save,PreTopic,CommitTemplate,OutputLevel,StarSets_All,Out,ClauseNumber,CateSig),
  288   findall(Save,starSetsAll(Ctx,Topic,That,Pattern,Save,PreTopic),AllCateSig),
  289   prolog_must(AllCateSig=[_|_]),
  290   sort(AllCateSig,SetOfAllCateSig),!,
  291   %%%%% Iterate here %%%%
  292   member(Save,SetOfAllCateSig))).
  295topicThatPattern(Ctx,Topic,That,Pattern,PreTopic,Out,CateSig,OutputLevel,StarSets_All,ClauseNumber,CommitTemplate):-
  296 prolog_mustEach((
  297   traceIf(useNewCateSigSearch_broken_now),
  298   OutputLevel = OutputLevel1 - OutputLevel2 - OutputLevel3,!,
  299   CPreTopic = true,
  300   make_preconds_for_match(Ctx,'topic',Topic,CateSig,PreTopic,AfterTopic,CPreTopic,CAfterTopic,Out,MinedCates,EachMatchSig_Topic,StarSets_Topic,OutputLevel1),
  301   make_preconds_for_match(Ctx,'that',That,CateSig,AfterTopic,AfterThat,CAfterTopic,CAfterThat,Out,MinedCates,EachMatchSig_That,StarSets_That,OutputLevel2),
  302   make_preconds_for_match(Ctx,'pattern',Pattern,CateSig,AfterThat,FindPatternGoal,CAfterThat,CommitTemplate,Out,MinedCates,EachMatchSig_Pattern,StarSets_Pattern,OutputLevel3),
  303   prolog_must((var(Out),var(OutputLevel1),var(OutputLevel2),var(OutputLevel3))),
  304   must_be_openCate(CateSig))),
  305  prolog_mustEach((
  306   %%%%% Iterate here %%%%   
  307   atLeastOne(call((FindPatternGoal,
  308       /*
  309       combineStarSets(StarSets_Topic,StarSets_That,StarSets_Pattern,StarSets_All),
  310       copy_term(CateSig,CateSig2),ignore(CateSig2),
  311       traceIf((That=['How',_|_],nop(CateSig=CateSig2))),
  312       */

  313       CateSig))),   
  314   clauseRef(CateSig,ClauseNumber),
  315   singletons([EachMatchSig_Topic,EachMatchSig_That,EachMatchSig_Pattern]),
  316   combineStarSets(StarSets_Topic,StarSets_That,StarSets_Pattern,StarSets_All))).
  317
  318savedSetPatterns(LSP,OutputLevel,StarSets,MatchPattern):- LSP = lsp(OutputLevel,StarSets,MatchPattern).
  319
  320make_preconds_for_match(Ctx,StarName,TextPattern,CateSig,PrecondsSearch,PostcondsSearch,PrecondsCommit,PostcondsCommit,Out,MinedCates,EachMatchSig,StarSets,
  321 OutputLevel):-   
  322   make_prepost_conds(Ctx,StarName,TextPattern,CateSig,FindPatternGoal,CommitTemplate,Out,MinedCates,EachMatchSig,StarSets,OutputLevel),
  323   combineConjCall(PrecondsSearch,FindPatternGoal,PostcondsSearch),
  324   combineConjCall(PrecondsCommit,CommitTemplate,PostcondsCommit).
  325
  326%%TODO: MAKE THIS ONE WORK ! (CURRENTLY WORKS)
  327make_prepost_conds(Ctx,StarName,TextPattern,CateSig,FindPatternGoal,CommitTemplate,Out,MinedCates,EachMatchSig,StarSets,OutputLevel):-  
  328 prolog_mustEach((
  329  CommitTemplate = true,
  330  generateMatchPatterns(Ctx,StarName,Out,TextPattern,CateSig,MinedCates,EachMatchSig),
  331  savedSetPatterns(LSP,OutputLevel,StarSets,MatchPattern),
  332  getCategoryArg(Ctx,StarName,MatchPattern,Out,CateSig),
  333  FindPatternGoal = ( member(LSP,EachMatchSig)/*,CateSig */) )),!.
  334
  335contextUsedClaused(Ctx,CateSig,ClauseNumber):- fail, contains_term(Ctx,CateSig)->not(contains_term(Ctx,ClauseNumber));not(contains_term(Ctx,ClauseNumber)).
  336
  337makeWithAttributes([],Proof,Proof):-!.
  338makeWithAttributes(StarSets_All,Proof,withAttributes(StarSets_All,Proof)).
  339
  340retractallSrais(SYM):-prolog_must(nonvar(SYM)),ifThen(nonvar(SYM),(retractall(dict(SYM,_,_)))),fail.
  341retractallSrais(_SYM):-!.
  342
  343cateStrength(_CateSig,1.1):-!.
  344
  345computeSRAI2(Ctx,Votes,ConvThread,_SYM1,Pattern,Out,VotesO,ProofOut,OutputLevel):- !,
  346    computeSRAI222(Ctx,Votes,ConvThread,_SYM2,Pattern,Out,VotesO,ProofOut,OutputLevel)
  346.
  347
  348getCategoryArg(Ctx,StarName,MatchPattern,Out,CateSig):-
  349   prolog_must(getCategoryArg0(Ctx,StarName,MatchPattern,Out,CateSig)),!.
  350
  351getCategoryArg0(Ctx,StarName,MatchPattern,_Out,CateSig):-atomic(StarName),!,
  352  getCategoryArg1(Ctx,StarName,MatchPattern,_StarNumber,CateSig),!.
  353  
  354getCategoryArg0(Ctx,FAB,OutAOutB,Out,CateSig):- FAB=..[F,A,B],
  355      getCategoryArg(Ctx,A,OutA,Out,CateSig),!,
  356      getCategoryArg(Ctx,B,OutB,Out,CateSig),!,
  357      OutAOutB=..[F,OutA,OutB].
  358
  359getCategoryArg1(_Ctx,StarName,MatchPattern,StarNumber,CateSig):-
  360   prolog_must(aimlCateSig(CateSig)),
  361   aimlCateOrder(Order),
  362   nth1(StarNumber,Order,StarName),
  363   prolog_must(arg(StarNumber,CateSig,MatchPattern)),!.
  364
  365
  366meansNothing(Var,_Nothing):-var(Var),!,aiml_error(meansNothing(var(Var))),!.
  367meansNothing([Atomic],Nothing):-nonvar(Atomic),!,meansNothing(Atomic,Nothing),!.
  368meansNothing(N,['Nothing']):-member(N,[[],'Nothing']),!.
  369meansNothing(Atom,['Nothing']):-atom(Atom),!,fail.
  370meansNothing(InputNothing,InputPattern):-prolog_must((ground(InputNothing),var(InputPattern))),meansNothing0(InputNothing,InputPattern),!.
  371
  372meansNothing0([Atom],Out):-!,meansNothing0(Atom,Out).
  373meansNothing0('_',['Nothing']).
  374meansNothing0('*',['Nothing']).
  375
  376combineConjCall(A,B,C):-A==true,!,C=B.
  377combineConjCall(A,B,C):-B==true,!,C=A.
  378combineConjCall(A,B,C):- C = (A,B).
  379
  380addToMinedCates(_MinedCates,_CateSig):-!.
  381addToMinedCates(MinedCates,CateSig):-prolog_must(ground(CateSig)),append(_,[CateSig|_],MinedCates),!.
  382addToMinedCates(MinedCates,CateSig):-atrace,var(MinedCates),!,MinedCates=[CateSig|_].
  383
  384notSingletons(_Singleton_List):-!.
  385
  386%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  387% generateMatchPatterns -  finds the candidate indexers for some textInput
  388%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  389generateMatchPatterns(_Ctx,_StarName,_Out,_InputNothing,_CateSig,_NC_MinedCates,EachMatchSig):-nonvar(EachMatchSig),trace,!. % already done
  390
  391generateMatchPatterns(Ctx,StarName,Out,InputNothing,CateSig,NC_MinedCates,EachMatchSig):- fail,
  392  hotrace(meansNothing(InputNothing,InputPattern)),
  393  InputNothing\==InputPattern,!,
  394  generateMatchPatterns(Ctx,StarName,Out,InputPattern,CateSig,NC_MinedCates,EachMatchSig).
  395
  396generateMatchPatterns(Ctx,StarName,Out,InputNothing,CateSig,_NC_MinedCates,EachMatchSig):- fail,
  397  hotrace(meansNothing(InputNothing,_InputPattern)),!,
  398  traceIf(InputNothing\==['Nothing']),
  399  must_be_openCate(CateSig),
  400  getCategoryArg(Ctx,StarName,'*',Out,CateSig),
  401   prolog_must(EachMatchSig=[_|_]),
  402  must_be_openCate(CateSig),!.
  405generateMatchPatterns(Ctx,StarName,Out,InputPattern,CateSigIn,MinedCates,SetOfEachMatchSig):-  useIndexPatternsForCateSearch,
  406 prolog_mustEach((
  407  copy_term(CateSigIn,CateSig),
  408  CateSigIn=CateSig,
  409 functor(CateSig,CateSigFunctor,_Args),
  410  must_be_openCate(CateSig),
  411  getCategoryArg(Ctx,StarName,IndexPattern,Out,CateSig),
  412  savedSetPatterns(LSP,OutputLevel,StarSets,IndexPattern),   
  413  findall(LSP,
  414             (argNFoundGenerate(CateSigFunctor,StarName,MatchPattern,IndexPattern,InputPattern),
  415              %%argNFound(CateSigFunctor,StarName,MatchPattern,IndexPattern),
  416              canMatchAtAll_debug(Ctx,StarName,InputPattern,MatchPattern,OutputLevel,StarSets)),
  417      EachMatchSig),
  418  prolog_must(EachMatchSig=[_|_]),
  419  sort(EachMatchSig,SetOfEachMatchSig),  
  420  prolog_must(debugFmtList([
  421        starName = StarName,
  422        %%eachMatchSig(EachMatchSig),
  423        setOfEachMatchSig=SetOfEachMatchSig,
  424        eachMatchSig=EachMatchSig,
  425        matchPattern=MatchPattern,
  426        minedCates=(MinedCates),
  427        cateSig=CateSig
  428        ])))),!.
  432generateMatchPatterns(Ctx,StarName,Out,InputPattern,CateSig,_MinedCates,EachMatchSig):- ifThen(useIndexPatternsForCateSearch,atrace),
  434  must_be_openCate(CateSig),
  435  copy_term(CateSig,CateSigC),!,
  436  getCategoryArg(Ctx,StarName,MatchPattern,Out,CateSigC),
  437  findall(MatchPattern,CateSigC,AllMatchSig),!,sort(AllMatchSig,SetOfEachMatchSig),!,
  438  savedSetPatterns(LSP,OutputLevel,StarSets,MatchPattern),
  439  findall(LSP,
  440             (member(MatchPattern,SetOfEachMatchSig), 
  441              canMatchAtAll_debug(Ctx,StarName,InputPattern,MatchPattern,OutputLevel,StarSets)),
  442      EachMatchSig),
  443 %%traceIf((StarName==pattern,InputPattern=[_,_|_])),
  444   prolog_must(EachMatchSig=[_|_]),
  445  prolog_must(debugFmtList([
  446        starName = StarName,
  447        eachMatchSig(EachMatchSig),
  448        setOfEachMatchSig=SetOfEachMatchSig,
  449        eachMatchSig=EachMatchSig,
  450        matchPattern=MatchPattern,
  451        cateSig=CateSig
  452        ]))
  452.
  453
  454% ========================================================================================
  455%  canMatchAtAll_debug(Ctx,StarName,InputPattern,MatchPattern,OutputLevel,StarSets)
  456% ========================================================================================
  457
  458canMatchAtAll_debug(Ctx,StarName,InputPattern,MatchPattern,OutputLevel,StarSets):-
  459    make_star_binders(Ctx,StarName,1,InputPattern,MatchPattern,OutputLevelInv,StarSets),checkStarSets(StarSets),!,OutputLevel is 1/OutputLevelInv ,
  460    nop(debugFmt(pass_canMatchAtAll_debug(Ctx,StarName,InputPattern,MatchPattern,OutputLevel,StarSets))),!.
  461
  462canMatchAtAll_debug(Ctx,StarName,InputPattern,MatchPattern,_OutputLevel,_StarSets):-
  463    nop(debugFmt(fail_canMatchAtAll_debug(Ctx,StarName,InputPattern,MatchPattern))),!,fail.
  464
  465% skip over skipable words
  466consumeSkippables([],[]).
  467consumeSkippables([Skipable|B],BB):- isIgnoreableWord(Skipable),!,consumeSkippables(B,BB).
  468consumeSkippables(A,A).
  469
  470removeSkippables(A,A):-atomic(A),!.
  471removeSkippables([Skipable|B],BB):- isIgnoreableWord(Skipable),!,removeSkippables(B,BB).
  472removeSkippables([Skipable|B],[Skipable|BB]):- removeSkippables(B,BB).
  473removeSkippables(A,A).
  474
  475% ======================================================================================== 
  476% make_star_binders(Ctx, StarName, Text , Pattern, 1/OutputLevel, StarSetsNameValues).
  477%
  478% pattern_match(Text , Pattern)..  would be simply   make_star_binders(_Ctx, starName, 1, Text , Pattern, _OutputLevel, _StarSetsNameValues).
  479% ========================================================================================
  480make_star_binders(_Ctx,StarName,_N,InputPattern,MatchPattern,OutputLevel,StarSets):- 
  481   prolog_must(var(StarSets)),prolog_must(var(OutputLevel)),prolog_must(ground(StarName:InputPattern:MatchPattern)),fail.  
  482
  483make_star_binders(Ctx,StarName,N,InputText,Indexical,WildValue,Pred):-
  484   %%% side with most stars should have to be shorter or same length?
  485   %%% cant preguess dual sided stars: ((is_list(InputText),is_list(Indexical))-> (length(InputText,IL),IL2 is IL+2,length(Indexical,PL),PL=<IL2) ; true),
  486   removeSkippables(Indexical,IndexicalChanged),
  488     (Indexical==IndexicalChanged->
  490       (removeSkippables(InputText,Text),!,make_star_binders0(Ctx,StarName,N,Text,Indexical,WildValue,Pred));
  492       make_star_binders0(Ctx,StarName,N,InputText,Indexical,WildValue,Pred))
  492,!
  492.
  493
  494/*
  495SO.. The IF/THEN/ELSE pattern is for when the pattern contains non-text
  496
  49746 ?- starMatch([('"'),a,*,*],[('"'),a,be,c,('"')],StarSets).
  498StarSets = [tstar1=be, tstar2=[c, '"']].
  499
  50047 ?- starMatch([a,*,*],[('"'),a,be,c,('"')],StarSets).
  501StarSets = [tstar1=be, tstar2=[c]].
  502
  503starMatch(Pattern,Text,StarSets)
  504*/

  505
  506starMatch(Pattern,Text,StarSets):-make_star_binders(_Ctx,'t',1,Text,Pattern,_OutputLevelInv,StarSets).
  507
  508:-setLogLevel(make_star_binders0,none).
  509
  510%end check
  511make_star_binders0(_Ctx,_StarName,_N,L,R,1,[]):-R==[],consumeSkippables(L,LL),LL==[],!.
  512make_star_binders0(_Ctx,_StarName,_N,L,R,1,[]):-L==[],consumeSkippables(R,RR),RR==[],!.
  513
  514% left hand star/wild  (cannot really happen (i hope))
  515%make_star_binders0(_Ctx,StarName,N,Star,_Match,_OutputLevel,_StarSets):- fail, not([StarName]=Star),isStarOrWild(StarName,N,Star,_WildValue,_WMatch,_Pred),!,atrace,fail. 
  516
  517
  518% simplify
  519make_star_binders0(Ctx,StarName,N,[Word1|B],[Word2|BB],CountO,StarSets):-
  520     sameWords(Word1,Word2),!,make_star_binders0(Ctx,StarName,N,B,BB,Count,StarSets),CountO is Count + 1.
  521
  522/*
  523% simplify (from last)
  524
  525 41 ?- starMatch([('"'),a,*,c,*,('"')],[('"'),a,be,c,('"')],StarSets).
  526 StarSets = [tstar1=[be], tstar2='"']
  527
  528   might be good to uncomment the next two lines to prevent this!
  529*/

  530make_star_binders0(Ctx,StarName,N,Word1B,Word2BB,CountO,StarSets):-append(B,[Word1],Word1B),append(BB,[Word2],Word2BB),
  531     sameWords(Word1,Word2),!,make_star_binders0(Ctx,StarName,N,B,BB,Count,StarSets),CountO is Count + 1.
  532
  533% wildcard and match on opposite sides!  makes tests fail though TODO .. make this possible w/o loops
  534%%make_star_binders0(Ctx,StarName,N,[WildCard|BB],[MW|MatchB],ValueO,PredO):- isStarOrWild(StarName,N,WildCard,_WildValue,_Match,_Pred),not(isStarOrWild(StarName,N,MW,_,_,_)),
  535%%     make_star_binders0(Ctx,StarName,N,[MW|MatchB],[WildCard|BB],ValueO,PredO).
  536
  537% tail (all now in) star/wildcard
  538make_star_binders0(_Ctx,StarName,N,InputText,WildCard,WildValue,[Pred]):-isStarOrWild(StarName,N,WildCard,WildValue,InputText,Pred),!,checkStarSets([Pred]).
  539
  540% once in star.. walk past star
  541make_star_binders0(Ctx,StarName,N,InputText,[WildCard,M0|More],ValueO,[Pred|StarSets]):-isStarOrWild(StarName,N,WildCard,WildValue,SkipedSTAR,Pred),
  542         (WildCard=='^'->SkipedSTAR=_;SkipedSTAR=[_|_]),append(SkipedSTAR,[M1|LeftMore],InputText),sameWords(M0,M1),N2 is N+1,
  543         make_star_binders0(Ctx,StarName,N2,LeftMore,More,Value,StarSets),!,ValueO is WildValue + Value,checkStarSets([Pred|StarSets]).
  544
  545% is mid-right hand wildcard (this should be the last test)
  546make_star_binders0(Ctx,StarName,N,[Match|B],[WildCard|BB],ValueO,[Pred|StarSets]):- isStarOrWild(StarName,N,WildCard,WildValue,Match, Pred),!,
  547     N2 is N+1,
  548     make_star_binders0(Ctx,StarName,N2,B,BB,Value,StarSets),!,ValueO is WildValue + Value,checkStarSets([Pred|StarSets]).
  549
  550% tail is an atom (indexical unifier)
  551make_star_binders0(Ctx,StarName,N,InputText,Indexical,WildValue,Pred):-
  552      atom(Indexical),!,
  553      make_star_binders0(Ctx,StarName,N,InputText,[Indexical],WildValue,Pred),checkStarSets([Pred]).
  554
  555% tail is a compound (indexical unifier)
  556make_star_binders0(Ctx,StarName,N,InputText,Indexical,WildValue,Pred):-
  557      not(is_list(Indexical)),/*compound(Indexical),*/fromIndexableSArg0(Indexical,LIST),LIST=[_|_],
  558      make_star_binders0(Ctx,StarName,N,InputText,LIST,WildValue,Pred),checkStarSets([Pred]).
  559
  560
  561
  562% skip over skippable words
  563make_star_binders0(Ctx,StarName,N,Skipable,BB,CountO,StarSets):- 
  564  skipablePhrase(Skipable,B),!,make_star_binders0(Ctx,StarName,N,B,BB,Count,StarSets),CountO is Count + 1.
  565  %%warnIf((isIgnoreableWord(Skipable),!,make_star_binders0(Ctx,StarName,N,B,BB,Count,StarSets),CountO is Count + 1)),number(CountO).
  566
  567
  568skipablePhrase([Skipable|B],B):-isIgnoreableWord(Skipable),!.
  569skipablePhrase([Skip,'\b',Ble|B],[Skipable|B]):-joinAtoms([Skip,'\b',Ble],' ',Skipable),!.
  570
  571isIgnoreableWord(Skipable):-member(Skipable,['-','(',')',',','?','.','','\'',('"')]).
  572isIgnoreableWord(Skipable):-isWhiteWord(Skipable).
  573
  574isWhiteWord(Skipable):-member(Skipable,[' ','\b','\n','']).
  575
  576%
  577% re-write section
  578%
  579%
  580/*
  581make_star_binders(Ctx,StarName,InputNothing,MatchPattern,OutputLevel,StarSets):- 
  582   hotrace((InputNothing \== '*',(InputPattern==StarName ; meansNothing(InputNothing,InputPattern)))),!, atrace,
  583   make_star_binders(Ctx,StarName,['Nothing'],MatchPattern,OutputLevel,StarSets).
  584
  585
  586% must come before search failures
  587make_star_binders(Ctx,StarName,TextPattern,MatchPattern,OutputLevel,StarSets):- fail,
  588  hotrace(((convertToMatchable(TextPattern,InputPattern),TextPattern \== InputPattern))),!,
  589  make_star_binders(Ctx,StarName,InputPattern,MatchPattern,OutputLevel,StarSets),!,atrace.
  590
  591% fast veto
  592make_star_binders(_Ctx,StarName,[I0|Pattern],[Match|MPattern],_OutputLevel,_Commit):-
  593   member(M,[Match|MPattern]),requireableWord(StarName,M),not(member(M,[I0|Pattern])),!,fail.
  594
  595% fast veto
  596make_star_binders(_Ctx,_StarName,[_],[_,_|_],_NoNum,_NoCommit):-!,fail.
  597
  598
  599make_star_binders(_Ctx,StarName,[E|More],Match,Value,[tryLater([E|More],Match)]):-compound(E),atrace,isWildCard(StarName,E,Value),!.
  600
  601% weird atom
  602%%make_star_binders(_Ctx,StarName,I,Atom,12,[Atom=I]):-atom(Atom),atrace,!,loggerFmt(make_star_binders,canMatchAtAll_atom(StarName,I,Atom)),!.
  603
  604*/

  605starNameTransform(Star,StarStar):-starName(Star,StarStar),!.
  606starNameTransform(StarName,StarName):-atom_concat(_,'star',StarName),!.
  607starNameTransform(StarName,StarNameStar):-atom_concat(StarName,'star',StarNameStar),!.
  608
  609isStarOrWild(StarName,N,[StarNameText],WildValue,InputText,Pred):-nonvar(StarNameText),!,isStarOrWild(StarName,N,StarNameText,WildValue,InputText,Pred),!.
  610
  611isStarOrWild(StarName,_N,WildCardText,WildValue,InputText,Pred):- isWildCard(StarName,WildCardText,WildValue,InputText,Pred),!.
  612isStarOrWild(StarName,N,StarNameText,WildValue,InputText,StarNameStarN=InputText):-
  613   isStar(StarName,StarNameText,WildValue),!,starNameTransform(StarName,StarNameStar),atom_concat(StarNameStar,N,StarNameStarN),!,traceIf(isStarValue(InputText)).
  614
  615isWildCard(StarName,Wild,1,InputText,call(sameWCBinding(StarName,Wild,InputText))):- not(is_list(Wild)),compound(Wild),!. %%Wild=..LWild,!. %%not(not(member(StarName,LWild))),!.
  616
  617requireableWord(StarName,M):-not(isOptionalOrStar(StarName,M)).
  618
  619isOptionalOrStar(_StarName,M):-not(atom(M)),!,atrace.
  620isOptionalOrStar(StarName,M):-isStar2(StarName,M),!.
  621
  622/*
  623isStar(StarName,'topic'):-!. %%,atrace.
  624isStar(StarName,'that'):-!.
  625isStar(StarName,'input'):-!.
  626*/

  627isStar2(StarName,StarNameText):-isStar(StarName,StarNameText,_Order),!.
  628isStar(StarName,StarNameText,WildValue):-not(ground(StarNameText)),atrace,debugFmt(isStar(StarName,StarNameText,WildValue)),!,fail.
  629isStar(StarName,[StarNameText],WildValue):-isStar(StarName,StarNameText,WildValue),!.
  630isStar(StarName,element(StarName,_,_),0.8).
  631isStar(StarName,star(StarName,_,_),0.8).
  632%%isStar(_StarName,element(_,_,_),0.7).
  633isStar(_StarName,'*',0.3).
  634isStar(_StarName,'^',0.8).
  635isStar(_StarName,'_',0.8).
  636%%WAS VERY BAD IDEA:  isStar(StarName,StarNameText,6):-atom(StarName),!,StarNameText==StarName,writeq(qqqq-qq),atrace.
  637
  638
  639must_be_openCate(_CateSig):-!.
  640must_be_openCate(CateSig):- prolog_must(hotrace((((nonvar(CateSig),not(ground(CateSig)),must_be_openCate0(CateSig)))))),!.
  641must_be_openCate0(CateSig):- arg(_,CateSig,Arg),must_be_openCateArgs(Arg,CateSig),fail.
  642must_be_openCate0(_CateSig):-!.
  643
  644must_be_openCateArgs(Arg,_CateSig):-var(Arg),!.
  645must_be_openCateArgs('*',_CateSig):-!.
  646must_be_openCateArgs(List,CateSig):-atrace, throw(List:CateSig),!.
  647
  648starSets(Ctx,List):-prolog_must((mapsome_openlist(starMust0,List),mapsome_openlist(starMust1(Ctx),List),mapsome_openlist(starMust2,List))),!.
  649
  650star_flag(Flag,Out,In):- starNameTransform(Flag,StarFlag), flag(StarFlag,Out,In),!. %%,prolog_must(atom_concat(_,'star',Flag)),!.
  651
  652endOfList(EndOfList):-(var(EndOfList);atomic(EndOfList)),!.
  653
  654starMust0(StarName=_):-star_flag(StarName,_,1).
  655starMust1(Ctx,StarName=Value):-starSet(Ctx,StarName,Value).
  656starMust2(call(Call)):-!,prolog_must(Call).
  657starMust2(_Skip).
  658
  659starSet(Ctx,StarNameI,Pattern):- 
  660   starName(StarNameI,StarName),
  661   ignore((nop(var(N)),star_flag(StarName,N,N))),
  662   traceIf(isStarValue(Pattern)),
  663   getDictFromAttributes(Ctx,'evalsrai',[],Dict),
  664   prolog_must(Dict\==user),
  665   atom_concat(StarName,N,StarNameN),
  666   prolog_must(not((getAliceMemComplete(Ctx,Dict,StarNameN,Old),debugFmt(getAliceMemComplete(Ctx,Dict,StarNameN,Old))))),
  667   setAliceMem(Ctx,Dict,StarNameN,Pattern),!,star_flag(StarName,NN,NN+1).
  668
  669%%REAL-UNUSED  set_matchit1(StarName,Pattern,Matcher,OnBind):- length(Pattern,MaxLen0), MaxLen is MaxLen0 + 2,
  670%%REAL-UNUSED    set_matchit2(StarName,Pattern,Matcher,MaxLen,OnBind).
  671
  672%%isStar0(Word1):- member(Word1,[*,'_']).
  673isStar0(X):-var(X),!,aiml_error(isStar0(X)).
  674isStar0('*').
  675isStar0('_').
  676
  677sameWords(Word1,Word2):-atom(Word1),atom(Word2),atoms_match0(Word1,Word2).
  678 atoms_match0(Word1,Word2):- (isStar0(Word1);isStar0(Word2)),!,fail.
  679 atoms_match0(Word1,Word1):-!.
  680 atoms_match0(Word1,Word2):-literal_atom(Word1,WordO),literal_atom(Word2,WordO),!