1% ===================================================================
    2% File 'logicmoo_module_aiml_main.pl'
    3% Purpose: To load and test the AIML interpretor (sanity checks)
    4% Maintainers: Douglas Miles/Annie Ogborn/Kino Coursey
    5% Contact: $Author: dmiles $@users.sourceforge.net ;
    6% Version: 'logicmoo_module_aiml_main.pl' 1.0.0
    7% Revision:  $Revision: 1.7 $
    8% Revised At:   $Date: 2002/07/11 21:57:28 $
    9% ===================================================================
   10
   11
   12%:- use_module(library(programk/cyc_pl/cyc),
   13%  [is_string/1,atom_number/2,balanceBinding/2,writeFmtFlushed/2,writeFmtFlushed/3,toCycApiExpression/3]).
   14
   15
   16
   17% ===============================================================================================
   18% Split input into many words
   19% ===============================================================================================
   20%toString_atom(Input,Atom):- fail,toCycApiExpression(Input,Out,[]),atrace,string_to_atom(Atom,Out).
   21toString_atom(Input,Atom):- string_to_atom(Input,Atom),!.
   22
   23tokenizeInput(Input,Tokens):- notrace(is_string(Input)),toString_atom(Input,Atom),Input\=@=Atom,!,tokenizeInput(Atom,Tokens),!.
   24%%tokenizeInput(String,Tokens):-hotrace(tokenizeInput0(String,Tokens)),!.
   25tokenizeInput(String,Tokens):-hotrace(tokenizeInput0(String,Tokens)),Tokens\==[],ground(Tokens),!.
   26tokenizeInput(String,Tokens):-tokenizeInput0(String,Tokens),!.
   27
   28tokenizeInput0(Input,Tokens):-var(Input),!,Input=Tokens.
   29tokenizeInput0([],[]):-!.
   30tokenizeInput0([C0,C1|Odes],Tokens):- integer(C0),integer(C1),name(Input,[C0,C1|Odes]),!,tokenizeInput0(Input,Tokens).
   31tokenizeInput0(Input,Tokens):- string(Input),string_to_atom(Input,Atom),Input\=@=Atom,!,tokenizeInput1(Atom,Tokens).
   32tokenizeInput0([A|B],Out):- !, tokenizeInput0(A,AA),tokenizeInput_l(B,BB),!,flatten([AA,BB],Out).
   33tokenizeInput0(Input,Tokens):- atom(Input),tokenizeInput1(Input,Tokens),!.
   34tokenizeInput0(Input,Tokens):- number(Input),atom_number(Tokens,Input),!.
   35tokenizeInput0(Input,Tokens):- notrace(is_string(Input)),toString_atom(Input,Atom),Input\=@=Atom,!,tokenizeInput0(Atom,Tokens).
   36tokenizeInput0(Input,Tokens):- notrace(is_string(Input)),toString_atom(Input,Atom),!,tokenizeInput1(Atom,Tokens).
   37tokenizeInput0(Compound,Out):- Compound=..[A|B],tokenizeInput_l(B,BB),!,Out=..[A|BB].
   38tokenizeInput0(A,A).
   39
   40
   41tokenizeInput_l(A,A):-atomic(A),!.
   42tokenizeInput_l([A|B],[AA|BB]):- tokenizeInput0(A,AA),tokenizeInput_l(B,BB),!.
   43
   44tokenizeInput1(Input,Tokens):-  notrace(error_catch(((atom_to_term(Input,Tokens,Vars),ground(Vars))),_,fail)),!.
   45tokenizeInput1(Input,Tokens):-  (atom_contains(Input,'<');atom_contains(Input,'&')),
   46     error_catch((string_to_structure(Input,Tokens0),(Tokens0\==[Input]->tokenizeInput0(Tokens0,Tokens);Tokens0=Tokens)),_,fail),!.
   47tokenizeInput1(Input,Tokens):- atomWSplit(Input,Tokens0), (Tokens0\==[Input]->tokenizeInput0(Tokens0,Tokens);Tokens0=Tokens),!.
   48tokenizeInput1(Input,Input).
   49
   50
   51% ===============================================================================================
   52% Join input into many words
   53% ===============================================================================================
   54atomify(A,A):-var(A),!.
   55%%%atomify(A,A):-atomic(A),!.
   56atomify([A],A):-atom(A),!.
   57atomify(A,A):-atomic(A),!.
   58atomify(A,AA):-number(A),atom_number(AA,A),!.
   59atomify([A],AA):-atomify(A,AA),!.
   60atomify([A|List],Result):-joinAtoms([A|List],' ',Result).
   61
   62joinAtoms([],_,'').
   63joinAtoms(List,Sep,Result):-atomify(Sep,SepA),Sep\==SepA,!,joinAtoms(List,SepA,Result).
   64joinAtoms(List,Sep,Result):-hotrace(prolog_must(joinAtoms0(List,Sep,Result))),!.
   65
   66joinAtoms0([],_,'').
   67joinAtoms0([A],_,AA):-atomify(A,AA).
   68joinAtoms0([A|More],Sep,Result):-atomify(A,AA),A\==AA,!,joinAtoms0([AA|More],Sep,Result).
   69joinAtoms0([A|List],Sep,Result):-prolog_must(atomic(A)),joinAtoms1([A|List],Sep,Result).
   70
   71joinAtoms1([],_,'').
   72joinAtoms1([A],_,AA):-atomify(A,AA).
   73%%%%joinAtoms1([A,'\b',B|List],Sep,Result):-!,joinAtoms0([B|List],Sep,ResultR),atom_concat(A,ResultR,Result).
   74joinAtoms1([A,'\b',B|List],Sep,Result):-!,atomify(B,BB),atom_concat(A,BB,C),!,joinAtoms0([C|List],Sep,Result).
   75joinAtoms1([A,B|List],'',Result):-!,atom_concat(A,B,C),!,joinAtoms1([C|List],'',Result).
   76joinAtoms1([A,B|List],Sep,Result):-atom_concat(A,Sep,C),joinAtoms1([B|List],Sep,ResultR),atom_concat(C,ResultR,Result).
   77joinAtoms1(List,Sep,Result):- debugOnError(atomic_list_concat_aiml(List,Sep,Result)),!.
   78
   79% ===============================================================================================
   80% Split input into many sentences
   81% ===============================================================================================
   82
   83splitSentences(In,Out):- notrace(splitSentences0(In,Out)). %,flatten(Out,OutL),traceIf(member(xml,OutL)),!.
   84splitSentences0([],[]):-!.   
   85splitSentences0(SR1,[SR0|SRMORE]):-grabFirstSetence(SR1,SR0,LeftOver),!,splitSentences0(LeftOver,SRMORE),!.
   86splitSentences0(SR1,[SR1]):-!.
   87
   88splitSentencesOn(Starters,Enders,In,Out):- hotrace(splitSentencesOn0(Starters,Enders,In,Out)).%%%,flatten(Out,OutL),traceIf(member(xml,OutL)),!.
   89splitSentencesOn0(_Starters,_Enders,[],[]):-!.   
   90splitSentencesOn0(Starters,Enders,SR1,[SR0|SRMORE]):-grabFirstSetenceOn(Starters,Enders,SR1,SR0,LeftOver),!,splitSentencesOn0(Starters,Enders,LeftOver,SRMORE),!.
   91splitSentencesOn0(_Starters,_Enders,SR1,[SR1]):-!.
   92
   93grabFirstSetence(SR1,SRS,LeftOver):-LeftSide=[_|_],append(LeftSide,[EOS|LeftOver],SR1),sentenceBreakChar(EOS),validSentenceEnder([EOS|LeftOver]),append(LeftSide,[EOS],SR0),cleanSentence(SR0,SRS),!.
   94cleanSentence(SR0,SRSOutput):-prolog_must(leftTrim(SR0,sentenceEnderOrPunct,SRS)),!,rightTrim(SRS,sentenceEnderOrPunct_NoQuestion,SRSOut),trimWhitepaceOffEnds(SRSOut,SRSOutput).
   95
   96trimWhitepaceOffEnds(SRSOut,SRSOutput):-leftTrim(SRSOut,isWhiteWord,SRS),rightTrim(SRS,isWhiteWord,SRSOutput).
   97
   98validSentenceEnder(['.',xml|_]):-!,fail.
   99validSentenceEnder(['.','\b'|_]):-!,fail.
  100validSentenceEnder(_).
  101
  102grabFirstSetenceOn(Starters,Enders,SR1,SRS,LeftOver):-LeftSide=[_|_],append(LeftSide,[EOS|LeftOver],SR1),
  103    ((member(EOS,Enders)->append(LeftSide,[EOS],SR0));
  104    (member(EOS,Starters)->append(LeftSide,[],SR0));
  105    fail),cleanSentence(SR0,SRS),!.
  106
  107% ===============================================================================================
  108% Convert to Matchable
  109% ===============================================================================================
  110
  111convertToMatchableCS(That,Words):-
  112      answerOutput(That,AA),!,
  113      deleteAll(AA,['.','!','?','\'','!','','\b',' ','\n',',','\r\n','\n\n'],Words),!.
  114
  115convertToMatchable(That,LastSaid):-
  116      convertToMatchableCS(That,Words),!,
  117      ignorecase_literal(Words,LastSaid),!.
  118
  119
  120
  121literal_atom_safe(A,B):-atom(A),literal_atom(A,B),!.
  122literal_atom(A,B):-downcase_atom(A,B),!.
  123is_literal(X):-atom(X),literal_atom(X,N),!,N=X.
  124
  125ignorecase_literal(A,B):-literal_atom_safe(A,B),!.
  126ignorecase_literal(A,B):-number(A),atom_number(N,A),literal_atom_safe(N,B),!.
  127ignorecase_literal(A,B):-toLowercase(A,B),!.
  128
  129
  130% ===============================================================================================
  131% Create Talk Generation Paths
  132% ===============================================================================================
  133/*
  134
  135generally we have these types of transformers
  136
  137
  138convert_ele (loading)
  139outputPaths (generate possible grounded outputs)
  140computeAnswer (really generate output at runtime)
  141
  142?-  tell(allSaid),allSaid(That,Aiml),'format'('~q.   %%  ~q. ~n',[That,Aiml]),fail.
  143
  144
  145%% create transitions between <template> and <that> 
  146tell('allSaid1.pl'),allSaid(That),'format'('oneSaid(~q).~n',[That]),fail. told.
  147tell('allThat1.pl'),allThats(That),'format'('oneThat(~q).~n',[That]),fail. told.
  148
  149*/

  150%%:-['temp/allThat1.pl'],['temp/allSaid1.pl'].
  151
  152findThatMatch(Aiml1,Aiml2):-allThats(Sarg,Aiml1),allSaid(Path,Aiml2),sameBindingIC(Sarg,Path).
  153
  154allThats(That):- findall(Sarg,(aimlCateArg(that,_Aiml,Arg),Arg\=(*),fromIndexableSArg(Arg,Sarg)),List),sort(List,Set),member(That,Set).
  155allThats(That,Aiml):- findall(Sarg=Aiml,(aimlCateArg(that,Aiml,Arg),Arg\=(*),fromIndexableSArg(Arg,Sarg)),List),sort(List,Set),member(That=Aiml,Set).
  156
  157allSaid(That):- findall(Sarg,(aimlCateArg(template,_Aiml,Arg),outputPath(_Ctx,Arg,Sarg)),List),sort(List,Set),member(That,Set).
  158allSaid(That,Aiml):- findall(Sarg=Aiml,(aimlCateArg(template,Aiml,Arg),outputPath(_Ctx,Arg,Sarg)),List),sort(List,Set),member(That=Aiml,Set).
  159
  160
  161%%?- length(Text,T1),(T1<100->true;!),oneThat(Pattern),oneSaid(Text),starMatch(Pattern,Text,StarSets),'format'('~q.~n',[arMatch(Pattern,Text)]),fail.
  162
  163
  164%%:-dynamic(inGenOutput).
  165%%inGenOutput.ยท
  166
  167outputPath(Ctx,Input,Path):-!, setup_call_cleanup(assert(inGenOutput),computeInnerTemplate(Ctx,1,Input,Path,_VotesO),retractall(inGenOutput)).
  168
  169
  170outputPath(Ctx,Input,Path):- 
  171   withAttributes(Ctx,[generateUnknownVars=true,generateTemplate=true],
  172    (computeInnerTemplate(Ctx,1,Input,Path,_VotesO)))