10
11
14
15
16
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),!.
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
54atomify(A,A):-var(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).
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
82
83splitSentences(In,Out):- notrace(splitSentences0(In,Out)). 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)). 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
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
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
162
163
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)))