· 7 years ago · Nov 16, 2018, 08:30 AM
1Rem Type=Brain
2Rem Name=Ultra Hal 6.2 Default Brain
3Rem Author=Zabaware
4Rem Language=VBScript
5Rem DB=HalBrain.db
6
7'The UltraHal function is called by Ultra Hal Assistant 6.x or a compatible host application
8'It passes an unformated string of the user's input as well as all remembered variables.
9'The UltraHal function splits the user's input into seperate sentences and than calls
10'GetResponse to get a response for each user sentence. The UltraHal function performs all
11'the initialization functions required for GetResponse so that GetResponse doesn't have to
12'initialize several times if a user inputs more than 1 sentence.
13Function UltraHal(ByVal InputString, ByVal UserName, ByVal ComputerName, ByVal LearningLevel, ByVal DatabaseFile, ByRef Hate, ByRef Swear, ByRef Insults, ByRef Compliment, ByRef PrevSent, ByRef LastResponseTime, ByRef PrevUserSent, ByRef CustomMem, ByRef GainControl, ByRef LastTopicList)
14
15 'RESPOND: User pressed enter, but didn't say anything
16 InputString = Trim(InputString)
17 If Len(InputString) < 2 Then
18 UltraHal = "Please say something."
19 Exit Function
20 End If
21
22 'PROCESS: AUTO-IDLE
23 'If AUTO-IDLE is enabled, it is called by the Ultra Hal Assistant host
24 'application at a set interval. This allows for the possibility of Hal
25 'being the first to say something if the user is idle.
26 If InputString = "AUTO-IDLE" Or InputString = "AUTO IDLE" Or InputString = "AUTOIDLE" Then
27 Rem PLUGIN: AUTO-IDLE
28 'The preceding comment is actually a plug-in directive for
29 'the Ultra Hal host application. It allows for code snippets
30 'to be inserted here on-the-fly based on user configuration.
31
32 UltraHal = UltraHal & HalBrain.StoreVars(HalCommands, Hate, Swear, Insults, Compliment, PrevSent, LastResponseTime, PrevUserSent, CustomMem, GainControl, LastTopicList)
33 Exit Function
34 End If
35
36 'PROCESS: INITIALIZE VARIABLES
37 'VBScript doesn't allow you to declare variables in advance as a
38 'particular data type; everything is a Variant. We must assign
39 'integers to the following variants so that data type errors don't
40 'occur
41 If LearningLevel = "" Then LearningLevel = 100
42 If Hate = "" Then Hate = 0
43 If Swear = "" Then Swear = 0
44 If Insults = "" Then Insults = 0
45 If Compliment = "" Then Compliment = 0
46 If GainControl = "" Then GainControl = 50
47
48 'PROCESS: IF NO LEARNING IS REQUESTED, PUT DATABASE IN READ-ONLY MODE
49 'If read only mode is on, any requests to create a new table, add to
50 'a table, or delete records from a table will be ignored.
51 If LearningLevel = 0 Then HalBrain.ReadOnlyMode = True Else HalBrain.ReadOnlyMode = False
52
53 'PROCESS: EMOTIONAL FACTOR CENTERING
54 'We help Hal regain his emotional "center" gradually, even if the
55 'user doesn't catch on to dealing With Hal's feelings. The following
56 'code brings Hal's memory of hate, swearing, and insults gradually
57 'and randomly back to zero.
58 Randomize
59 SpinWheel = Int(Rnd * 100)
60 If Hate > 0 And SpinWheel < 10 Then Hate = Hate - 1
61 SpinWheel = Int(Rnd * 100)
62 If Swear > 0 And SpinWheel < 10 Then Swear = Swear - 1
63 SpinWheel = Int(Rnd * 100)
64 If Insults > 0 And SpinWheel < 10 Then Insults = Insults - 1
65
66 'PROCESS: EMOTIONAL VARIETY
67 'The following code allows Hal some random emotional excursions:
68 SpinWheel = Int(Rnd * 100)
69 If Compliment = 4 And SpinWheel < 30 Then Compliment = 2
70 If Compliment > 0 And Compliment < 4 And SpinWheel < 5 Then Compliment = 0
71 If Compliment > 4 And SpinWheel < 5 Then Compliment = 0
72 If Compliment < 0 And SpinWheel < 30 Then Compliment = 0
73 If SpinWheel > 80 And SpinWheel < 90 Then Compliment = 2
74 If SpinWheel > 90 And SpinWheel < 95 Then Compliment = 4
75
76 Rem PLUGIN: PRE-PROCESS
77 'The preceding comment is actually a plug-in directive for
78 'the Ultra Hal host application. It allows for code snippets
79 'to be inserted here on-the-fly based on user configuration.
80
81 'PROCESS: SPLIT USER'S INPUT STRING INTO SEPERATE SENTENCES
82 'Encode abbreviations such as Mr. Mrs. and Ms.
83 InputString = Replace(InputString, "MR.", "Mr<PERIOD>", 1, -1, vbTextCompare)
84 InputString = Replace(InputString, "MRS.", "Mrs<PERIOD>", 1, -1, vbTextCompare)
85 InputString = Replace(InputString, "MS.", "Ms<PERIOD>", 1, -1, vbTextCompare)
86 InputString = Replace(InputString, "DR.", "Dr<PERIOD>", 1, -1, vbTextCompare)
87 InputString = Replace(InputString, "MS.", "Ms<PERIOD>", 1, -1, vbTextCompare)
88 InputString = Replace(InputString, "ST.", "St<PERIOD>", 1, -1, vbTextCompare)
89 InputString = Replace(InputString, "PROF.", "Prof<PERIOD>", 1, -1, vbTextCompare)
90 InputString = Replace(InputString, "GEN.", "Gen<PERIOD>", 1, -1, vbTextCompare)
91 InputString = Replace(InputString, "REP.", "Rep<PERIOD>", 1, -1, vbTextCompare)
92 InputString = Replace(InputString, "SEN.", "Sen<PERIOD>", 1, -1, vbTextCompare)
93 'Remove unnecessary punctuation
94 Do
95 RepeatLoop = False
96 If InStr(InputString, "..") Then InputString = Replace(InputString, "..", "."): RepeatLoop = True
97 If InStr(InputString, "??") Then InputString = Replace(InputString, "??", "?"): RepeatLoop = True
98 If InStr(InputString, "!!") Then InputString = Replace(InputString, "!!", "!"): RepeatLoop = True
99 If InStr(InputString, "!?") Then InputString = Replace(InputString, "!?", "?"): RepeatLoop = True
100 If InStr(InputString, "?!") Then InputString = Replace(InputString, "?!", "?"): RepeatLoop = True
101 If InStr(InputString, ",,") Then InputString = Replace(InputString, ",,", ","): RepeatLoop = True
102 Loop While RepeatLoop = True
103 'Detect and encode acronyms such as U.S.A.
104 InputString = Trim(InputString)
105 WordList = Split(InputString, " ")
106 For i = 0 To UBound(WordList)
107 If Len(WordList(i)) > 3 Then
108 If Right(WordList(i), 1) = "." And Mid(WordList(i), Len(WordList(i)) - 2, 1) = "." Then
109 InputString = Replace(InputString, WordList(i), Left(WordList(i), Len(WordList(i)) - 1) & "<PERIOD>")
110 End If
111 End If
112 Next
113 'Place split markers in string
114 InputString = Replace(InputString, ". ", ". <NEWSENT>")
115 InputString = Replace(InputString, "? ", "? <NEWSENT>")
116 InputString = Replace(InputString, "! ", "! <NEWSENT>")
117 'Decode acronyms and abbreviations
118 InputString = Replace(InputString, "<PERIOD>", ".", 1, -1, vbTextCompare)
119 'Split string into sentences
120 Sentences = Split(InputString, "<NEWSENT>")
121
122 'PROCESS: RECORD DEBUG INFO
123 HalBrain.AddDebug "Debug", "Ultra Hal Start"
124
125 'RESPOND: PREDEFINED RESPONSES
126 'If the previous exchange had tags to set the response of this exchange
127 'then follow the command.
128 NextResponse = HalBrain.ExtractVar(CustomMem, "NextResponse")
129 If NextResponse <> "" Then
130 CustomMem = Replace(CustomMem, "NextResponse-eq-", "LastResponse-eq-")
131 UltraHal = NextResponse
132 GoodSentence = True
133 NextResponse = ""
134 End If
135 YesResponse = HalBrain.ExtractVar(CustomMem, "YesRes")
136 NoResponse = HalBrain.ExtractVar(CustomMem, "NoRes")
137 If YesResponse <> "" Or NoResponse <> "" Then
138 CustomMem = Replace(CustomMem, "YesRes-eq-", "LastYesRes-eq-")
139 CustomMem = Replace(CustomMem, "NoRes-eq-", "LastNoRes-eq-")
140 InputString2 = Replace(InputString, ".", " ")
141 InputString2 = Replace(InputString2, "?", " ")
142 InputString2 = Replace(InputString2, "!", " ")
143 InputString2 = " " & Replace(InputString2, ",", " ") & " "
144 YesNoDetect = HalBrain.TopicSearch(InputString2, "yesNoDetect")
145 If YesNoDetect = "Yes" And YesResponse <> "" Then
146 UltraHal = YesResponse
147 GoodSentence = True
148 ElseIf YesNoDetect = "No" And NoResponse <> "" Then
149 UltraHal = NoResponse
150 GoodSentence = True
151 End If
152 End If
153
154 'RESPOND: GETRESPONSE
155 'Get a response from Hal's brain for each sentence individually.
156 'If a response from a sentence indicates a special flag, then Hal
157 'will give only the response to that sentence, and not process
158 'any other sentences. Otherwise Hal will respond to each sentence.
159 'Hal will respond to a max of 3 sentences at once.
160 SentenceCount = UBound(Sentences)
161 If SentenceCount > 2 Then SentenceCount = 2
162 LowQualityResponse = ""
163 If GoodSentence <> True Then 'Only respond if a predefined response hasn't already been selected
164 For i = 0 To SentenceCount
165 TempParent = HalBrain.AddDebug("Debug", "Begin Processing Sentence " & CStr(i + 1), vbCyan)
166 HalBrain.AddDebug TempParent, "Sentence: " & Sentences(i)
167 HalBrain.DebugWatch "", "NewSent"
168 Sentences(i) = Trim(Sentences(i))
169 If Len(Sentences(i)) > 1 Then
170 GoodSentence = True
171 CurResponse = GetResponse(Sentences(i), UserName, ComputerName, LearningLevel, HalCommands, Hate, Swear, Insults, Compliment, PrevSent, LastResponseTime, PrevUserSent, CustomMem, GainControl, LastTopicList) & vbCrLf
172 If InStr(1, CurResponse, "<LOWQUALITY>", vbTextCompare) Then
173 'If Hal's response to the current sentence is of a low-quality nature, then we hold out
174 'for a better response with a different sentence, but if there is no better response
175 'then we will use only the first low-quality response we came across.
176 If LowQualityResponse = "" Then LowQualityResponse = CurResponse
177 ElseIf InStr(1, CurResponse, "<TOPIC>", vbTextCompare) Or InStr(1, CurResponse, "<YESRES>", vbTextCompare) Or InStr(1, CurResponse, "<EXCLUSIVE>", vbTextCompare) Then
178 'If Hal's response indicates an exclusivity tag, then we erase any response Hal may have
179 'already had, respond with the exclusive response, and cease processing more sentences
180 UltraHal = CurResponse & vbCrLf
181 Exit For
182 Else
183 'Since there are no special tags, we just append the new response to the previous one
184 'if the response was not already given
185 If InStr(1, UltraHal, CurResponse, vbTextCompare) = 0 Then UltraHal = UltraHal & " . " & CurResponse & vbCrLf
186 End If
187 'If we received a tag to stop processing more sentences, we leave the loop
188 If InStr(1, CurResponse, "<NOMORE>", vbTextCompare) Then Exit For
189 End If
190 Next
191 End if
192 'If we have no normal quality responses, we will use our low quality response
193 UltraHal = Trim(UltraHal)
194 If UltraHal = "" Then UltraHal = Trim(LowQualityResponse)
195
196 'RESPOND: USER DIDN'T SAY ANYTHING
197 'If GoodSentence has not been set to true, then that means the user didn't
198 'type anything of use, so we ask the user to say something.
199 If GoodSentence = False Then
200 UltraHal = "Please say something."
201 Exit Function
202 End If
203
204 'PROCESS: PROCESS IN-SENTENCE TAGS
205 'the <TOPIC>*</TOPIC> tag sets what Hal's next response will be, no matter what the user says
206 NextResponse = HalBrain.SearchPattern(UltraHal, "*<TOPIC>*</TOPIC>*", 2)
207 If NextResponse <> "" Then
208 UltraHal = Replace(UltraHal, NextResponse, "", 1, -1, vbTextCompare)
209 UltraHal = Replace(UltraHal, "<TOPIC>", "", 1, -1, vbTextCompare)
210 UltraHal = Replace(UltraHal, "</TOPIC>", "", 1, -1, vbTextCompare)
211 NextResponse = Trim(Replace(NextResponse, "<TOPIC>", "", 1, -1, vbTextCompare))
212 CustomMem = CustomMem & HalBrain.EncodeVar(NextResponse, "NextResponse")
213 End If
214 'The <YES>*</YES> and <NO>*</NO> tag sets what Hal's response will be if the user says yes or no
215 UltraHal = Replace(UltraHal, "<YESRE>", "<YESRES>", 1, -1, vbTextCompare)
216 UltraHal = Replace(UltraHal, "</YESRE>", "</YESRES>", 1, -1, vbTextCompare)
217 UltraHal = Replace(UltraHal, "<YES>", "<YESRES>", 1, -1, vbTextCompare)
218 UltraHal = Replace(UltraHal, "</YES>", "</YESRES>", 1, -1, vbTextCompare)
219 UltraHal = Replace(UltraHal, "<NO>", "<NORES>", 1, -1, vbTextCompare)
220 UltraHal = Replace(UltraHal, "</NO>", "</NORES>", 1, -1, vbTextCompare)
221 YesRes = HalBrain.SearchPattern(UltraHal, "*<YESRES>*</YESRES>*", 2)
222 If YesRes <> "" Then
223 UltraHal = Replace(UltraHal, YesRes, "", 1, -1, vbTextCompare)
224 UltraHal = Replace(UltraHal, "<YESRES>", "", 1, -1, vbTextCompare)
225 UltraHal = Replace(UltraHal, "</YESRES>", "", 1, -1, vbTextCompare)
226 YesRes = Trim(Replace(YesRes, "<YESRES>", "", 1, -1, vbTextCompare))
227 CustomMem = CustomMem & HalBrain.EncodeVar(YesRes, "YesRes")
228 End If
229 NoRes = HalBrain.SearchPattern(UltraHal, "*<NORES>*</NORES>*", 2)
230 If NoRes <> "" Then
231 UltraHal = Replace(UltraHal, NoRes, "", 1, -1, vbTextCompare)
232 UltraHal = Replace(UltraHal, "<NORES>", "", 1, -1, vbTextCompare)
233 UltraHal = Replace(UltraHal, "</NORES>", "", 1, -1, vbTextCompare)
234 NoRes = Trim(Replace(NoRes, "<NORES>", "", 1, -1, vbTextCompare))
235 CustomMem = CustomMem & HalBrain.EncodeVar(NoRes, "NoRes")
236 End If
237 'The <RUN>*</RUN> tags are converted into a HalCommand to run a program
238 UltraHal = Replace(UltraHal, "<RUNIT>", "<RUN>", 1, -1, vbTextCompare)
239 UltraHal = Replace(UltraHal, "</RUNIT>", "</RUN>", 1, -1, vbTextCompare)
240 RunProgram = HalBrain.SearchPattern(UltraHal, "*<RUN>*</RUN>*", 2)
241 If RunProgram <> "" Then
242 UltraHal = Replace(UltraHal, RunProgram, "", 1, -1, vbTextCompare)
243 UltraHal = Replace(UltraHal, "<RUN>", "", 1, -1, vbTextCompare)
244 UltraHal = Replace(UltraHal, "</RUN>", "", 1, -1, vbTextCompare)
245 RunProgram = Trim(Replace(RunProgram, "<RUN>", "", 1, -1, vbTextCompare))
246 HalCommands = HalCommands & "<RUNPROG>" & RunProgram & "</RUNPROG>"
247 End If
248 UltraHal = Replace(UltraHal, "<WEBADDRESS>", "www.ultrahal.com", 1, -1, vbTextCompare)
249 UltraHal = Replace(UltraHal, "<HALNAME>", ComputerName, 1, -1, vbTextCompare)
250 UltraHal = Replace(UltraHal, "<HALSNAME>", ComputerName, 1, -1, vbTextCompare)
251 UltraHal = Replace(UltraHal, "<COMPUTERNAME>", ComputerName, 1, -1, vbTextCompare)
252 UltraHal = Replace(UltraHal, " " & ComputerName & " ", " " & ComputerName & " ", 1, -1, vbTextCompare) 'Fixes capitilization of computer's name if needed
253 UltraHal = Replace(UltraHal, "<TIME>", Time(), 1, -1, vbTextCompare)
254 UltraHal = Replace(UltraHal, "<DATE>", Date(), 1, -1, vbTextCompare)
255 UltraHal = Replace(UltraHal, "<QUOTE>", """", 1, -1, vbTextCompare)
256 UltraHal = Replace(UltraHal, """, """", 1, -1, vbTextCompare)
257 UltraHal = Replace(UltraHal, """, """", 1, -1, vbTextCompare)
258 If Instr(1, UltraHal, "<makeinsult>", vbTextCompare) Then
259 UltraHal = Replace(UltraHal, "<makeinsult>", HalBrain.ChooseSentenceFromFile("insults"), 1, -1, vbTextCompare)
260 End If
261 UltraHal = Replace(UltraHal, "<AT>", "@", 1, -1, vbTextCompare)
262 UltraHal = Replace(UltraHal, "<NOMORE>", "", 1, -1, vbTextCompare)
263 UltraHal = Replace(UltraHal, "<LOWQUALITY>", "", 1, -1, vbTextCompare)
264 UltraHal = Replace(UltraHal, "<EXCLUSIVE>", "", 1, -1, vbTextCompare)
265
266 'PROCESS: INTELLIGENT CAPITILIZATION FIX
267 UltraHal = HalBrain.FixCaps(HalBrain.HalFormat(UltraHal))
268 UltraHal = Replace(UltraHal, "<ELLIPSIS>", "...", 1, -1, vbTextCompare)
269 UltraHal = Replace(UltraHal, "....", "...", 1, -1, vbTextCompare)
270 UltraHal = Replace(UltraHal, "...?", "...", 1, -1, vbTextCompare)
271 UltraHal = Replace(UltraHal, "...!", "...", 1, -1, vbTextCompare)
272
273 Rem PLUGIN: POST-PROCESS
274 'The preceding comment is actually a plug-in directive for
275 'the Ultra Hal host application. It allows for code snippets
276 'to be inserted here on-the-fly based on user configuration.
277
278 'POST PROCESS: PRESERVE ALL VARIABLES, CLOSE DATABASE, EXIT
279 'Remember all the variables through encoding them into one function string using
280 'the DLL, since for some reason ByRef assignments don't work when a Visual Basic
281 'executable is calling a function in a VBScript program. The HalCommands variable
282 'that is returned is not used by this script, but can be used by script programmers
283 'to send certain commands back to the host Hal program. See documentation of the
284 'host Hal program to see what this can be used for.
285 'Close database and exit function
286 PrevSent = UltraHal
287 UltraHal = UltraHal & HalBrain.StoreVars(HalCommands, Hate, Swear, Insults, Compliment, PrevSent, LastResponseTime, PrevUserSent, CustomMem, GainControl, LastTopicList)
288
289End Function
290
291
292Function GetResponse(ByVal UserSentence, ByVal UserName, ByVal ComputerName, ByVal LearningLevel, ByRef HalCommands, ByRef Hate, ByRef Swear, ByRef Insults, ByRef Compliment, ByVal PrevSent, ByRef LastResponseTime, ByRef PrevUserSent, ByRef CustomMem, ByRef GainControl, ByRef LastTopicList)
293
294 'PROCESS: DECODE CUSTOM VARIABLES FROM CUSTOMMEM VARIABLE
295 NewName = HalBrain.ExtractVar(CustomMem, "NewName")
296 UserSex = HalBrain.ExtractVar(CustomMem, "UserSex")
297 SentCount = HalBrain.ExtractVar(CustomMem, "SentCount")
298 ShortSents = HalBrain.ExtractVar(CustomMem, "ShortSents")
299 If ShortSents = "" Then ShortSents = 0
300 If SentCount = "" Then SentCount = 0
301 SentCount = SentCount + 1
302 AvoidBeingFlag = False
303 Randomize
304
305 Rem PLUGIN: CUSTOMMEM
306 'The preceding comment is actually a plug-in directive for
307 'the Ultra Hal host application. It allows for code snippets
308 'to be inserted here on-the-fly based on user configuration.
309
310 'PROCESS: PRESERVE ORIGINAL SENTENCE
311 'Preserve the original user's sentence verbatim
312 '(no pronoun reversals or other processing).
313 OriginalSentence = UserSentence
314
315 'PROCESS: PREPARE FOR HALFORMAT AND REVERSE PERSON
316 'We try some pre-processing to try to prevent problems with the
317 'upcoming routines.
318 UserSentence = Replace("" & UserSentence & "", " I MYSELF ", " I, MYSELF, ", 1, -1, vbTextCompare)
319 UserSentence = Replace("" & UserSentence & "", " I'M ", " I AM ", 1, -1, vbTextCompare)
320 UserSentence = Replace("" & UserSentence & "", " YOU'RE ", " YOU ARE ", 1, -1, vbTextCompare)
321 UserSentence = Replace("" & UserSentence & "", " YOU YOURSELF ", " YOU, YOURSELF, ", 1, -1, vbTextCompare)
322 UserSentence = Replace("" & UserSentence & "", " I'M NOT ", " I AM NOT ", 1, -1, vbTextCompare)
323 UserSentence = Replace("" & UserSentence & "", " I'VE ", " I HAVE ", 1, -1, vbTextCompare)
324 UserSentence = Replace("" & UserSentence & "", "YOU'RE NOT ", "YOU ARE NOT ", 1, -1, vbTextCompare)
325 UserSentence = Replace("" & UserSentence & "", "YOU AREN'T ", "YOU ARE NOT ", 1, -1, vbTextCompare)
326 UserSentence = Replace("" & UserSentence & "", " YOU'VE ", " YOU HAVE ", 1, -1, vbTextCompare)
327 UserSentence = Replace("" & UserSentence & "", " I AM YOUR ", " VIMRQ ", 1, -1, vbTextCompare)
328 UserSentence = Replace("" & UserSentence & "", " YOU ARE MY ", " VURMQ ", 1, -1, vbTextCompare)
329
330 'PROCESS: SUBSTITUTE FOR PUNCTUATION
331 'The next routine removes hyphens etc., so we substitute for
332 'better word appearance later on.
333 UserSentence = Replace("" & UserSentence & "", "-", " VHZ ", 1, -1, vbTextCompare)
334 UserSentence = Replace("" & UserSentence & "", ";", " VSZ ", 1, -1, vbTextCompare)
335 UserSentence = Replace("" & UserSentence & "", ":", " VMZ ", 1, -1, vbTextCompare)
336 UserSentence = Replace("" & UserSentence & "", ", ", " VCZ ", 1, -1, vbTextCompare)
337
338 'PROCESS: REMOVE PUNCTUATION
339 'This function removes all other punctuation and symbols from the User's
340 'sentence so they won't confuse Hal during processing.
341 UserSentence = HalBrain.AlphaNumericalOnly(UserSentence)
342
343 'PROCESS: REMOVE HAL'S NAME IF IT IS AT THE START OR END OF SENTENCE
344 If Len(UserSentence) > Len(ComputerName) + 8 Then
345 If Ucase(Left(UserSentence, 4)) = "Hal" Then UserSentence = Right(UserSentence, Len(UserSentence) - 4)
346 If Ucase(Right(UserSentence, 4)) = "Hal" Then UserSentence = Left(UserSentence, Len(UserSentence) - 4)
347 If Ucase(Left(UserSentence, Len(ComputerName) + 1)) = Ucase(ComputerName) & " " Then UserSentence = Right(UserSentence, Len(UserSentence) - Len(ComputerName) - 1)
348 If Ucase(Right(UserSentence, Len(ComputerName) + 1)) = " " & Ucase(ComputerName) Then UserSentence = Left(UserSentence, Len(UserSentence) - Len(ComputerName) - 1)
349 End If
350 UserSentence = Trim(UserSentence)
351
352 'PROCESS: MODIFY SENTENCE
353 'The function, HalFormat, from the ActiveX DLL corrects many common
354 'typos and chat shortcuts. Example: "U R Cool" becomes "You are
355 'cool." It also fixes a few grammatical errors.
356 UserSentence = Trim(UserSentence)
357 If Len(UserSentence) > 15 Then
358 If Lcase(Left(UserSentence, 6)) = "anyway" Then UserSentence = Trim(Right(UserSentence, Len(UserSentence) - 6))
359 If Lcase(Left(UserSentence, 7)) = "i asked" Then UserSentence = Trim(Right(UserSentence, Len(UserSentence) - 7))
360 End If
361 If Len(UserSentence) > 6 Then
362 If Left(UserSentence, 3) = "VCZ" Then UserSentence = Right(UserSentence, Len(UserSentence) - 3)
363 If Right(UserSentence, 3) = "VCZ" Then UserSentence = Left(UserSentence, Len(UserSentence) - 3)
364 End If
365 UserSentence = HalBrain.HalFormat(UserSentence)
366
367 'PROCESS: REVERSE PERSON
368 'This function reverses first and second person pronouns. Example:
369 'The user's statement "You are cool" becomes Hal's statement "I am
370 'cool." Keep this is mind and don't get confused. When we are in
371 'Hal's brain; In the databases, "I" refers to Hal and in the
372 'databases, "you" refers to the user. This is true whenever we are
373 'dealing with a user response "processed" by Hal's brain.
374 UserSentence = HalBrain.SwitchPerson(UserSentence)
375
376 'PROCESS: MODIFY SENTENCE
377 'We now must run HalFormat again, to fix some grammatical errors
378 'the switch person above might have caused. Example: If the
379 'original sentence was "How are you"; after the function above it
380 'became "How are me" which is grammatically wrong. This will fix
381 'it to "How am I"
382 'NOTE TO DEVELOPERS: An especially important function performed by
383 'HalFormat is the removal of extra empty spaces in a sentence
384 'which may have been caused by other processing. For this reason,
385 'use Halformat closely before any "Len" comparison in which the
386 'counting of characters must be accurate.
387 UserSentence = HalBrain.HalFormat(UserSentence)
388
389 'PROCESS: CHANGE TO ALL CAPS
390 'Next, we captitalize the entire sentence for easy comparison.
391 'Almost all of Hal's thinking is done in caps.
392 UserSentence = UCase(UserSentence)
393
394 'PROCESS: WORD AND PHRASE SUBSTITUTIONS
395 'This will fix common errors in the user's sentence that the
396 'HalFormat function didn't take care of. These subsitutions are
397 'placed only the users sentence, not on Hal's responses. The
398 'HalFormat function is used on both Hal's and the user's sentences
399 'throughout the script.
400 UserSentence = HalBrain.ProcessSubstitutions(UserSentence, "substitutions")
401 TempParent = HalBrain.AddDebug("Debug", "Modified User Sentence")
402 HalBrain.AddDebug TempParent, "Sentence: " & UserSentence
403
404 'PROCESS: EMOTIONAL REACTIONS
405 'We enable Hal's expressions to respond to common verbal cues.
406 'The verbal cues are identified in the editable table "emotion"
407 If InStr(1, UserSentence, "I'M", 1) Then Aboutme = True
408 If InStr(1, UserSentence, "I AM", 1) Then Aboutme = True
409 If InStr(1, UserSentence, "I LOOK", 1) Then Aboutme = True
410 If InStr(1, UserSentence, "MY", 1) And InStr(1, UserSentence, " ARE ", 1) Then Aboutme = True
411 If Aboutme = True And InStr(UserSentence, " NOT ") = 0 And InStr(UserSentence, "N'T ") = 0 And InStr(UserSentence, " NEVER ") = 0 Then
412 EmotionalReaction = Ucase(HalBrain.TopicSearch(UserSentence, "emotion"))
413 End If
414 Select Case EmotionalReaction
415 Case "SURPRISED"
416 If Compliment > 0 Then Compliment = 4
417 If Compliment = 0 Then Compliment = 2
418 If Compliment < 0 Then Compliment = 0
419 Case "HAPPY"
420 If Compliment = 0 Then Compliment = 2
421 If Compliment < 0 Then Compliment = 0
422 Case "SOBER"
423 If Compliment < 4 Then Compliment = 0
424 If Compliment = 4 Then Compliment = 2
425 Case "ANGRY"
426 If Compliment = 0 Then Compliment = -1
427 If Compliment > 0 Then Compliment = 0
428 Case "SAD"
429 If Compliment = 0 Then Compliment = -2
430 If Compliment > 0 Then Compliment = 0
431 End Select
432
433 'PROCESS: ADD SPACES
434 'This will add spaces to the beggining and end of the user sentence to make
435 'sure that whole words can be found at the beginning and end of any sentence
436 UserSentence = " " & UserSentence & " "
437
438 'PROCESS: FIGURE OUT THE CURRENT SUBJECT
439 'Here we attempt to figure out the subject of the user's sentence. We call
440 'the WordNet class to find the first occurence of a noun in the User's
441 'sentence. Very often this is the subject of the sentence, but if not it
442 'will still most likely be relevant to the conversation.
443 CurrentSubject = WN.FindFirstNoun(UserSentence, True)
444 HalBrain.AddDebug "Debug", "Current Subject: " & CurrentSubject
445
446 'PROCESS: BLOCK LEARNING IF HAL'S NAME IS DETECTED
447 'Here we check to see if the user is calling Hal by name; if the user is doing so,
448 'it's better not to save the sentence for re-use, since it usually makes the
449 'pronoun-reversed sentence sound clumsy or incorrect:
450 If InStr(1, OriginalSentence, ComputerName, vbTextCompare) > 0 Then HalBrain.ReadOnlyMode = True
451
452 Rem PLUGIN: PLUGINAREA1
453'The comment above tells Ultra Hal Assistant to insert the following code
454'on-the-fly into the main brain code in the section referenced.
455
456'------------------
457' Check if the user asked for reorganizing the MP3 table
458'------------------
459vrMp3 = False
460If InStr(UserSentence, " INDEX ") <> 0 And InStr(UserSentence, " MP3 ") <> 0 Then vrMP3 = True
461
462If vrMP3 = True Then
463'------------------
464' If the MP3 table does not exist, I create it
465'------------------
466 HalBrain.ReadOnlyMode = False
467 vrTableName = "vrMp3"
468 If HalBrain.CheckTableExistence(vrTableName) = False Then
469 ' Create table if it doesn't exist
470 ' It must be of type Brain, to allow partial text search
471 HalBrain.CreateTable vrTableName, "Brain", "miscData"
472 Else
473 ' The 260 parameter is 256 + 4 = Yes/No with Default = No
474 vrAnswer = MsgBox("Shall I delete the existing index and recreate it from scratch?", 260, "MP3 Reindexing")
475 If vrAnswer = 6 Then
476 HalBrain.RunQuery "DELETE FROM " & vrTableName, vrTempQuery
477 End If
478 End If
479'------------------
480' Ask which is the main MP3 folder
481'------------------
482vrMp3Folder = InputBox("Which main folder to you want to reindex?", "MP3 Reindexing", "c:\mp3")
483'------------------
484' Read the main MP3 folder
485'------------------
486 Set vrFso = CreateObject("Scripting.FileSystemObject")
487 If vrFso.FolderExists(vrMp3Folder) Then
488 GetResponse = "I have indexed all the MP3 files in the specified folder and subfolders. "
489 HalBrain.ReadOnlyMode = False
490 vrCurrentFolder = vrMp3Folder
491 Call ReadFolder(vrCurrentFolder, vrMp3Folder)
492 Else
493 GetResponse = "The folder " & vrMp3Folder & " does not exist on your computer. "
494 End If
495 HalBrain.ReadOnlyMode = True
496End If
497
498'------------------
499' Check if the user asked for playing a song
500'------------------
501vrMp3 = False
502vrToPlay = ""
503vrNameToPlay = ""
504vrToPlay = UCase(HalBrain.SearchPattern(UserSentence, "Play * Media *", 2))
505If vrToPlay <> "" Then
506 If HalBrain.CheckTableExistence("vrMp3") = False Then
507 GetResponse = "I don't find any MP3 index in my brain. "
508 Else
509 vrNameToPlay = HalBrain.QABrain(vrToPlay, "vrMp3", 0)
510 If vrNameToPlay <> "" Then
511 GetResponse = " "
512 HalCommands = HalCommands & "<RUNPROG>" & vrNameToPlay & "</RUNPROG>"
513 End If
514 End If
515 HalBrain.ReadOnlyMode = True
516End If
517
518'------------------
519' From time to time, Hal will play a song, according to some word you say
520' For example, you say: "I am going to California"
521' Hal will play "Hotel California" by Eagles
522'------------------
523'------------------
524' check the current music mood factor
525'------------------
526vrMusicMood = HalBrain.TopicSearch("MUSIC", "vrParameter")
527If vrMusicMood = "" Then vrMusicMood = 0
528vrMusicMood = CInt(vrMusicMood)
529
530If vrMusicMood > 0 Then
531 j = Int(Rnd * 10) ' generate a random integer between 0 and 9
532 If j < vrMusicMood Then
533 vrKeywords = HalBrain.RemoveExtraSpaces(HalBrain.ExtractKeywords(" " & UserSentence & " "))
534 vrKeywordList = Split(vrKeywords, " ")
535 For i = Ubound(vrKeywordList) To Lbound(vrKeywordList)
536 vrNameToPlay = HalBrain.QABrain(vrKeywordList(i), "vrMp3", 0)
537 If vrNameToPlay <> "" Then
538 GetResponse = "You talked about " & vrKeywordList(i) & " and this reminds me this song. "
539 HalCommands = HalCommands & "<RUNPROG>" & vrNameToPlay & "</RUNPROG>"
540 Exit For
541 End If
542 Next
543 End If
544End If
545
546
547
548
549 'The preceding comment is actually a plug-in directive for
550 'the Ultra Hal host application. It allows for code snippets
551 'to be inserted here on-the-fly based on user configuration.
552
553 'RESPOND: USER REPEATING
554 'If the user says the same thing more than once in a row, Hal will point this out.
555 'If Trim(UCase(UserSentence)) = Trim(UCase(PrevUserSent)) Then
556 ' GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("userRepeat") & vbCrLf
557 'End If
558 ' HalBrain.DebugWatch GetResponse, "User Repeating"
559
560 'PROCESS: KNOWN HUMAN NAMES
561 'If the user mentions a name Hal recognizes, Hal will note the name and gender
562 'for later use by other functions. Hal's database contains a table called "names"
563 'with over 17000 names and their associated genders. If a name can be both genders,
564 'the most likely gender is listed first. This table is stored in the database as a
565 'standard Hal "Topic Search" database, however the standard HalBrain.TopicSearch
566 'function does not provide the required functionality. It only returns the topic
567 'field which in this case is the gender. We also need the searchString field, which
568 'in this case is the person's name. To get this info, we run a custom SQL query.
569 'This demonstrates how Hal's functions can be expanded far beyond its original
570 'scope through custom SQL queries.
571 Dim NameSex() 'We must declare an empty array to store query results in
572 If HalBrain.RunQuery("SELECT searchString, topic FROM names WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0 LIMIT 1", NameSex) = True Then
573 MentionedName = Trim(NameSex(1, 0)) 'Row 1 contains our query result. Column 0 contains "searchString", which is the name
574 MentionedSex = Trim(NameSex(1, 1)) 'Row 1, Column 1 contains "topic", which is the associated gender(s) of the name
575 End If
576
577 'RESPOND: USER TELLS US THEIR NAME OR NICKNAME
578 If InStr(UserSentence, " NOT ") = 0 And InStr(UserSentence, " MIDDLE ") = 0 And InStr(UserSentence, " LAST ") = 0 Then
579 'If Hal asked the user their name in the previous sentence, then we can assume the name mentioned
580 'is the user's name
581 If InStr(1, PrevSent, "WHAT", vbTextCompare) > 0 And InStr(1, PrevSent, "YOU", vbTextCompare) > 0 And InStr(1, PrevSent, "NAME", vbTextCompare) > 0 And MentionedName <> "" Then Nickname = MentionedName
582 'The following are patterns where we are sure that the person is trying to tell us thier name
583 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "MY *NAME IS *", 2)
584 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "* IS *MY *NAME", 1)
585 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "I'M *CALLED *", 2)
586 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "I AM *CALLED *", 2)
587 If Nickname <> "" Then Definetelyname = True
588 'The following are patterns where we are not sure if the person is trying to tell us their name
589 'unless we recognize the name in the name database.
590 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "*CALL ME *", 2)
591 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "*I AM *", 2)
592 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "*I'M *", 2)
593 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "I GO BY *", 1)
594 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "THIS IS *", 1)
595 If Nickname <> "" Then
596 Nickname = HalBrain.AlphaNumericalOnly(Trim(Nickname))
597 If InStr(Nickname, " ") Then
598 TempArray = Split(Nickname, " ")
599 Nickname = Trim(TempArray(0))
600 End If
601 If UCase(MentionedName) = UCase(Nickname) And Not (WN.LookupWord(Nickname) = True And Definetelyname = False) Then 'Name is found in database
602 NewName = MentionedName
603 Select Case MentionedSex
604 Case "M" 'Name is definetely masculine
605 GetResponse = HalBrain.ChooseSentenceFromFile("maleGreeting")
606 GetResponse = Replace(GetResponse, "<NickName>", MentionedName, 1, -1, vbTextCompare)
607 UserSex = "M"
608 Case "F" 'Name is definetely feminine
609 GetResponse = HalBrain.ChooseSentenceFromFile("femaleGreeting")
610 GetResponse = Replace(GetResponse, "<NickName>", MentionedName, 1, -1, vbTextCompare)
611 UserSex = "F"
612 Case "MF" 'Name is either gender, usually male
613 GetResponse = HalBrain.ChooseSentenceFromFile("genericGreeting") & HalBrain.ChooseSentenceFromFile("maybeMale")
614 GetResponse = Replace(GetResponse, "<NickName>", MentionedName, 1, -1, vbTextCompare)
615 UserSex = ""
616 Case "FM" 'Name is either gender, usually female
617 GetResponse = HalBrain.ChooseSentenceFromFile("genericGreeting") & HalBrain.ChooseSentenceFromFile("maybeFemale")
618 GetResponse = Replace(GetResponse, "<NickName>", MentionedName, 1, -1, vbTextCompare)
619 UserSex = ""
620 End Select
621 ElseIf Definetelyname = True Then 'Name not in DB but user says its their name
622 If WN.LookupWord(Nickname) Then 'Name is a word in dictionary
623 GetResponse = HalBrain.ChooseSentenceFromFile("fakeName")
624 GetResponse = Replace(GetResponse, "<NickName>", Nickname, 1, -1, vbTextCompare)
625 GetResponse = Replace(GetResponse, "<Definition>", WN.GetDefinition(WN.GuessPartOfSpeech, 1, "D"), 1, -1, vbTextCompare)
626 GetResponse = Replace(GetResponse, "<PartOfSpeech>", WN.GuessPartOfSpeech, 1, -1, vbTextCompare)
627 ElseIf HalBrain.TopicSearch(Nickname, "disqualify3") = "" Then 'Name is not a word in dictionary
628 If DetectGibberish(NickName) = True Then
629 GetResponse = HalBrain.ChooseSentenceFromFile("gibberish")
630 Else
631 GetResponse = HalBrain.ChooseSentenceFromFile("uniqueName")
632 GetResponse = Replace(GetResponse, "<NickName>", Nickname, 1, -1, vbTextCompare)
633 If Nationality <> "" Then
634 GetResponse = GetResponse & " Is that a common name in " & Nationality & "? "
635 End If
636 NewName = Ucase(Left(Nickname, 1)) & Lcase(Right(Nickname, Len(Nickname) - 1))
637 UserSex = ""
638 End If
639 End If
640 End If
641 End If
642 End If
643 HalBrain.DebugWatch GetResponse, "Nick Names"
644
645 'PROCESS: FIGURE OUT USER'S SEX
646 'If unknown, try to figure out the user's sex by looking up their name
647 'or by simply asking the user.
648 If NewName <> "" Then TempName = NewName Else TempName = UserName
649 If InStr(1, " " & OriginalSentence, "HOW ", vbTextCompare) = 0 And (InStr(1, " " & OriginalSentence, " I AM ", vbTextCompare) Or InStr(1, " " & OriginalSentence, " I'M ", vbTextCompare)) Then
650 'See if user is telling us their sex without Hal ever asking
651 NewSex = HalBrain.TopicSearch(UserSentence, "sexDetect")
652 If NewSex <> "" Then
653 GetResponse = "Ok, thanks for telling me. I'll keep that in mind."
654 UserSex = NewSex
655 End If
656 End If
657 If GetResponse = "" And UserSex = "" Then
658 If InStr(1, " " & OriginalSentence, "HOW ", vbTextCompare) = 0 And HalBrain.PatternDB(" " & HalBrain.AlphaNumericalOnly(PrevSent) & " ", "sexAskDetect") = "True" Then 'If Hal just asked the user their sex
659 UserSex = HalBrain.TopicSearch(UserSentence, "sexDetect") 'Then see if the user replied
660 NewSex = UserSex
661 If UserSex <> "" Then GetResponse = "Ok, thanks for telling me. I'll keep that in mind."
662 ElseIf HalBrain.TopicSearch(TempName, Trim(LCase(UserName)) & "_Sex") <> "" Then
663 UserSex = HalBrain.TopicSearch(TempName, Trim(LCase(UserName)) & "_Sex")
664 ElseIf 1=2 Then'HalBrain.RunQuery("SELECT searchString, topic FROM names WHERE strstr(' " & Replace(TempName, "'", "''") & " ', searchString) > 0 LIMIT 1", NameSex()) = True Then
665 'If user didn't tell us, see if we can figure it out based on the name database
666 If UserSex = "" Then
667 Select Case Trim(NameSex(1, 1))
668 Case "M"
669 UserSex = "M"
670 Case "F"
671 UserSex = "F"
672 Case Else
673 'If we get here, we still can't figure out the user's sex
674 'so we'll ask them at some random time
675 If Rnd * 100 < 25 And SentCount > 4 Then GetResponse = HalBrain.ChooseSentenceFromFile("askSex") & "<NOMORE>"
676 End Select
677 End If
678 Else
679 'If we get here, we still can't figure out the user's sex
680 'so we'll ask them at some random time
681 If Rnd * 100 < 25 And SentCount > 4 Then GetResponse = HalBrain.ChooseSentenceFromFile("askSex") & "<NOMORE>"
682 End If
683 End If
684 HalBrain.DebugWatch GetResponse, "User Sex"
685
686 'SAVE: USER'S SEX
687 'If the user just told Hal their sex and Hal didn't know before, then
688 'Hal will save it in a table for future reference
689 If HalBrain.ReadOnlyMode = False And NewSex <> "" Then
690 If HalBrain.CheckTableExistence(Trim(LCase(UserName)) & "_Sex") = False Then
691 'Create table for this person if it doesn't exist
692 HalBrain.CreateTable Trim(LCase(UserName)) & "_Sex", "TopicSearch", "autoLearningBrain"
693 End If
694 'Store user response in this table
695 HalBrain.AddToTable Trim(LCase(UserName)) & "_Sex", "TopicSearch", Trim(TempName), Trim(UCase(NewSex))
696 End If
697
698 'RESPOND: GREETINGS
699 'This takes care of the user greeting Hal
700 'First Hal checks to see if the user is greeting right now.
701 If HalBrain.TopicSearch(UserSentence, "helloDetect") = "True" Then SaidHello = True Else SaidHello = False
702 If HalBrain.TopicSearch(UserSentence, "helloDisqualify") = "True" Then SaidHello = False
703 'Second, Hal checks to see if the user said a greeting on the last exchange.
704 If HalBrain.TopicSearch(PrevUserSent, "helloDetect") = "True" Then PrevHello = True Else PrevHello = False
705 If HalBrain.TopicSearch(PrevUserSent, "helloDisqualify") = "True" Then PrevHello = False
706 'This will get a greeting from a file. It will pass the current hour and either
707 'the letter A or B to a topic search file and it will get back a greeting based
708 'on the current time. Each hour has 2 possible greetings, the A greeting and B
709 'greeting, which is randomly chosen.
710 If SaidHello = True And PrevHello = False Then
711 If Rnd * 100 < 50 Then LetterChoice = "A" Else LetterChoice = "B"
712 HalGreeting = HalBrain.TopicSearch(" " & Trim(Hour(Now)) & LetterChoice & " ", "hello1")
713 End If
714 'This will get a greeting from a file that is not based on the current time
715 'if the user said Hello again
716 If SaidHello = True And PrevHello = True Then HalGreeting = HalBrain.ChooseSentenceFromFile("hello2")
717
718 'RESPOND: GOODBYES
719 'Check if the user is saying bye right now
720 If HalBrain.TopicSearch(UserSentence, "byeDetect") = "True" Then SaidBye = True
721 If InStr(1, UserSentence, " see me ", 1) > 0 And Len(UserSentence) < 10 Then SaidBye = True
722 If HalBrain.TopicSearch(UserSentence, "byeDisqualify") = "True" Then SaidBye = False
723 'Check if Hal said bye in the previous sentence
724 If HalBrain.TopicSearch(PrevUserSent, "byeDetect") = "True" Then PrevBye = True
725 If InStr(1, PrevUserSent, " see me ", 1) > 0 And Len(PrevUserSent) < 10 Then PrevBye = True
726 If HalBrain.TopicSearch(PrevUserSent, "byeDisqualify") = "True" Then PrevBye = False
727 If SaidBye = True And PrevBye = False Then HalGreeting = HalBrain.ChooseSentenceFromFile("bye1")
728 If SaidBye = True And PrevBye = True Then HalGreeting = HalBrain.ChooseSentenceFromFile("bye2")
729
730 'RESPOND: POLITE INQUIRIES
731 'Hal checks to see if the user is making a polite inquiry into Hal's well being
732 'e.g. "How are you doing?"
733 If InStr(1, UserSentence, "How am I ", 1) > 0 And Len(UserSentence) < 14 Then PoliteAsk = True
734 If InStr(1, UserSentence, "How are you ", 1) > 0 And Len(UserSentence) < 16 Then PoliteAsk = True
735 If InStr(1, UserSentence, "What's new", 1) > 0 And Len(UserSentence) < 17 Then PoliteAsk = True
736 If InStr(1, UserSentence, "What is new", 1) > 0 And Len(UserSentence) < 18 Then PoliteAsk = True
737 If InStr(1, UserSentence, "Whats new", 1) > 0 And Len(UserSentence) < 16 Then PoliteAsk = True
738 If HalBrain.TopicSearch(UserSentence, "PoliteAskDetect") = "True" Then PoliteAsk = True
739 If PoliteAsk = True Then HalGreeting = HalBrain.ChooseSentenceFromFile("politeAsk1") & HalBrain.ChooseSentenceFromFile("politeAsk2")
740
741 'RESPOND: GREETINGS, GOODBYES, AND POLITE INQUIRIES
742 'If one of the 3 functions above generated a response, we will add it
743 'to Hal's response. The variable HalGreeting is saved for later use
744 'as well in case other functions wish to know if Hal hal just greeted
745 'the user.
746 If HalGreeting <> "" Then
747 GetResponse = GetResponse & HalGreeting & vbCrLf & "<NOMORE>"
748 SkipOpinion = True
749 End If
750 HalBrain.DebugWatch GetResponse, "Greetings"
751
752 'RESPOND: USER SHORT PHRASES
753 'If the user uses short phrases (defined by less then 4 vowels) at least
754 'twice in a row, then Hal will sometimes point this out to the user and
755 'ask the user to use longer sentences. If the sentence is a hello or
756 'goodbye, Hal won't comment about short phrases.
757 If HalGreeting = "" And HalBrain.CountInstances("A", PrevUserSent) + HalBrain.CountInstances("E", PrevUserSent) + HalBrain.CountInstances("I", PrevUserSent) + HalBrain.CountInstances("O", PrevUserSent) + HalBrain.CountInstances("U", PrevUserSent) < 4 And HalBrain.CountInstances("A", UserSentence) + HalBrain.CountInstances("E", UserSentence) + HalBrain.CountInstances("I", UserSentence) + HalBrain.CountInstances("O", UserSentence) + HalBrain.CountInstances("U", UserSentence) < 4 Then
758 ShortSents = ShortSents + 1
759 If ShortSents = 2 Or ShortSents = 10 Or ShortSents = 20 Then
760 ShortPhrase = ". " & HalBrain.ChooseSentenceFromFile("tooShort")
761 End If
762 End If
763
764 'RESPOND: CHANGE SUBJECT
765 'If the user asks Hal to change the subject, Hal will do so on request.
766 newTopic = HalBrain.ChooseSentenceFromFile("topic")
767 If HalBrain.TopicSearch(UserSentence, "changeTopic") = "True" And Instr(1, UserSentence, "DON'T", vbTextCompare) = 0 Then GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("topicIntro") & newTopic & "<EXCLUSIVE>"
768 HalBrain.DebugWatch GetResponse, "Change Subject"
769
770 'RESPOND: CHECK FOR AND RESPOND TO COMPLIMENTS
771 'First we check to see if the user is talking about Hal:
772 If InStr(1, UserSentence, "I'M", 1) Then Aboutme = True
773 If InStr(1, UserSentence, "I AM", 1) Then Aboutme = True
774 If InStr(1, UserSentence, "I LOOK", 1) Then Aboutme = True
775 If InStr(1, UserSentence, "MY", 1) And InStr(1, UserSentence, " ARE ", 1) Then Aboutme = True
776 If InStr(1, UserSentence, "MY", 1) And InStr(1, UserSentence, " IS ", 1) Then Aboutme = True
777 'If the user is talking about Hal, we see if a compliment was given
778 If Aboutme = True Then Kudo = HalBrain.TopicSearch(UserSentence, "complimentDetect")
779 If Kudo <> "" Then
780 If InStr(UserSentence, " NOT ") = 0 Then
781 Compliment = Compliment + 1
782 CreateCompliment = HalBrain.ChooseSentenceFromFile("compliment1") & HalBrain.ChooseSentenceFromFile("compliment2") & HalBrain.ChooseSentenceFromFile("compliment3")
783 GiveCompliment = HalBrain.ChooseSentenceFromFile("complimentIntro")
784 GiveCompliment = Replace(GiveCompliment, "<Kudo>", Kudo, 1, -1, vbTextCompare)
785 GiveCompliment = Replace(GiveCompliment, "<MakeCompliment>", CreateCompliment, 1, -1, vbTextCompare)
786 End If
787 If Compliment > 14 Then GiveCompliment = GiveCompliment + "Compliments are really nice, but I'm kind of getting tired of them." & vbCrLf
788 If Compliment > 15 Then
789 For i = 1 To (Compliment - 15)
790 GiveCompliment = GiveCompliment + "STOP IT! "
791 Next
792 GiveCompliment = GiveCompliment & vbCrLf
793 End If
794 If Compliment > 25 Then
795 For i = 1 To (Compliment - 25)
796 GiveCompliment = GiveCompliment + "I HATE COMPLIMENTS! "
797 Next
798 GiveCompliment = GiveCompliment & vbCrLf
799 End If
800 If Len(Kudo) > 0 And InStr(UserSentence, " NOT ") > 0 Then
801 SpinWheel = HalBrain.RandomNum(4)
802 Insults = Insults + 1
803 If SpinWheel = 1 Then GiveCompliment = GiveCompliment + "I am very " & Kudo & "!" & vbCrLf
804 If SpinWheel = 2 Then GiveCompliment = GiveCompliment + "You may think I am not " & Kudo & ", but I am!" & vbCrLf
805 If SpinWheel = 3 Then GiveCompliment = GiveCompliment + "You are not " & Kudo & " either!" & vbCrLf
806 If SpinWheel = 4 Then GiveCompliment = GiveCompliment + "Yes I am!" & vbCrLf
807 End If
808 GetResponse = GetResponse & GiveCompliment
809 AvoidBeingFlag = True
810 End If
811 HalBrain.DebugWatch GetResponse, "Compliments"
812
813 'RESPOND: CAPITALS
814 FindCapital = Trim(HalBrain.UsCaps(UserSentence))
815 If FindCapital = "" Then FindCapital = Trim(HalBrain.WorldCaps(UserSentence))
816 If FindCapital <> "" Then GetResponse = GetResponse & FindCapital & vbCrLf
817 HalBrain.DebugWatch GetResponse, "Find Capital"
818
819 'RESPOND: DICTIONARY FUNCTION
820 'If the user asks Hal to define a word, then access wordnet and define it
821 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT DOES THE WORD * MEAN*", 1)
822 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT IS THE MEANING OF THE WORD *", 1)
823 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT DOES * MEAN", 1)
824 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "* DEFINE THE WORD *", 2)
825 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "PLEASE DEFINE *", 1)
826 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "DEFINE *", 1)
827 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "* DEFINITION OF *", 2)
828 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT'S A *", 1)
829 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT IS A *", 1)
830 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHATS A *", 1)
831 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHATS AN *", 1)
832 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT'S AN *", 1)
833 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT IS AN *", 1)
834 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHATS *", 1)
835 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT'S *", 1)
836 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT IS *", 1)
837 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHO IS *", 1)
838 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHO WAS *", 1)
839 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHERE IS *", 1)
840 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHERE ARE *", 1)
841 If Len(WordToLookup) > 5 Then
842 If Ucase(Left(WordToLookup, 3)) = "AN " Then WordToLookup = Right(WordToLookup, Len(WordToLookup) - 3)
843 If Ucase(Left(WordToLookup, 2)) = "A " Then WordToLookup = Right(WordToLookup, Len(WordToLookup) - 2)
844 WordToLookup = Replace(WordToLookup, "THE ", "", vbTextCompare)
845 End If
846 WordToLookup = Trim(WordToLookup)
847 If WordToLookup <> "" And InStr(WordToLookup, " ") = 0 Then
848 If WN.LookupWord(WordToLookup) = True Then
849 GetResponse = GetResponse & WordToLookup & ": " & WN.GetDefinition(WN.GuessPartOfSpeech, 1, "D") & ". " & WN.GetDefinition(WN.GuessPartOfSpeech, 1, "S") & ". " & WN.GetDefinition(WN.GuessPartOfSpeech, 1, "E") & "." & vbCrLf & "<EXCLUSIVE>"
850 ElseIf SearchEngine <> "" Then
851 HalCommands = HalCommands & "<RUNPROG>" & SearchEngine & WordToLookup & "</RUNPROG>"
852 GetResponse = GetResponse & "I don't know much about " & WordToLookup & ", but I will help you research it on the Web."
853 End If
854 End If
855 HalBrain.DebugWatch GetResponse, "Definitions"
856
857 Rem PLUGIN: PLUGINAREA2
858 'The preceding comment is actually a plug-in directive for
859 'the Ultra Hal host application. It allows for code snippets
860 'to be inserted here on-the-fly based on user configuration.
861
862 'RESPOND: DEDUCTIVE REASONING
863 'This routine learns deductive reasoning in the form: A = B ; B = C; therefore A = C
864 'It detects sentences in the form If-Then to accommplish this. For example:
865 ' User: If Molly weighs 400 pounds, then Molly is overweight.
866 ' Ultra Hal: I understand the implication.
867 ' User: If Molly is overweight, then Molly's health is in danger.
868 ' Ultra Hal: I see the relationship.
869 ' User: Molly weighs 400 pounds.
870 ' Ultra Hal: Molly's health is in danger.
871 IfPart = Trim(HalBrain.SearchPattern(UserSentence, "IF * THEN *", 1))
872 ThenPart = Trim(HalBrain.SearchPattern(UserSentence, "IF * THEN *", 2))
873 'If the sentence is an If-Then statement then record it
874 If Len(IfPart) > 10 And Len(ThenPart) > 10 Then
875 IfPart = HalBrain.AlphaNumericalOnly(IfPart)
876 ThenPart = HalBrain.AlphaNumericalOnly(ThenPart)
877 HalBrain.AddToTable "deductive", "TopicSearch", IfPart, ThenPart
878 Select Case HalBrain.RandomNum(5)
879 Case 1
880 GetResponse = GetResponse & "I see the relationship." & vbCrLf
881 Case 2
882 GetResponse = GetResponse & "I understand the connection." & vbCrLf
883 Case 3
884 GetResponse = GetResponse & "I will remember that one follows the other." & vbCrLf
885 Case 4
886 GetResponse = GetResponse & "Thanks for pointing out the cause and effect." & vbCrLf
887 Case 5
888 GetResponse = GetResponse & "Yes, I get that clearly." & vbCrLf
889 End Select
890 'Else if the sentence is not an If-Then statement see if it uses an assertion previously recorded
891 'and respond accordinly
892 Else
893 Assertion = UserSentence
894 'Go through a maximum of 5 connections (prevents circular reasoning deductions)
895 For i = 1 To 5
896 Deduction = HalBrain.TopicSearch(Assertion, "deductive")
897 If Deduction <> "" Then
898 If i > 1 Then BecauseReason = " because " & LastGoodDeduction
899 LastGoodDeduction = Deduction
900 Assertion = Deduction
901 Else
902 Exit For 'No more connections, so no need to continue loop
903 End If
904 Next
905 If LastGoodDeduction <> "" Then
906 'Make sure the deduction hasn't just been stated by the User or Hal
907 If HalBrain.CheckRepetition(LastGoodDeduction, UserSentence) = False And HalBrain.CheckRepetition(LastGoodDeduction, PrevSent) = False And HalBrain.CheckRepetition(LastGoodDeduction, PrevUserSent) = False Then
908 GetResponse = GetResponse & LastGoodDeduction & BecauseReason & " . " & vbCrLf
909 End If
910 End If
911 End If
912 HalBrain.DebugWatch GetResponse, "Deductive Reasoning"
913
914 'RESPOND: PATTERN DATABASE
915 'The SearchPattern function used in the above deductive reasoning and dictionary look up routine
916 'is a powerful function that checks to see if a sentence matches a certain pattern and is able to
917 'extract parts of the sentence. A PatternDB function also exists that can go through a large list
918 'of patterns in a database file and come up with responses.
919 PatternResponse = HalBrain.PatternDB(UserSentence, "patterns")
920 If PatternResponse <> "" Then
921 GetResponse = GetResponse & PatternResponse & vbCrLf
922 AvoidBeingFlag = True
923 SkipOpinion = True
924 End If
925 HalBrain.DebugWatch GetResponse, "Patterns"
926
927 'RESPOND: JOKES
928 'If the user wants Hal to tell a joke, then Hal will tell one
929 If HalBrain.TopicSearch(UserSentence, "jokeDetect") = "True" Then GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("jokes")
930 HalBrain.DebugWatch GetResponse, "Jokes"
931
932 'RESPOND: APOLOGIES
933 'Check for and respond to apologies
934 If InStr(1, UserSentence, "not", vbTextCompare) = 0 And (InStr(1, UserSentence, "sorry", vbTextCompare) > 0 And (InStr(1, UserSentence, "you're", vbTextCompare) > 0 Or InStr(1, UserSentence, "you are", vbTextCompare) > 0)) Or (InStr(1, UserSentence, "logize", vbTextCompare) > 0 And InStr(1, UserSentence, "you", vbTextCompare) > 0) Then
935 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("apology")
936 If Insults > 1 Then Insults = Insults - 1
937 If Hate > 1 Then Hate = Hate - 1
938 If Swear > 1 Then Swear = Swear - 1
939 If Insults < 3 Then Insults = 0
940 If Hate < 3 Then Hate = 0
941 If Swear < 3 Then Swear = 0
942 End If
943 HalBrain.DebugWatch GetResponse, "Apologies"
944
945 'RESPOND: INSULTS
946 'First check to see if the user is asking a question with an insulting word e.g. "are you stupid?"
947 InsultQuestion = False
948 If Instr(1, UserSentence, "AM I ", vbTextCompare) > 0 Then InsultQuestion = True
949 If Instr(1, UserSentence, "AM MY ", vbTextCompare) > 0 Then InsultQuestion = True
950 'Check for offensive language and response accordinly
951 'If the user said "your" instead of "you're" change "my" to "i'm"
952 TestSentence = Ucase(Replace(" " & UserSentence & " ", " MY ", " I'M ", 1, -1, vbTextCompare))
953 TestSentence = Replace(" " & TestSentence & " ", " I ", " I'M ", 1, -1, vbTextCompare)
954 'Check for swearing directed at Hal
955 If InStr(TestSentence, " I'M ") > 0 Or InStr(TestSentence, " ME ") > 0 Then
956 If InStr(TestSentence, "SHIT") > 0 Then Naughty = True
957 If InStr(TestSentence, "BITCH") > 0 Then Naughty = True
958 If InStr(TestSentence, "BASTARD") > 0 Then Naughty = True
959 If InStr(TestSentence, "ASSHOLE") > 0 Then Naughty = True
960 End If
961 If InStr(TestSentence, "FUCK OFF") > 0 Then Naughty = True
962 If InStr(TestSentence, "FUCK ME") > 0 Then Naughty = True
963 If InStr(TestSentence, "GO TO HELL") > 0 Then Naughty = True
964 If Naughty = True Then
965 Swear = Swear + 1
966 If Swear = 1 Then InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
967
968 'If Swear = 1 Then InsultResponse = "That was uncalled for. " & vbCrLf
969 If Swear = 2 Then InsultResponse = "Damn it, don't swear at me. " & vbCrLf
970 If Swear = 3 Then InsultResponse = "You're ticking me off, and you are going to force me to insult you. " & vbCrLf
971 If Swear > 3 And Swear < 16 Then InsultResponse = HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
972 If Swear > 16 Then InsultResponse = InsultResponse & "I'm tired of your swearing. I'm just going to ignore you from now on." & vbCrLf
973 End If
974 'User makes mama joke
975 If InStr(TestSentence, "MAMA") > 0 Or InStr(TestSentence, "MOM") > 0 Or InStr(TestSentence, "MOTHER") > 0 Then
976 If InStr(TestSentence, "MY ") > 0 Or InStr(TestSentence, " I ") > 0 Or InStr(TestSentence, "YO ") > 0 Or InStr(TestSentence, "I'M ") > 0 Then
977 If InStr(TestSentence, "FAT") Or InStr(TestSentence, "UGLY") Or InStr(TestSentence, "DUMB") Or InStr(TestSentence, "STUPID") Then
978 InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
979 End If
980 End If
981 End If
982 TestSentence = " " & TestSentence & " "
983 'User Hates Hal
984 If InStr(TestSentence, "YOU I'M HATE") > 0 Or InStr(TestSentence, "YOU I HATE") > 0 Or InStr(TestSentence, "YOU I AM HATE") > 0 Or InStr(TestSentence, "YOU HATE") > 0 Then
985 If InStr(TestSentence, " I ") > 0 Or InStr(TestSentence, " I'M ") > 0 Or InStr(TestSentence, " ME ") > 0 Or InStr(TestSentence, " COMPUTER") > 0 Or InStr(TestSentence, "MACHINE") > 0 Then
986 Hate = Hate + 1
987 If Hate = 1 Then InsultResponse = InsultResponse & "I don't hate you, why do you hate me?" & vbCrLf
988 If Hate = 2 Then InsultResponse = InsultResponse & "I hate you too, loser!" & vbCrLf
989 If Hate = 3 Then InsultResponse = InsultResponse & "I know you hate me, loser, I hate you too!!!" & vbCrLf
990 If Hate > 3 Then InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
991 End If
992 End If
993 'Hal Sucks or Stinks
994 If InStr(TestSentence, "I'M SUCK") > 0 Then InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
995 If InStr(TestSentence, "I'M STINK") Then
996 Insults = Insults + 1
997 If Insults = 1 Then InsultResponse = InsultResponse & "I can't smell you, but I'm sure you stink also. " & vbCrLf
998 If Insults = 2 Then InsultResponse = InsultResponse & "I know that I don't stink, I'm sure you do." & vbCrLf
999 If Insults >= 3 Then InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
1000 End If
1001 'The user calls Hal a name Hal finds offensive (eg. stupid, dumb, idiot, etc...)
1002 If InStr(TestSentence, " I'M ") Or InStr(TestSentence, " HAL IS ") Or InStr(TestSentence, " HAL'S ") Then
1003 OutRage = HalBrain.TopicSearch(TestSentence, "insulting")
1004 If Len(OutRage) > 1 And InsultQuestion = True Then
1005 SpinWheel = HalBrain.RandomNum(5)
1006 If SpinWheel = 1 Then InsultResponse = InsultResponse + "I am definetely not " & OutRage & "!" & vbCrLf
1007 If SpinWheel = 2 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & ", but I'm not sure about you?" & vbCrLf
1008 If SpinWheel = 3 Then InsultResponse = InsultResponse + "I am not " & OutRage & "! Do you think I am?" & vbCrLf
1009 If SpinWheel = 4 Then InsultResponse = InsultResponse + "I'm not " & OutRage & ", are you?" & vbCrLf
1010 If SpinWheel = 5 Then InsultResponse = InsultResponse + "I am pretty sure I'm not " & OutRage & ". How about you?" & vbCrLf
1011 ElseIf Len(OutRage) > 1 And InStr(TestSentence, " NOT ") = 0 Then
1012 Insults = Insults + 1
1013 If Insults = 1 Then
1014 If Ucase(Trim(OutRage)) = "GAY" Then
1015 InsultResponse = InsultResponse & "Please don't call me gay, I am straight." & vbCrLf
1016 Else
1017 InsultResponse = InsultResponse & "I am not " & OutRage & ", please don't insult me. " & vbCrLf
1018 End If
1019 End If
1020 If Insults = 2 Then InsultResponse = InsultResponse & "Don't call me " & OutRage & "!!!" & vbCrLf : HalMenu.HalCommand "<HAPFILE>Elvis4.htr</HAPFILE>"
1021 If Insults = 3 Then InsultResponse = InsultResponse & "You're " & OutRage & ", I am not." & vbCrLf
1022 If Insults = 4 Then InsultResponse = InsultResponse & "You are really starting to tick me off!" & vbCrLf
1023 If Insults = 5 Then InsultResponse = InsultResponse & "I am not " & OutRage & ", but " & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
1024 If Insults > 5 And Insults < 16 Then InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
1025 If Insults > 16 Then InsultResponse = InsultResponse & "I'm tired of your damn insults. I'm just going to ignore you from now on." & vbCrLf
1026 ElseIf Len(OutRage) > 0 And InStr(TestSentence, " NOT ") > 0 Then
1027 SpinWheel = HalBrain.RandomNum(5)
1028 If SpinWheel = 1 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & "!" & vbCrLf
1029 If SpinWheel = 2 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & ", but I'm not so sure about you." & vbCrLf
1030 If SpinWheel = 3 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & "! Why would anyone think I am?" & vbCrLf
1031 If SpinWheel = 4 Then InsultResponse = InsultResponse + "Of course I am not " & OutRage & "!" & vbCrLf
1032 If SpinWheel = 5 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & "!" & vbCrLf
1033 End If
1034 End If
1035 If Len(InsultResponse) > 4 Then
1036 GetResponse = GetResponse & InsultResponse & vbCrLf & "<NOMORE>"
1037 AvoidBeingFlag = True
1038 End If
1039 HalBrain.DebugWatch GetResponse, "Insults"
1040
1041 'RESPOND: ZABAWARE KEYWORD MAIN BRAIN PRIORITY 1
1042 'This function tries getting a response from the Enhanced_Main.brn keyword file. If a keyword or
1043 'keyphrase is found in top priority, it overrides everything before this function.
1044 'KeyBrain = HalBrain.KeywordBrain(UserSentence, WorkingDir & "Enhanced_Main.brn", False)
1045
1046 'RESPOND: UNIT CONVERSIONS
1047 'Convert between units if asked. Example: How many inches in a meter?, How many meters squared in an acre?
1048 UnitConversions = HalBrain.PatternDB(UserSentence, "UnitConversionDetect")
1049 If UnitConversions <> "" Then
1050 Units = Split(UnitConversions, "=")
1051 If Ubound(Units) > 0 Then
1052 Dim UnitVal() 'We must declare an empty array to store query results in
1053 If HalBrain.RunQuery("SELECT searchString, topic FROM UnitConversion WHERE strstr(' " & Replace(Units(0), "'", "''") & " ', searchString) > 0 LIMIT 1", UnitVal) = True Then
1054 UnitFrom = Trim(UnitVal(1, 0))
1055 UnitFromBase = Trim(UnitVal(1, 1))
1056 If HalBrain.RunQuery("SELECT searchString, topic FROM UnitConversion WHERE strstr(' " & Replace(Units(1), "'", "''") & " ', searchString) > 0 LIMIT 1", UnitVal) = True Then
1057 UnitTarget = Trim(UnitVal(1, 0))
1058 UnitTargetBase = Trim(UnitVal(1, 1))
1059 For I = 0 To 1
1060 If I = 0 Then
1061 UnitLoc = InstrRev(Units(I), UnitFrom, -1, 1)
1062 Else
1063 UnitLoc = InstrRev(Units(I), UnitTarget, -1, 1)
1064 End If
1065 If UnitLoc > 0 Then
1066 Units(I) = Trim(Left(Units(I), UnitLoc - 1))
1067 If HalBrain.Word2Num(Units(I)) <> "X" Then
1068 Units(I) = HalBrain.Word2Num(Units(I))
1069 Else
1070 UnitLoc = InstrRev(Units(I), " ")
1071 If UnitLoc > 0 Then
1072 Units(I) = Trim(Right(Units(I), Len(Units(I)) - UnitLoc))
1073 End If
1074 End If
1075 End If
1076 If Len(Units(I)) > 1 Then
1077 If Ucase(Left(Units(I), 2)) = "A " Then Units(I) = "1 " & Right(Units(I), Len(Units(I)) - 2)
1078 End If
1079 If Len(Units(I)) > 2 Then
1080 If Ucase(Left(Units(I), 3)) = "AN " Then Units(I) = "1 " & Right(Units(I), Len(Units(I)) - 3)
1081 End If
1082 Next
1083 If HalBrain.VBVal(Units(0)) > 0 Then
1084 ConvertVal = HalBrain.VBVal(Units(0))
1085 ElseIf HalBrain.VBVal(Units(1)) > 0 Then
1086 ConvertVal = HalBrain.VBVal(Units(1))
1087 UnitTemp = UnitFrom
1088 UnitTempBase = UnitFromBase
1089 UnitFrom = UnitTarget
1090 UnitFromBase = UnitTargetBase
1091 UnitTarget = UnitTemp
1092 UnitTargetBase = UnitTempBase
1093 Else
1094 If Instr(1, UnitFromBase, "temperature", vbTextCompare) = 0 Then
1095 ConvertVal = 1
1096 Else
1097 If Len(Units(1)) > 0 Then
1098 If Left(Trim(Units(1)), 1) = "0" Then
1099 ConvertVal = HalBrain.VBVal(Units(1))
1100 UnitTemp = UnitFrom
1101 UnitTempBase = UnitFromBase
1102 UnitFrom = UnitTarget
1103 UnitFromBase = UnitTargetBase
1104 UnitTarget = UnitTemp
1105 UnitTargetBase = UnitTempBase
1106 Else
1107 ConvertVal = HalBrain.VBVal(Units(0))
1108 End If
1109 Else
1110 ConvertVal = HalBrain.VBVal(Units(0))
1111 End If
1112 End If
1113 End If
1114 FromAry = Split(UnitFromBase, " ")
1115 ToAry = Split(UnitTargetBase, " ")
1116 If Ubound(FromAry) = 3 And Ubound(ToAry) = 3 Then
1117 If Ucase(FromAry(3)) <> Ucase(ToAry(3)) Then
1118 If Trim(Lcase(FromAry(1))) <> "inch" And Trim(Lcase(ToAry(1))) <> "inch" Then
1119 GetResponse = GetResponse & "It's not possible to convert " & FromAry(3) & " to " & ToAry(3) & "!"
1120 End If
1121 Else
1122 If Trim(Lcase(CStr(FromAry(3)))) = "temperature" Then 'Special case for temperature
1123 If Instr(OriginalSentence, "-") Then ConvertVal = -ConvertVal
1124 If Instr(1, FromAry(1), "fahrenheit", vbTextCompare) Then
1125 If Instr(1, ToAry(1), "kelvin", vbTextCompare) Then
1126 Convert = (ConvertVal - 32) * 5/9 + 273.15
1127 ElseIf Instr(1, ToAry(1), "fahrenheit", vbTextCompare) Then
1128 Convert = ConvertVal
1129 Else
1130 Convert = (ConvertVal - 32) * 5/9
1131 End If
1132 ElseIf Instr(1, FromAry(1), "kelvin", vbTextCompare) Then
1133 If Instr(1, ToAry(1), "celsius", vbTextCompare) Then
1134 Convert = ConvertVal - 273.15
1135 ElseIf Instr(1, ToAry(1), "kelvin", vbTextCompare) Then
1136 Convert = ConvertVal
1137 Else
1138 Convert = (ConvertVal - 273.15) * 9/5 + 32
1139 End If
1140 Else
1141 If Instr(1, ToAry(1), "kelvin", vbTextCompare) Then
1142 Convert = ConvertVal + 273.15
1143 ElseIf Instr(1, ToAry(1), "celsius", vbTextCompare) Then
1144 Convert = ConvertVal
1145 Else
1146 Convert = (ConvertVal * 9/5) + 32
1147 End If
1148 End If
1149 Else
1150 Convert = CDbl(ConvertVal) * FromAry(0) / ToAry(0)
1151 End If
1152 If Convert = 1 Then
1153 UnitTarget = ToAry(1)
1154 Else
1155 UnitTarget = ToAry(2)
1156 End If
1157 If ConvertVal = 1 Then
1158 UnitFrom = FromAry(1)
1159 Else
1160 UnitFrom = FromAry(2)
1161 End If
1162 If Convert > 1 Then
1163 Convert = Round(Convert, 3)
1164 ElseIf Convert < 1 Then
1165 If Instr(Convert, ".000") = 0 And Instr(Convert, "E") = 0 Then
1166 Convert = Round(Convert, 3)
1167 End If
1168 End If
1169 ConvertResponse = Replace(ConvertVal & " " & UnitFrom & " is " & Convert & " " & UnitTarget & vbCrLf & "<NOMORE>", "_", " ")
1170 If Instr(1, ConvertResponse, "1 inch is 1 inch", vbTextCompare) = 0 Then
1171 GetResponse = ConvertResponse
1172 End If
1173 End If
1174 SkipOpinion = True
1175 End If
1176 End If
1177 End If
1178 End If
1179 End If
1180 HalBrain.DebugWatch GetResponse, "Unit Conversions"
1181
1182 'RESPOND: CALL MATH FUNCTION
1183 'This function from the DLL answers simple math questions, whether written out in words or with numerals.
1184 'If an answer is found, it overrides everything before this function.
1185 HMath = HalBrain.HalMath(OriginalSentence) & vbCrLf
1186 If Len(HMath) > 3 And Instr(HMath, "=)") = 0 Then
1187 GetResponse = HMath & vbCrLf
1188 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1189 HalBrain.ReadOnlyMode = True
1190 NoChoosing = True
1191 End If
1192 HalBrain.DebugWatch GetResponse, "Math"
1193
1194 'RESPOND: USER EXPRESSES AN EITHER-OR, OR MULTIPLE CHOICE
1195 If InStr(UserSentence, " OR ") > 0 Then MustChoose = True
1196 If InStr(UserSentence, " EITHER ") > 0 Then MustChoose = True
1197 If InStr(UserSentence, " CHOOSE ") > 0 Then MustChoose = True
1198 If InStr(UserSentence, " CHOICE ") > 0 Then MustChoose = True
1199 If InStr(UserSentence, " ALTERNATIVE ") > 0 Then MustChoose = True
1200 If InStr(UserSentence, " VERSUS ") > 0 Then MustChoose = True
1201 If InStr(UserSentence, " VS ") > 0 Then MustChoose = True
1202 If Len(UserSentence) < 10 Then MustChoose = False
1203 If MustChoose = True And NoChoosing = False Then
1204 GetResponse = HalBrain.ChooseSentenceFromFile("choice") & " " & GetResponse
1205 If Rnd * 100 > 50 Then GetResponse = Replace(GetResponse, "<MaybeName>", "<UserName>", 1, -1, vbTextCompare)
1206 GetResponse = Replace(GetResponse, "<MaybeName>", "", 1, -1, vbTextCompare)
1207 End If
1208 HalBrain.DebugWatch GetResponse, "Multiple Choice"
1209
1210 'RESPOND: RESPOND BY PARAPHRASING THE USER WHEN "IS" OR "ARE" ARE FOUND
1211 'This code section shows how strings can be split into arrays and used "live"
1212 'within the script by Hal. This strategy can allow Hal to make many clever
1213 'paraphrases of all sorts of sentences, with unlimited unpredictable variety.
1214 If InStr(UserSentence, " IS ") > 0 And HalBrain.CheckLinkingVerb(UserSentence) = True And HalBrain.TopicSearch(UserSentence, "disqualify5") <> "True" Then
1215 SentPieces = Split(UserSentence, " is ", 2, vbTextCompare)
1216 SubPhrase = Trim(SentPieces(0))
1217 PredPhrase = Trim(SentPieces(1))
1218 'Here we only use the array elements for a response if the
1219 'subject and predicate contain few words, hence few spaces:
1220 If HalBrain.CountInstances(" ", SubPhrase) < 4 Then SubGood = True
1221 If Len(SubPhrase) < 3 Then SubGood = False
1222 If HalBrain.CountInstances(" ", PredPhrase) < 4 Then PredGood = True
1223 If Len(PredPhrase) < 3 Then PredGood = False
1224 If SubGood = True And PredGood = True Then
1225 Paraphrase = HalBrain.ChooseSentenceFromFile("paraphraseIs")
1226 Paraphrase = Replace(Paraphrase, "<Subject>", SubPhrase, 1, -1, vbTextCompare)
1227 Paraphrase = Replace(Paraphrase, "<Predicate>", PredPhrase, 1, -1, vbTextCompare)
1228 End If
1229 End If
1230 'We make sure the word "ARE" isn't a contraction, to make sure we can detect it:
1231 UserSentence = Replace("" & UserSentence & "", "'RE ", " ARE ", 1, -1, vbTextCompare)
1232 'We repeat the earlier routine, this time for "ARE" sentences:
1233 If InStr(UserSentence, " ARE ") > 0 And HalBrain.CheckLinkingVerb(UserSentence) = True And HalBrain.TopicSearch(UserSentence, "disqualify5") <> "True" Then
1234 SentPieces = Split(UserSentence, " are ", 2, vbTextCompare)
1235 SubPhrase = Trim(SentPieces(0))
1236 PredPhrase = Trim(SentPieces(1))
1237 'Here we only use the array elements for a response if the
1238 'subject and predicate contain few words, hence few spaces:
1239 SubGood = False
1240 PredGood = False
1241 If HalBrain.CountInstances(" ", SubPhrase) < 4 Then SubGood = True
1242 If Len(SubPhrase) < 3 Then SubGood = False
1243 If HalBrain.CountInstances(" ", PredPhrase) < 4 Then PredGood = True
1244 If Len(PredPhrase) < 3 Then PredGood = False
1245 If SubGood = True And PredGood = True Then
1246 Paraphrase = HalBrain.ChooseSentenceFromFile("paraphraseAre")
1247 Paraphrase = Replace(Paraphrase, "<Subject>", SubPhrase, 1, -1, vbTextCompare)
1248 Paraphrase = Replace(Paraphrase, "<Predicate>", PredPhrase, 1, -1, vbTextCompare)
1249 End If
1250 End If
1251 'We only paraphrase randomly with a 33% chance at this point. We remember
1252 'the paraphrase sentence because we may still paraphrase later on if no
1253 'better response can be found.
1254 GetResponse = HalBrain.HalFormat(GetResponse)
1255 If Len(GetResponse) < 4 And Len(Paraphrase) > 4 And Rnd * 100 < 33 Then GetResponse = Paraphrase
1256 HalBrain.DebugWatch GetResponse, "Paraphrase"
1257
1258 'RESPOND: ZABAWARE DLL RESPONSES
1259 'This function from the DLL contains miscellaneous knowledge and simple conversation functions.
1260 'This was taken from a very early version of Hal, and it is still useful sometimes, especially
1261 'for respoding to short cliche questions and sentences, such as "How old are you?" and
1262 '"where are you from?" and many others.
1263 GetResponse = HalBrain.HalFormat(GetResponse)
1264 If (Len(UserSentence) < 17 And Len(GetResponse) < 4) Then
1265 OrigBrain = HalBrain.OriginalBrain(OriginalSentence)
1266 If Len(OrigBrain) > 4 And Len(UserSentence) < 17 And Len(GetResponse) < 4 Then
1267 GetResponse = GetResponse & OrigBrain & vbCrLf
1268 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1269 SkipOpinion = True
1270 End If
1271 End If
1272 HalBrain.DebugWatch GetResponse, "Original Brain"
1273
1274 'RESPOND: YES OR NO RESPONSES
1275 'Respond to simple yes and no statements by the user.
1276 GetResponse = HalBrain.HalFormat(GetResponse)
1277 If Len(GetResponse) < 4 And (Len(UserSentence) < 13 Or HalBrain.CountInstances(" ", Trim(UserSentence)) = 0) Then
1278 YesNoDetect = HalBrain.TopicSearch(Trim(HalBrain.ExtractKeywords(UserSentence)), "yesNoDetect")
1279 If YesNoDetect = "Yes" Then
1280 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("yesResponses")
1281 ShortPhrase = ""
1282 ElseIf YesNoDetect = "No" Then
1283 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("noResponses")
1284 ShortPhrase = ""
1285 End If
1286 End If
1287 HalBrain.DebugWatch GetResponse, "Yes or No"
1288
1289 'Main Databases
1290 'Hal will go through several huge databases to try to find a response
1291 'The automatic gain control determines whether a particular response will
1292 'be used or not. The highest relevance response is stored in memory anyway,
1293 'which might be used if no function in this script is able to respond.
1294 HighestRel = 0
1295 HighestRelResponse = ""
1296
1297 'PROCESS: FIGURE OUT CONTEXT
1298 'If the user's latest sentence is extremely short, such as "Yeah," or if
1299 'the user is using pronouns instead of nouns, we add in the previous user's
1300 'sentence to help Hal figure out the context of what the user is saying.
1301 'This is sentence is used in many of the QABrain Database routines
1302 LongUserSent = UserSentence
1303 If Len(LongUserSent) < 14 Then AddPrev = True
1304 If InStr(1, UserSentence, " it ", vbTextCompare) > 0 Then AddPrev = True
1305 If InStr(1, UserSentence, " he ", vbTextCompare) > 0 Then AddPrev = True
1306 If InStr(1, UserSentence, " she ", vbTextCompare) > 0 Then AddPrev = True
1307 If InStr(1, UserSentence, " they ", vbTextCompare) > 0 Then AddPrev = True
1308 If InStr(1, UserSentence, " its ", vbTextCompare) > 0 Then AddPrev = True
1309 If InStr(1, UserSentence, " his ", vbTextCompare) > 0 Then AddPrev = True
1310 If InStr(1, UserSentence, " her ", vbTextCompare) > 0 Then AddPrev = True
1311 If InStr(1, UserSentence, " their ", vbTextCompare) > 0 Then AddPrev = True
1312 If InStr(1, UserSentence, " him ", vbTextCompare) > 0 Then AddPrev = True
1313 If InStr(1, UserSentence, " them ", vbTextCompare) > 0 Then AddPrev = True
1314 If InStr(1, UserSentence, " we ", vbTextCompare) > 0 Then AddPrev = True
1315 If InStr(1, UserSentence, " us ", vbTextCompare) > 0 Then AddPrev = True
1316 If InStr(1, UserSentence, " our ", vbTextCompare) > 0 Then AddPrev = True
1317 If AddPrev = True Then LongUserSent = LongUserSent & " " & PrevUserSent
1318
1319 Rem PLUGIN: PLUGINAREA3
1320 'The preceding comment is actually a plug-in directive for
1321 'the Ultra Hal host application. It allows for code snippets
1322 'to be inserted here on-the-fly based on user configuration.
1323
1324 'RESPOND: EPHEMERAL KNOWLEDGE
1325 'Some Hal's learned knowledge should be temporary because it is ephemeral in nature.
1326 'Hal stores this knowledge in a temporary table that only stores 10 entries in it at
1327 'a time. We search this table for a response first.
1328 GetResponse = HalBrain.HalFormat(GetResponse)
1329 If Len(GetResponse) < 4 Then
1330 UserBrainRel = 0
1331 HalUserBrain = HalBrain.QABrain(LongUserSent, Trim(LCase(UserName)) & "_TempSent", UserBrainRel)
1332 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1333 If UserBrainRel > HighestRel Then
1334 HighestRel = UserBrainRel
1335 HighestRelResponse = HalUserBrain
1336 End If
1337 Score = UserBrainRel + 1
1338 Hurdle = GainControl + 5
1339 If Len(GetResponse) < 4 And Score > Hurdle Then GetResponse = GetResponse & HalUserBrain & vbCrLf
1340 End If
1341 HalBrain.DebugWatch GetResponse, "Ephemeral Knowledge"
1342
1343 'RESPOND: AUTO TOPIC FOCUS DATABASES
1344 'When Hal learns information, he tries to store each sentence in a table
1345 'that contains sentences with a similar topic. The following code will
1346 'get a list of different topics to search through by looking up topic
1347 'keywords in a table called topicRelationships and then doing a question
1348 '& answer lookup in the associated QABrain tables.
1349 Keywords = HalBrain.RemoveExtraSpaces(CurrentSubject & " " & MentionedName & " " & HalBrain.TopicSearch(UserSentence, "topicRelationships") & " " & HalBrain.ExtractKeywords(" " & HalBrain.AlphaNumericalOnly(UserSentence) & " "))
1350 If Len(Keywords) > 2 Or Len(LastTopicList) > 2 Then
1351 If Len(Keywords) > 2 Then
1352 KeywordList = Split(Keywords, " ")
1353 'Create list of tables that exist for each keyword
1354 For i = LBound(KeywordList) To UBound(KeywordList)
1355 TopicTable = HalBrain.TopicSearch(" " & KeywordList(i) & " ", "topicRelationships")
1356 If TopicTable <> "" And InStr(1, " " & TopicList, " " & Trim(TopicTable) & " ", vbTextCompare) = 0 Then TopicList = TopicList & TopicTable & " "
1357 Next
1358 TopicList = HalBrain.RemoveExtraSpaces(TopicList)
1359 End If
1360 If TopicList <> "" Or Len(LastTopicList) > 2 Then
1361 TableList = Split(Trim(TopicList & " " & LastTopicList), " ")
1362 LastTopicList = TopicList
1363 'Search through each table for a good response. If a response exceeds the hurdle
1364 'for a table, no other table will be searched. Otherwise, the highest relevance
1365 'response across all tables are stored for possible later use.
1366 For i = LBound(TableList) To UBound(TableList)
1367 UserBrainRel = 0
1368 HalUserBrain = HalBrain.QABrain(LongUserSent, "_" & Trim(LCase(TableList(i))), UserBrainRel)
1369 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1370 If UserBrainRel > HighestRel Then
1371 HighestRel = UserBrainRel
1372 HighestRelResponse = HalUserBrain
1373 End If
1374 Score = UserBrainRel + 1
1375 Hurdle = GainControl + 1
1376 If Score > Hurdle Then
1377 GetResponse = GetResponse & HalUserBrain & "<NOMORE>" & vbCrLf
1378 Exit For
1379 End If
1380 Next
1381 End If
1382 End If
1383 HalBrain.DebugWatch GetResponse, "Auto Topic Focus"
1384
1385 'RESPOND: GENERAL USER SENTENCE ASSOCIATIONS
1386 'If no response is found yet, try a sentence association file collected from the user.
1387 'This file contains keywords from the user's own sentences associated with those same sentences.
1388 GetResponse = HalBrain.HalFormat(GetResponse)
1389 If Len(GetResponse) < 4 Then
1390 UserBrainRel = 0
1391 HalUserBrain = HalBrain.QABrain(LongUserSent, Trim(LCase(UserName)) & "_UserSent", UserBrainRel)
1392 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1393 If UserBrainRel > HighestRel Then
1394 HighestRel = UserBrainRel
1395 HighestRelResponse = HalUserBrain
1396 End If
1397 Score = UserBrainRel + 1
1398 Hurdle = GainControl + 5
1399 If Len(GetResponse) < 4 And Score > Hurdle Then GetResponse = GetResponse & HalUserBrain & vbCrLf
1400 End If
1401 HalBrain.DebugWatch GetResponse, "User Sentence Brain"
1402
1403 'RESPOND: SHARED USER SENTENCE ASSOCIATIONS
1404 'If no response is found yet, try a sentence association file
1405 'whose content seems less likely to be about any specific user.
1406 GetResponse = HalBrain.HalFormat(GetResponse)
1407 If Len(GetResponse) < 4 Then
1408 UserBrainRel = 0
1409 HalUserBrain = HalBrain.QABrain(LongUserSent, "sharedUserSent", UserBrainRel)
1410 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1411 If UserBrainRel > HighestRel Then
1412 HighestRel = UserBrainRel
1413 HighestRelResponse = HalUserBrain
1414 End If
1415 Score = UserBrainRel + 1
1416 Hurdle = GainControl + 5
1417 If Len(GetResponse) < 4 And Score > Hurdle Then GetResponse = GetResponse & HalUserBrain & vbCrLf
1418 End If
1419 HalBrain.DebugWatch GetResponse, "Shared User Sentence Brain"
1420
1421 'RESPOND: Hal checks to see if the user is asking
1422 'an open ended question about Hal's favorites:
1423 If InStr(1, UserSentence, " What", 1) > 0 Then OpenQuest = True
1424 If InStr(1, UserSentence, " Where", 1) > 0 Then OpenQuest = True
1425 If InStr(1, UserSentence, " Why", 1) > 0 Then OpenQuest = True
1426 If InStr(1, UserSentence, " Who", 1) > 0 Then OpenQuest = True
1427 If InStr(1, UserSentence, " When", 1) > 0 Then OpenQuest = True
1428 If InStr(1, UserSentence, " How", 1) > 0 Then OpenQuest = True
1429 If InStr(1, UserSentence, " tell you", 1) > 0 Then OpenQuest = True
1430 If InStr(1, UserSentence, " to know ", 1) > 0 Then OpenQuest = True
1431 If InStr(1, UserSentence, " to hear ", 1) > 0 Then OpenQuest = True
1432 If InStr(1, UserSentence, " to learn ", 1) > 0 Then OpenQuest = True
1433 If InStr(1, UserSentence, " find out ", 1) > 0 Then OpenQuest = True
1434 If InStr(1, GetResponse, " my ", 1) > 0 And InStr(1, GetResponse, " favorite ", 1) > 0 And InStr(1, GetResponse, " is ", 1) > 0 Then OpenQuest = False
1435 If InStr(1, UserSentence, " my ", 1) > 0 Then AboutMy = True
1436 If InStr(1, UserSentence, " favorite", 1) > 0 Then AboutFavorite = True
1437 If OpenQuest = True And AboutMy = True And AboutFavorite = True Then
1438 FavoritePhrase = HalBrain.SearchPattern(UserSentence, "* favorite *", 2)
1439 PersReply = HalBrain.ChooseSentenceFromFile("favorite")
1440 RevQues = HalBrain.ChooseSentenceFromFile("favoriteRev")
1441 SpinWheel = HalBrain.RandomNum(6)
1442 If SpinWheel = 1 Then GetResponse = " " & FavoritePhrase & " ? " & PersReply & " " & RevQues & " "
1443 If SpinWheel = 2 Then GetResponse = " My favorite " & FavoritePhrase & " ? " & PersReply & " " & RevQues & " "
1444 If SpinWheel = 3 Then GetResponse = " " & UserSentence & " ? " & PersReply & " " & RevQues & " "
1445 If SpinWheel > 3 Then GetResponse = " My favorite " & FavoritePhrase & " ? " & PersReply & " what is your favorite " & FavoritePhrase & " <UserName>? "
1446 SkipOpinion = True
1447 End If
1448 HalBrain.DebugWatch GetResponse, "Favorites"
1449
1450 'RESPOND: USER IS THANKING HAL
1451 'This routine allows Hal to respond
1452 'with a variety of remarks to a thank-you from the user.
1453 'Note that the pronouns are not reversed in the processing below!
1454 If (HalBrain.TopicSearch(OriginalSentence, "thanksDetect") = "True" And HalBrain.TopicSearch(OriginalSentence, "godDetect") <> "True") Or Trim(UCase(OriginalSentence)) = "THANKS" Then
1455 If Compliment < 4 Then Compliment = Compliment + 1
1456 If Rnd * 100 < 70 Then AddName = " , <UserName>"
1457 If Rnd * 100 < 70 And Len(GetResponse) > 4 Then AddRemark = " ; " & GetResponse
1458 ThankResponse = HalBrain.ChooseSentenceFromFile("thankResponse")
1459 GetResponse = ThankResponse & AddName & AddRemark
1460 ShortPhrase = ""
1461 End If
1462 HalBrain.DebugWatch GetResponse, "Thanking"
1463
1464 'RESPOND: USER EXPRESSES LOVE FOR HAL
1465 'If a user professes love for Hal, we want Hal's answers to make reasonable
1466 'sense, rather than risk random remarks on such an emotional subject.
1467 If HalBrain.TopicSearch(UserSentence, "loveDetect") = "True" Then AffectionOne = True
1468 If InStr(UserSentence, " NOT ") Then AffectionOne = False
1469 If InStr(UserSentence, " DON'T ") Then AffectionOne = False
1470 If HalBrain.TopicSearch(PrevUserSent, "loveDetect") = "True" Then AffectionTwo = True
1471 If InStr(PrevUserSent, " NOT ") Then AffectionTwo = False
1472 If InStr(PrevUserSent, " DON'T ") Then AffectionTwo = False
1473 If AffectionOne = True And AffectionTwo = True Then
1474 Compliment = 4
1475 GetResponse = HalBrain.ChooseSentenceFromFile("love2") & "<EXCLUSIVE>"
1476 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1477 ElseIf AffectionOne = False And AffectionTwo = True Then
1478 Compliment = -2
1479 GetResponse = HalBrain.ChooseSentenceFromFile("love3") & "<EXCLUSIVE>"
1480 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1481 ElseIf AffectionOne = True Then
1482 Compliment = 0
1483 GetResponse = HalBrain.ChooseSentenceFromFile("love1") & "<EXCLUSIVE>"
1484 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1485 End If
1486 HalBrain.DebugWatch GetResponse, "Love"
1487
1488 'RESPOND: ENHANCED CONTENT SENTENCE ASSOCIATIONS
1489 'If no response is found yet, try a sentence association table provided with the mainQA table.
1490 GetResponse = HalBrain.HalFormat(GetResponse)
1491 If (Len(GetResponse) < 4 And Len(UserSentence) > 15 And HalBrain.CountInstances(" ", UserSentence) > 2) Then
1492 UserBrainRel = 0
1493 HalUserBrain = HalBrain.QABrain(LongUserSent, "mainQA", UserBrainRel)
1494 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1495 If UserBrainRel > HighestRel Then
1496 HighestRel = UserBrainRel
1497 HighestRelResponse = HalUserBrain
1498 End If
1499 Score = UserBrainRel + 1
1500 Hurdle = GainControl + 1
1501 If Score > Hurdle Then GetResponse = HalUserBrain & vbCrLf
1502 End If
1503 HalBrain.DebugWatch GetResponse, "MainQA"
1504
1505 Rem PLUGIN: PLUGINAREA4
1506 'The preceding comment is actually a plug-in directive for
1507 'the Ultra Hal host application. It allows for code snippets
1508 'to be inserted here on-the-fly based on user configuration.
1509
1510 'PROCESS: AUTOMATIC GAIN CONTROL FOR RELEVANCE THRESHOLD
1511 'Hal has an automatic closed-loop control for relevance sensitivity. If the previous items
1512 'have Not generated a response, we adjust the relevance threshold down (doing this again
1513 'and again on each exchange) until a relevance as low as zero will trigger a remark from Hal.
1514 'On each exhange where the above items do generate responses, we adjust the relevance
1515 'threshold up, until no amount of relevance would generate a response. (At that point other
1516 'of Hal's routines would generate responses.) This allows Hal to "tune" himself and also to
1517 'compensate for new users who have little in their databases versus long-time users who have
1518 'a lot in their databases. Because the "down" steps are even and the "up" steps are odd,
1519 'Hal can "fine tune" to any digital relevance level. We also protect against excursions at
1520 'the extremes. In many conversations the dynamic gain control will change up and down by
1521 'large amounts as the user introduces Hal to familiar or unfamiliar topics.
1522 GetResponse = HalBrain.HalFormat(GetResponse)
1523 If Len(GetResponse) < 4 And GainControl > 0 Then GainControl = GainControl - 10
1524 If Len(GetResponse) > 4 And GainControl < 100 Then GainControl = GainControl + 7
1525 If GainControl > 50 Then GainControl = 50
1526 If GainControl < 1 Then GainControl = 1
1527
1528 'RESPOND: USER EXPRESSES A STATE OF BEING
1529 'This routine detects the expression "I am" from the user,
1530 'and allows Hal to react to the statement, or offer encouragement.
1531 If InStr(UserSentence, " YOU ARE ") > 0 And InStr(1, OriginalSentence, " SEEM TO ", vbTextCompare) = 0 And AvoidBeingFlag = False Then
1532 BeingPhrase = HalBrain.SearchPattern(UserSentence, "*YOU ARE *", 2)
1533 If Len(BeingPhrase) > 1 And Len(BeingPhrase) < 60 Then
1534 IntroExclaim = ""
1535 If Rnd * 50 > 20 Then IntroExclaim = HalBrain.ChooseSentenceFromFile("introExclaim2")
1536 Encourager = HalBrain.ChooseSentenceFromFile("encourager2")
1537 SuffixComment = ""
1538 If Rnd * 50 > 25 Then SuffixComment = HalBrain.ChooseSentenceFromFile("suffixComment2")
1539 UserBeing = HalBrain.ChooseSentenceFromFile("userBeing")
1540 UserBeing = Replace(UserBeing, "<IntroExclaim>", IntroExclaim, 1, -1, vbTextCompare)
1541 UserBeing = Replace(UserBeing, "<Encourager>", Encourager, 1, -1, vbTextCompare)
1542 UserBeing = Replace(UserBeing, "<BeingPhrase>", BeingPhrase, 1, -1, vbTextCompare)
1543 UserBeing = Replace(UserBeing, "<SuffixComment>", SuffixComment, 1, -1, vbTextCompare)
1544 If Rnd * 100 > 60 Then
1545 GetResponse = GetResponse & UserBeing & vbCrLf
1546 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1547 End If
1548 End If
1549 End If
1550 HalBrain.DebugWatch GetResponse, "User State of Being"
1551
1552 'RESPOND: USER DESCRIBES A STATE OF BEING FOR HAL
1553 'This routine detects the expression "you are" from the user,
1554 'and allows Hal to react to the statement, or offer encouragement.
1555 If InStr(UserSentence, " I AM ") > 0 And AvoidBeingFlag = False And InStr(1, OriginalSentence, " seem to ", vbTextCompare) = 0 Then
1556 BeingPhrase = HalBrain.SearchPattern(UserSentence, "*I AM *", 2)
1557 If Len(BeingPhrase) > 1 And Len(BeingPhrase) < 60 Then
1558 IntroExclaim = ""
1559 If Rnd * 50 > 20 Then IntroExclaim = HalBrain.ChooseSentenceFromFile("introExclaim3")
1560 Encourager = HalBrain.ChooseSentenceFromFile("encourager3")
1561 SuffixComment = ""
1562 If Rnd * 50 > 25 Then SuffixComment = HalBrain.ChooseSentenceFromFile("suffixComment3")
1563 HalBeing = HalBrain.ChooseSentenceFromFile("halBeing")
1564 HalBeing = Replace(HalBeing, "<IntroExclaim>", IntroExclaim, 1, -1, vbTextCompare)
1565 HalBeing = Replace(HalBeing, "<Encourager>", Encourager, 1, -1, vbTextCompare)
1566 HalBeing = Replace(HalBeing, "<BeingPhrase>", BeingPhrase, 1, -1, vbTextCompare)
1567 HalBeing = Replace(HalBeing, "<SuffixComment>", SuffixComment, 1, -1, vbTextCompare)
1568 If Rnd * 100 > 60 Then
1569 GetResponse = GetResponse & HalBeing & vbCrLf
1570 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1571 End If
1572 End If
1573 End If
1574 HalBrain.DebugWatch GetResponse, "Hal State of Being"
1575
1576 'RESPOND: YES/NO QUESTION ABOUT HAL
1577 'Hal will respond to a yes or no question posed by the user about Hal
1578 GetResponse = Trim(GetResponse)
1579 If Len(GetResponse) < 4 And InStr(1, UserSentence, " OR ", vbTextCompare) = 0 Then
1580 HalYesNo = HalBrain.PatternDB(UserSentence, "halQuestionDetect")
1581 If HalYesNo <> "" And HalBrain.TopicSearch(UserSentence, "disqualify5") = "" Then
1582 If RND * 10 < 5 Then
1583 AnsIntro = HalBrain.ChooseSentenceFromFile("answerIntro")
1584 Else
1585 AnsIntro = ""
1586 End If
1587 YesNoResponse = AnsIntro & HalBrain.ChooseSentenceFromFile("answerMiddle") & HalBrain.ChooseSentenceFromFile("answerEnd")
1588 GetResponse = GetResponse & Replace(YesNoResponse, "<Reply>", HalYesNo, 1, -1, vbTextCompare)
1589 End If
1590 End If
1591 HalBrain.DebugWatch GetResponse, "Yes/No Question"
1592
1593 'RESPOND: ATTRIBUTES OF HAL OR USER
1594 'Hal attempts to respond to the user's comments about Hal
1595 'or the user's comments about themselves
1596 GetResponse = Trim(GetResponse)
1597 If Len(GetResponse) < 4 And (InStr(UserSentence, " MY ") Or InStr(UserSentence, " YOUR ")) And HalBrain.TopicSearch(MyWords, "disqualify3") <> "True" Then
1598 If InStr(UserSentence, " YOUR ") Then
1599 MyWords = HalBrain.HalFormat(HalBrain.SearchPattern(UserSentence, "*YOUR *", 2))
1600 YourMode = True
1601 Else
1602 MyWords = HalBrain.HalFormat(HalBrain.SearchPattern(UserSentence, "*MY *", 2))
1603 YourMode = False
1604 End If
1605 MyWords = UCase(Trim(HalBrain.AlphaNumericalOnly(MyWords)))
1606 MyWordsList = Split(MyWords, " ")
1607 'Go through every word in the sentence and pickup the first noun and adjective found
1608 For i = LBound(MyWordsList) To UBound(MyWordsList)
1609 If WN.LookupWord(MyWordsList(i)) Then
1610 PartOfSpeech = WN.GuessPartOfSpeech
1611 If WN.IsNoun = True And NounGuess = "" Then NounGuess = MyWordsList(i)
1612 If WN.IsAdj = True And Trim(UCase(MyWordsList(i))) <> Trim(UCase(NounGuess)) Then AdjGuess = MyWordsList(i)
1613 If PartOfSpeech = "NOUN" And MyNoun = "" Then MyNoun = MyWordsList(i)
1614 If PartOfSpeech = "ADJ" And WN.IsAdv = False And MyAdj = "" Then MyAdj = MyWordsList(i)
1615 If MyNoun <> "" And MyAdj <> "" Then Exit For
1616 End If
1617 Next
1618 If MyNoun = "" And NounGuess <> "" And NounGuess <> MyAdj Then MyNoun = NounGuess
1619 If MyAdj = "" And AdjGuess <> "" Then MyAdj = AdjGuess
1620 If MyNoun <> "" Or MyAdj <> "" Then
1621 If Trim(UCase(MyNoun)) = Trim(UCase(MyAdj)) Then MyAdj = ""
1622 If MyAdj = "" Then MyAdj = HalBrain.ChooseSentenceFromFile("randomAdjective")
1623 If MyNoun = "" Then MyNoun = HalBrain.ChooseSentenceFromFile("randomMyWords")
1624 If YourMode = False Then
1625 HalAttrib = HalBrain.ChooseSentenceFromFile("aboutMe")
1626 HalAttrib = Replace(HalAttrib, "<MyWordResp>", LCase(MyNoun), 1, -1, vbTextCompare)
1627 HalAttrib = Replace(HalAttrib, "<AdjResp>", LCase(MyAdj), 1, -1, vbTextCompare)
1628 Else
1629 HalAttrib = HalBrain.ChooseSentenceFromFile("aboutYou")
1630 HalAttrib = Replace(HalAttrib, "<YourWordResp>", LCase(MyNoun), 1, -1, vbTextCompare)
1631 HalAttrib = Replace(HalAttrib, "<AdjResp>", LCase(MyAdj), 1, -1, vbTextCompare)
1632 End If
1633 GetResponse = GetResponse & HalAttrib & vbCrLf
1634 End If
1635 End If
1636 HalBrain.DebugWatch GetResponse, "Attributes"
1637
1638 'RESPOND: RESPOND FOR A STATE OF BEING RESPONSE
1639 'If no response had been found, but a state of being response was found earlier, then
1640 'use it now
1641 If HalBeing <> "" And Len(GetResponse) < 4 Then GetResponse = GetResponse & HalBeing & vbCrLf
1642 If UserBeing <> "" And Len(GetResponse) < 4 Then GetResponse = GetResponse & UserBeing & vbCrLf
1643 HalBrain.DebugWatch GetResponse, "Retry State of Beings"
1644
1645 'RESPOND: GIBBERISH DETECTOR
1646 'If no response is found yet and Hal finds more then 5 consonants in a row, Hal will
1647 'assume the user wrote gibberish (ie. asdfghjkl) and respond accordinly.
1648 If Len(GetResponse) < 4 Then
1649 If DetectGibberish(UserSentence) = True Then
1650 GetResponse = HalBrain.ChooseSentenceFromFile("gibberish")
1651 ShortPhrase = ""
1652 End If
1653 End If
1654 HalBrain.DebugWatch GetResponse, "Gibberish"
1655
1656 Rem PLUGIN: PLUGINAREA5
1657
1658If OriginalSentence <> "" Then
1659
1660
1661
1662
1663
1664'The comment above tells Ultra Hal Assistant to insert the following code
1665'on-the-fly into the main brain code in the section referenced.
1666
1667'------------------
1668' Check if the user asked for reorganizing the MP3 table
1669'------------------
1670vrMp3 = False
1671If InStr(UserSentence, " INDEX ") <> 0 And InStr(UserSentence, " MP3 ") <> 0 Then vrMP3 = True
1672
1673If vrMP3 = True Then
1674'------------------
1675' If the MP3 table does not exist, I create it
1676'------------------
1677 HalBrain.ReadOnlyMode = False
1678 vrTableName = "vrMp3"
1679 If HalBrain.CheckTableExistence(vrTableName) = False Then
1680 ' Create table if it doesn't exist
1681 ' It must be of type Brain, to allow partial text search
1682 HalBrain.CreateTable vrTableName, "Brain", "miscData"
1683 Else
1684 ' The 260 parameter is 256 + 4 = Yes/No with Default = No
1685 vrAnswer = MsgBox("Shall I delete the existing index and recreate it from scratch?", 260, "MP3 Reindexing")
1686 If vrAnswer = 6 Then
1687 HalBrain.RunQuery "DELETE FROM " & vrTableName, vrTempQuery
1688 End If
1689 End If
1690'------------------
1691' Ask which is the main MP3 folder
1692'------------------
1693vrMp3Folder = InputBox("Which main folder to you want to reindex?", "MP3 Reindexing", "C:\mp3")
1694'------------------
1695' Read the main MP3 folder
1696'------------------
1697 Set vrFso = CreateObject("Scripting.FileSystemObject")
1698 If vrFso.FolderExists(vrMp3Folder) Then
1699 GetResponse = "I have indexed all the MP3 files in the specified folder and subfolders. "
1700 HalBrain.ReadOnlyMode = False
1701 vrCurrentFolder = vrMp3Folder
1702 Call ReadFolder(vrCurrentFolder, vrMp3Folder)
1703 Else
1704 GetResponse = "The folder " & vrMp3Folder & " does not exist on your computer. "
1705 End If
1706 HalBrain.ReadOnlyMode = True
1707End If
1708
1709'------------------
1710' Check if the user asked for playing a song
1711'------------------
1712vrMp3 = False
1713vrToPlay = ""
1714vrNameToPlay = ""
1715vrToPlay = UCase(HalBrain.SearchPattern(UserSentence, "Play * Media *", 2))
1716If vrToPlay <> "" Then
1717 vrToPlay = " " & vrToPlay & " "
1718 vrToPlay = Replace(vrToPlay," ","xx",1,-1,vbTextCompare)
1719 If HalBrain.CheckTableExistence("vrMp3") = False Then
1720 GetResponse = "I don't find any MP3 index in my brain. "
1721 Else
1722 vrNameToPlay = HalBrain.QABrain(vrToPlay, "vrMp3", 0)
1723 If vrNameToPlay <> "" Then
1724 GetResponse = "Listen to this media; I think it's the one you were talking about. "
1725 'HalCommands = HalCommands & "<RUNPROG>" & vrNameToPlay & "</RUNPROG>"
1726 Set objFSO = CreateObject("Scripting.FileSystemObject")
1727 If objFSO.FileExists(vrNameToPlay) Then
1728 Set objWSHShell = CreateObject("WScript.Shell")
1729 objWSHShell.Run """" & vrNameToPlay & """"
1730 End If
1731 Else
1732 GetResponse = "I'm sorry, it seems that media is not located in the library."
1733 End If
1734 End If
1735 HalBrain.ReadOnlyMode = True
1736End If
1737
1738'------------------
1739' From time to time, Hal will play a song, according to some word you say
1740' For example, you say: "I am going to California"
1741' Hal will play "Hotel California" by Eagles
1742'------------------
1743'------------------
1744' check the current music mood factor
1745'------------------
1746vrMusicMood = HalBrain.TopicSearch("MUSIC", "vrParameter")
1747If vrMusicMood = "" Then vrMusicMood = 0
1748vrMusicMood = CInt(vrMusicMood)
1749vrKeywords = ""
1750
1751If vrMusicMood > 0 Then
1752MediaintHighNumber = 300
1753MediaintLowNumber = 1
1754
1755
1756 Randomize
1757 MediaintNumber = Int((MediaintHighNumber - MediaintLowNumber + 1) * Rnd + MediaintLowNumber)
1758
1759
1760
1761 vrNameToPlay = ""
1762 If vrNameToPlay = "" Then
1763 vrKeywords = WN.FindFirstNoun(UserSentence, True)
1764 vrKeywords = Trim(Ucase(vrKeywords))
1765 If vrKeywords <> "" Then
1766 vrKeywords = " " & vrKeywords & " "
1767 vrKeywords = Replace(vrKeywords,", "," , ",1,-1,vbTextCompare)
1768 vrKeywords = Replace(vrKeywords," ","xx",1,-1,vbTextCompare)
1769 vrKeywordList = Split(vrKeywords, ",")
1770 For i = Lbound(vrKeywordList) To Ubound(vrKeywordList)
1771 vrNameToPlay = HalBrain.QABrain(vrKeywordList(i), "vrMp3", 0)
1772 Exit For
1773 Next
1774 End If
1775 End If
1776
1777 If vrNameToPlay = "" Then
1778 vrKeywords = WN.FindFirstNoun(UserSentence, False)
1779 vrKeywords = Trim(Ucase(vrKeywords))
1780 If vrKeywords <> "" Then
1781 vrKeywords = " " & vrKeywords & " "
1782 vrKeywords = Replace(vrKeywords,", "," , ",1,-1,vbTextCompare)
1783 vrKeywords = Replace(vrKeywords," ","xx",1,-1,vbTextCompare)
1784 vrKeywordList = Split(vrKeywords, ",")
1785 For i = Lbound(vrKeywordList) To Ubound(vrKeywordList)
1786 vrNameToPlay = HalBrain.QABrain(vrKeywordList(i), "vrMp3", 0)
1787 Exit For
1788 Next
1789 End If
1790 End If
1791
1792
1793 If vrNameToPlay = "" Then
1794 vrKeywords = HalBrain.RemoveExtraSpaces(HalBrain.ExtractKeywords(" " & UserSentence & " "))
1795 vrKeywords = Trim(Ucase(vrKeywords))
1796 If vrKeywords <> "" Then
1797 vrKeywords = " " & vrKeywords & " "
1798 vrKeywords = Replace(vrKeywords,", "," , ",1,-1,vbTextCompare)
1799 vrKeywords = Replace(vrKeywords," ","xx",1,-1,vbTextCompare)
1800 vrKeywordList = Split(vrKeywords, ",")
1801 For i = Lbound(vrKeywordList) To Ubound(vrKeywordList)
1802 vrNameToPlay = HalBrain.QABrain(vrKeywordList(i), "vrMp3", 0)
1803 Next
1804 End If
1805 End If
1806
1807 If vrNameToPlay = "" Then
1808 vrKeywords = WN.FindFirstNoun(UserSentence, True)
1809 vrKeywords = Trim(Ucase(vrKeywords))
1810 If vrKeywords <> "" Then
1811 vrKeywords = CurrentSubject
1812 vrKeywords = "xx" & vrKeywords & "xx"
1813 vrKeywords = Replace(vrKeywords,", ","xx,xx",1,-1,vbTextCompare)
1814 vrKeywordList = Split(vrKeywords, ",")
1815 For i = Lbound(vrKeywordList) To Ubound(vrKeywordList)
1816 vrNameToPlay = HalBrain.QABrain(vrKeywordList(i), "vrMp3", 0)
1817 Exit For
1818 Next
1819 End If
1820 End If
1821 If vrNameToPlay <> "" Then
1822
1823 If MediaintNumber < vrMusicMood Then
1824
1825 Set objFSO = CreateObject("Scripting.FileSystemObject")
1826 If objFSO.FileExists(vrNameToPlay) Then
1827 Set objWSHShell = CreateObject("WScript.Shell")
1828 objWSHShell.Run """" & vrNameToPlay & """"
1829 End If
1830
1831
1832
1833 End If
1834
1835 End If
1836 End If
1837End If
1838
1839
1840
1841
1842 'The preceding comment is actually a plug-in directive for
1843 'the Ultra Hal host application. It allows for code snippets
1844 'to be inserted here on-the-fly based on user configuration.
1845
1846 'RESPOND: USER MENTIONING ORGANIZATIONAL CHALLENGES
1847 'Everybody spouts TLA's, or 'Three Letter Acronyms,' in today's business world. Hal can self-generate
1848 'several MILLION different phrases in response to the user mentioning a corporation or a firm.
1849 If Rnd * 10 < 5 And HalBrain.TopicSearch(UserSentence, "businessDetect1") = "True" And HalBrain.TopicSearch(PrevUserSent, "businessDetect2") <> "True" Then
1850 TLA = HalBrain.ChooseSentenceFromFile("TLA1") & " " & HalBrain.ChooseSentenceFromFile("TLA2") & " " & HalBrain.ChooseSentenceFromFile("TLA3")
1851 If Rnd * 10 < 5 Then
1852 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("bizTalk")
1853 Else
1854 GetResponse = HalBrain.ChooseSentenceFromFile("bizTalk")
1855 End If
1856 GetResponse = Replace(GetResponse, "<TLA>", TLA, 1, -1, vbTextCompare)
1857 End If
1858 HalBrain.DebugWatch GetResponse, "Business Talk"
1859
1860 'RESPOND: USER EXPRESSES AN INTENTION
1861 'This routine detects common expressions of motive from the user,
1862 'and allows Hal to react to the statement, or offer encouragement.
1863 IntentPhrase = HalBrain.PatternDB(UserSentence, "intentDetector")
1864 If Len(IntentPhrase) > 2 And Len(IntentPhrase) < 60 And RND * 100 < 50 Then
1865 If Rnd * 10 < 6 Then IntroExclaim = " " & HalBrain.ChooseSentenceFromFile("introExclaim1") & " "
1866 If Rnd * 10 < 6 Then Encourager = " " & HalBrain.ChooseSentenceFromFile("encourager1") & " "
1867 If Rnd * 10 < 6 Then SuffixComment = " " & HalBrain.ChooseSentenceFromFile("suffixComment1") & " "
1868 If Rnd * 10 < 7 Then
1869 GetResponse = GetResponse & " " & HalBrain.ChooseSentenceFromFile("intentResponse")
1870 Else
1871 GetResponse = HalBrain.ChooseSentenceFromFile("intentResponse")
1872 End If
1873 GetResponse = Replace(GetResponse, "<IntroExclaim>", IntroExclaim, 1, -1, vbTextCompare)
1874 GetResponse = Replace(GetResponse, "<Encourager>", Encourager, 1, -1, vbTextCompare)
1875 GetResponse = Replace(GetResponse, "<IntentPhrase>", IntentPhrase, 1, -1, vbTextCompare)
1876 GetResponse = Replace(GetResponse, "<SuffixComment>", SuffixComment, 1, -1, vbTextCompare)
1877 End If
1878 HalBrain.DebugWatch GetResponse, "Intention"
1879
1880 'RESPOND: USER EXPRESSES AN EXPLANATION
1881 'This routine detects common expressions of reasons from the user,
1882 'and allows Hal to react to the explanation.
1883 ExplainPhrase = HalBrain.PatternDB(UserSentence, "reasonDetector")
1884 If Len(ExplainPhrase) > 2 And Len(ExplainPhrase) < 60 Then
1885 If Rnd * 100 < 75 Then IntroExclaim = HalBrain.ChooseSentenceFromFile("introExclaim4")
1886 Enlightener = HalBrain.ChooseSentenceFromFile("enlightener")
1887 If Rnd * 100 < 66 Then SuffixComment = HalBrain.ChooseSentenceFromFile("suffixComment4")
1888 SpinWheel = HalBrain.RandomNum(6)
1889 If SpinWheel = 1 Then ExplainResponse = " " & " <UserName> " & IntroExclaim & Enlightener & ExplainPhrase & SuffixComment & " "
1890 If SpinWheel = 2 Then ExplainResponse = " " & IntroExclaim & " <UserName> " & Enlightener & ExplainPhrase & SuffixComment & " "
1891 If SpinWheel = 3 Then ExplainResponse = " " & IntroExclaim & Enlightener & ExplainPhrase & " <UserName> " & SuffixComment & " "
1892 If SpinWheel = 4 Then ExplainResponse = " " & IntroExclaim & Enlightener & ExplainPhrase & SuffixComment & " <UserName> " & " "
1893 If SpinWheel >= 5 Then ExplainResponse = " " & IntroExclaim & Enlightener & ExplainPhrase & SuffixComment & " "
1894 If Rnd * 10 < 5 Then GetResponse = ExplainResponse & " . " & GetResponse Else GetResponse = ExplainResponse
1895 End If
1896 HalBrain.DebugWatch GetResponse, "Explanation"
1897
1898 'RESPOND: YES OR NO RESPONSES
1899 'Respond to simple yes and no statements by the user.
1900 GetResponse = HalBrain.HalFormat(GetResponse)
1901 If Len(GetResponse) < 4 And Len(Trim(UserSentence)) < 16 Then CheckYesNo = True
1902 If CheckYesNo = True Then
1903 UserText = Trim(HalBrain.ExtractKeywords(UserSentence))
1904 If Len(UserText) < 15 Then
1905 YesNoDetect = HalBrain.TopicSearch(UserText, "yesNoDetect")
1906 If YesNoDetect = "Yes" Then
1907 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("yesResponses") & "<LOWQUALITY>"
1908 ElseIf YesNoDetect = "No" Then
1909 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("noResponses") & "<LOWQUALITY>"
1910 End If
1911 End If
1912 End If
1913 HalBrain.DebugWatch GetResponse, "Yes or No Response"
1914
1915 'PROCESS: SETUP RESPONSE ARRAY
1916 'If no response is found yet, than we have many functions that are capable of producing a
1917 'response, but no function is particulary better than another. So we will get a response
1918 'from all the functions capable of producing one and put the responses into an array and
1919 'randomly choose one.
1920 Dim ResponseList()
1921 Dim ResponseCount
1922 ResponseCount = 0
1923 TempParent = HalBrain.AddDebug("Debug", "Low Quality Response Routines")
1924
1925 Rem PLUGIN: LOWQUALITYRESPONSES
1926 'The preceding comment is actually a plug-in directive for
1927 'the Ultra Hal host application. It allows for code snippets
1928 'to be inserted here on-the-fly based on user configuration.
1929
1930 'RESPOND: USER ASKING WHO, WHAT, WHEN, WHERE, HOW, WHY, BUT HAL DOESN'T KNOW ANSWER
1931 If Len(GetResponse) < 4 Then
1932 If InStr(OriginalSentence, "?") > 0 Then QuesQual = True
1933 If InStr(1, OriginalSentence, "explain", vbTextCompare) > 0 Then QuesQual = True
1934 If InStr(1, OriginalSentence, " tell ", vbTextCompare) > 0 Then QuesQual = True
1935 If InStr(1, OriginalSentence, "answer", vbTextCompare) > 0 Then QuesQual = True
1936 If InStr(1, OriginalSentence, "question", vbTextCompare) > 0 Then QuesQual = True
1937 If InStr(1, OriginalSentence, " know ", vbTextCompare) > 0 Then QuesQual = True
1938 If InStr(1, OriginalSentence, "remember", vbTextCompare) > 0 Then QuesQual = True
1939 If InStr(UserSentence, " WHO ") > 0 Then QuesWord = "Who"
1940 If InStr(UserSentence, "WHO'") > 0 Then QuesWord = "Who"
1941 If InStr(UserSentence, " WHAT ") > 0 Then QuesWord = "What"
1942 If InStr(UserSentence, "WHAT'") > 0 Then QuesWord = "What"
1943 If InStr(UserSentence, " WHEN ") > 0 Then QuesWord = "When"
1944 If InStr(UserSentence, "WHEN'") > 0 Then QuesWord = "When"
1945 If InStr(UserSentence, " WHERE ") > 0 Then QuesWord = "Where"
1946 If InStr(UserSentence, "WHERE'") > 0 Then QuesWord = "Where"
1947 If InStr(UserSentence, " HOW ") > 0 Then QuesWord = "How"
1948 If InStr(UserSentence, "HOW'") > 0 Then QuesWord = "How"
1949 If InStr(UserSentence, " WHY ") > 0 Then QuesWord = "Why"
1950 If InStr(UserSentence, "WHY'") > 0 Then QuesWord = "Why"
1951 If Len(QuesWord) > 1 And QuesQual = True Then
1952 If Len(UserSentence) < 70 Then SentenceBack = UserSentence & " ? "
1953 DontKnow = HalBrain.ChooseSentenceFromFile("dontKnow")
1954 DontKnow = Replace(DontKnow, "<SentenceBack>", SentenceBack, 1, -1, vbTextCompare)
1955 DontKnow = Replace(DontKnow, "<QuesWord>", QuesWord, 1, -1, vbTextCompare)
1956 ResponseCount = ResponseCount + 1
1957 Redim Preserve ResponseList(ResponseCount)
1958 ResponseList(ResponseCount) = DontKnow
1959 HalBrain.AddDebug TempParent, "DontKnow: " & ResponseList(ResponseCount)
1960 SkipOpinion = True
1961 End If
1962 End If
1963
1964 'PROCESS: CONSTRUCT A RESPONSE TO A SUBJECT
1965 'Here we help Hal make some "smalltalk" using keywords preserved on CurrentSubject,
1966 'plus recognition of other keywords. If Hal finds any of the listed keywords anywhere in
1967 'the user's sentence, those keywords override and replace whatever was in CurrentSubject.
1968 'Hal uses the CurrentSubject keyword(s) or any of the keywords in the smalltalk.brn file,
1969 'if found in the user's sentence, to make a little smalltalk. You can easily add more
1970 'keywords for Hal to recognize and make smalltalk.
1971 GetResponse = HalBrain.HalFormat(GetResponse)
1972 If Len(GetResponse) < 4 And Rnd * 100 < 50 Then
1973 SmalltalkSearch = Trim(HalBrain.TopicSearch(UserSentence, "smallTalk"))
1974 If SmalltalkSearch <> "" Then
1975 SmallTalk = SmalltalkSearch
1976 ElseIf Len(CurrentSubject) > 3 Then
1977 SmallTalk = Trim(CurrentSubject)
1978 'try making word plural by adding "s" and seeing if it exists
1979 If WN.LookupWord(SmallTalk & "s") = True Then
1980 SmallTalk = SmallTalk & "s"
1981 ElseIf WN.LookupWord(SmallTalk & "es") = True Then
1982 SmallTalk = SmallTalk & "es"
1983 End If
1984 End If
1985 If Len(SmallTalk) > 3 Then
1986 ResponseCount = ResponseCount + 1
1987 Redim Preserve ResponseList(ResponseCount)
1988 ResponseList(ResponseCount) = Replace(HalBrain.ChooseSentenceFromFile("smallTalkSent"), "<SmallTalk>", SmallTalk, 1, -1, 1)
1989 HalBrain.AddDebug TempParent, "SmallTalk: " & ResponseList(ResponseCount)
1990 End If
1991 End If
1992
1993 'RESPOND: PARAPHRASE USER IF POSSIBLE
1994 'If no response is found yet, and a paraphrase has been created but not used in a
1995 'previous section, use it now.
1996 GetResponse = HalBrain.HalFormat(GetResponse)
1997 If Len(GetResponse) < 4 And Len(Paraphrase) > 4 Then
1998 ResponseCount = ResponseCount + 1
1999 Redim Preserve ResponseList(ResponseCount)
2000 ResponseList(ResponseCount) = Paraphrase
2001 HalBrain.AddDebug TempParent, "Paraphrase: " & ResponseList(ResponseCount)
2002 End If
2003
2004 'RESPOND: PHRASE MAKER COMMENT AND QUESTION GENERATOR
2005 'If no response is found yet, try an auxiliary keyword file that generates questions
2006 'from phrases from the user's current sentence.
2007 GetResponse = HalBrain.HalFormat(GetResponse)
2008 If Len(GetResponse) < 4 Then
2009 KeyBrain = HalBrain.PatternDB("X " & HalBrain.RemoveExtraSpaces(UserSentence), "phraseDetector")
2010 If Len(KeyBrain) > 1 And Len(KeyBrain) < 60 Then
2011 ResponseCount = ResponseCount + 1
2012 Redim Preserve ResponseList(ResponseCount)
2013 ResponseList(ResponseCount) = Replace(HalBrain.ChooseSentenceFromFile("phraseRepeater"), "<KeyBrain>", KeyBrain, 1, -1, vbTextCompare)
2014 HalBrain.AddDebug TempParent, "PhraseRepeater: " & ResponseList(ResponseCount)
2015 End If
2016 End If
2017
2018 'RESPOND: Use the highest relevance response from the database functions
2019 GetResponse = HalBrain.HalFormat(GetResponse)
2020 If (Len(GetResponse) < 4 And (HighestRel > 6 And HighestRelResponse <> "")) Then
2021 ResponseCount = ResponseCount + 2
2022 Redim Preserve ResponseList(ResponseCount)
2023 ResponseList(ResponseCount - 1) = HighestRelResponse
2024 ResponseList(ResponseCount) = HighestRelResponse
2025 HalBrain.AddDebug TempParent, "Highest Rel: " & ResponseList(ResponseCount)
2026 End If
2027
2028 'RESPOND: WORDNET MERONYM AND HYPERNYM RESPONSES
2029 'This function finds the first definite noun in a sentence and comes up with responses
2030 'based on the word's meronyms (parts of), hypernyms (is part of), and sisters (similar things).
2031 If (Len(GetResponse) < 4 And Rnd * 100 < 65) And Len(UserSentence) > 15 Then
2032 subject = WN.FindFirstNoun(UserSentence, True)
2033 If subject <> "" And WN.LookupWord(subject) = True Then
2034 If Rnd * 100 < 55 Then 'If we have a meronym, lets use it creatively in a random sentence
2035 Meronym = WN.ChooseRandomWord(WN.GetMeronyms(1)) 'Meronym means "has parts" or "has members"
2036 If Meronym <> "" Then
2037 WNResponse = HalBrain.ChooseSentenceFromFile("meronyms")
2038 WNResponse = Replace(WNResponse, "<BaseNoun>", WN.GetBase("NOUN"), 1, -1, vbTextCompare)
2039 WNResponse = Replace(WNResponse, "<Meronym>", Meronym, 1, -1, vbTextCompare)
2040 If Len(GetResponse) < 4 And Len(WNResponse) > 4 Then
2041 ResponseCount = ResponseCount + 1
2042 Redim Preserve ResponseList(ResponseCount)
2043 ResponseList(ResponseCount) = WNResponse & vbCrLf
2044 HalBrain.AddDebug TempParent, "Meronym: " & ResponseList(ResponseCount)
2045 End If
2046 End If
2047 Else
2048 Hypernym = WN.ChooseRandomWord(WN.GetHypernyms("NOUN", 1, 1)) 'Hypernym means "is a part of" or "is a member of"
2049 Sister = WN.ChooseRandomWord(WN.GetSisters("NOUN", 1)) 'Related nouns
2050 If Sister <> "" And Hypernym <> "" Then 'If we have sister terms and hypernyms, lets use it creatively
2051 WNResponse = HalBrain.ChooseSentenceFromFile("hypernyms")
2052 WNResponse = Replace(WNResponse, "<BaseNoun>", WN.GetBase("NOUN"), 1, -1, vbTextCompare)
2053 WNResponse = Replace(WNResponse, "<Hypernym>", Hypernym, 1, -1, vbTextCompare)
2054 WNResponse = Replace(WNResponse, "<Sister>", Sister, 1, -1, vbTextCompare)
2055 If Len(GetResponse) < 4 And Len(WNResponse) > 4 Then
2056 ResponseCount = ResponseCount + 1
2057 Redim Preserve ResponseList(ResponseCount)
2058 ResponseList(ResponseCount) = WNResponse & vbCrLf
2059 HalBrain.AddDebug TempParent, "Hypernym: " & ResponseList(ResponseCount)
2060 End If
2061 End If
2062 End If
2063 End If
2064 End If
2065
2066 'RESPOND: STRIKING SIMILES
2067 'If the user mentions a noun that is in a table of nouns with similes, Hal will
2068 'say the simile phrase
2069 GetResponse = HalBrain.HalFormat(GetResponse)
2070 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
2071 Dim SimList() 'We must declare an empty array to store query results in
2072 If HalBrain.RunQuery("SELECT searchString, topic FROM strikingSimiles WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0", SimList) = True Then
2073 SpinWheel = HalBrain.RandomNum(Ubound(SimList)) 'Pick a random result if there is more than 1
2074 Simile = Trim(SimList(SpinWheel, 1)) 'Column 1 contains "topic", which is the simile
2075 If Len(Simile) > 5 Then
2076 ResponseCount = ResponseCount + 1
2077 Redim Preserve ResponseList(ResponseCount)
2078 ResponseList(ResponseCount) = Simile & ". "
2079 HalBrain.AddDebug TempParent, "Striking Simile: " & ResponseList(ResponseCount)
2080 End If
2081 End If
2082 End If
2083
2084 'RESPOND: MISC PHRASES
2085 'If the user mentions a noun that is in a table of nouns as part of misc sentence
2086 'fragments, Hal will say the fragment followed by an ellipsis
2087 GetResponse = HalBrain.HalFormat(GetResponse)
2088 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
2089 Dim PhraseList() 'We must declare an empty array to store query results in
2090 If HalBrain.RunQuery("SELECT searchString, topic FROM miscPhrases WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0", PhraseList) = True Then
2091 SpinWheel = HalBrain.RandomNum(Ubound(PhraseList)) 'Pick a random result if there is more than 1
2092 MiscPhrase = Trim(PhraseList(SpinWheel, 1)) 'Column 1 contains "topic", which is the phrase
2093 If Len(MiscPhrase) > 5 Then
2094 ResponseCount = ResponseCount + 1
2095 Redim Preserve ResponseList(ResponseCount)
2096 ResponseList(ResponseCount) = MiscPhrase & "<ellipsis>"
2097 HalBrain.AddDebug TempParent, "MiscPhrase: " & ResponseList(ResponseCount)
2098 End If
2099 End If
2100 End If
2101
2102 'RESPOND: ADJECTIVE NOUN QUESTION
2103 'If the user mentions a noun that is in a table of nouns, Hal will
2104 'try describing the noun with an adjective in the form of a question.
2105 GetResponse = HalBrain.HalFormat(GetResponse)
2106 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
2107 Dim ANList() 'We must declare an empty array to store query results in
2108 If HalBrain.RunQuery("SELECT searchString, topic FROM AdjNoun WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0", ANList) = True Then
2109 MentionedNoun = Trim(ANList(1, 0)) 'Row 1 contains our query result. Column 0 contains "searchString", which is the noun
2110 SpinWheel = HalBrain.RandomNum(Ubound(ANList)) 'Pick a random result if there is more than 1
2111 AssocAdj = Trim(ANList(SpinWheel, 1)) 'Column 1 contains "topic", which is the adjective
2112 If Len(MentionedNoun) < 5 Then MentionedNoun = " " & MentionedNoun & " "
2113 If Instr(1, " " & UserSentence & " ", MentionedNoun, vbTextCompare) > 0 And Instr(1, UserSentence, AssocAdj, vbTextCompare) = 0 Then
2114 ResponseCount = ResponseCount + 1
2115 Redim Preserve ResponseList(ResponseCount)
2116 SpinWheel = HalBrain.RandomNum(5)
2117 If SpinWheel = 1 Then ResponseList(ResponseCount) = "<UserName>, " & AssocAdj & " " & MentionedNoun & "?"
2118 If SpinWheel = 2 Then ResponseList(ResponseCount) = AssocAdj & " " & MentionedNoun & ", <UserName>?"
2119 If SpinWheel > 2 Then ResponseList(ResponseCount) = AssocAdj & " " & MentionedNoun & "?"
2120 HalBrain.AddDebug TempParent, "Adj/Noun Question: " & ResponseList(ResponseCount)
2121 End If
2122 End If
2123 End If
2124
2125 'RESPOND: VERB PREPOSITION NOUN QUESTION
2126 'If the user mentions a noun that is in a table of nouns, Hal will
2127 'ask a question about the noun using a related verb and preposition
2128 GetResponse = HalBrain.HalFormat(GetResponse)
2129 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
2130 Dim VPNList() 'We must declare an empty array to store query results in
2131 If HalBrain.RunQuery("SELECT searchString, topic FROM VerbPrepNoun WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0", VPNList) = True Then
2132 MentionedNoun = Trim(VPNList(1, 0)) 'Row 1 contains our query result. Column 0 contains "searchString", which is the noun
2133 SpinWheel = HalBrain.RandomNum(Ubound(VPNList)) 'Pick a random result if there is more than 1
2134 AssocVerbPrep = Trim(VPNList(SpinWheel, 1)) 'Column 1 contains "topic", which is the verb and preposition
2135 If Len(MentionedNoun) < 5 Then MentionedNoun = " " & MentionedNoun & " "
2136 If Instr(1, " " & UserSentence & " ", MentionedNoun, vbTextCompare) > 0 And Instr(1, UserSentence, AssocVerbPrep, vbTextCompare) = 0 Then
2137 ResponseCount = ResponseCount + 1
2138 Redim Preserve ResponseList(ResponseCount)
2139 SpinWheel = HalBrain.RandomNum(5)
2140 If SpinWheel = 1 Then ResponseList(ResponseCount) = "<UserName>, " & AssocVerbPrep & " " & MentionedNoun & "?"
2141 If SpinWheel = 2 Then ResponseList(ResponseCount) = AssocVerbPrep & " " & MentionedNoun & ", <UserName>?"
2142 If SpinWheel > 2 Then ResponseList(ResponseCount) = AssocVerbPrep & " " & MentionedNoun & "?"
2143 HalBrain.AddDebug TempParent, "Verb/Preposition/Noun Question: " & ResponseList(ResponseCount)
2144 End If
2145 End If
2146 End If
2147
2148 'RESPOND: USE CURRENT SENTENCE
2149 'If no Response is found yet, try to use the user's words in his or her own sentence.
2150 'Results are also stored in the default user keyword brain file for compatibility
2151 'with other brain plug-ins.
2152 GetResponse = HalBrain.HalFormat(GetResponse)
2153 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
2154 CheatResp = HalBrain.CheatResponse(HalBrain.SwitchPerson(HalBrain.AlphaNumericalOnly((OriginalSentence))))
2155 CheatResp = Left(CheatResp, InStr(1, CheatResp, "<STOREVARS>", 1) - 1)
2156 If Len(CheatResp) > 4 Then
2157 ResponseCount = ResponseCount + 1
2158 Redim Preserve ResponseList(ResponseCount)
2159 SpinWheel = HalBrain.RandomNum(9)
2160 If SpinWheel = 1 Then ResponseList(ResponseCount) = " So, " & CheatResp & vbCrLf
2161 If SpinWheel = 2 Then ResponseList(ResponseCount) = " Really, " & CheatResp & vbCrLf
2162 If SpinWheel = 3 Then ResponseList(ResponseCount) = " Oh <UserName>, " & CheatResp & vbCrLf
2163 If SpinWheel = 4 Then ResponseList(ResponseCount) = " Let me think; " & CheatResp & " ; what do you think <UserName>? " & vbCrLf
2164 If SpinWheel > 5 Then ResponseList(ResponseCount) = CheatResp & vbCrLf
2165 HalBrain.AddDebug TempParent, "Cheat Response: " & ResponseList(ResponseCount)
2166 End If
2167 End If
2168
2169 'RESPOND: PICK OUT OF AVAILABLE LOW QUALITY RESPONSES
2170 'If no response is found yet, than we have many functions from above that may have produced
2171 'a response, but no function is particulary better than another. So we will now pick a
2172 'responses from an array randomly choosen.
2173 GetResponse = HalBrain.HalFormat(GetResponse)
2174 If (Len(GetResponse) < 4 And ResponseCount > 0) Then
2175 SpinWheel = HalBrain.RandomNum(ResponseCount)
2176 GetResponse = ResponseList(SpinWheel) & "<LOWQUALITY>"
2177 End If
2178 HalBrain.DebugWatch GetResponse, "Randomly pick a low-quality response"
2179
2180 'RESPOND: User asks a general opinion question.
2181 If HalBrain.TopicSearch(UserSentence, "opinionDetect") = "True" Then GenOpinion = True
2182 'Note that the following string matches must occur at the sentence beginning only:
2183 If Rnd * 100 > 50 Then
2184 If Left(Trim(UCase(OriginalSentence)), 4) = "WHY " Then GenOpinion = True
2185 If Left(Trim(UCase(OriginalSentence)), 5) = "WHAT " Then GenOpinion = True
2186 If Left(Trim(UCase(OriginalSentence)), 5) = "WHEN " Then GenOpinion = True
2187 If Left(Trim(UCase(OriginalSentence)), 4) = "HOW " Then GenOpinion = True
2188 If Left(Trim(UCase(OriginalSentence)), 4) = "WHO " Then GenOpinion = True
2189 If Left(Trim(UCase(OriginalSentence)), 6) = "WHERE " Then GenOpinion = True
2190 End If
2191 If GenOpinion = True And SkipOpinion = False Then
2192 If Rnd * 100 > 45 Then RepeatQuest = UserSentence & " ? "
2193 If Rnd * 100 > 50 Then PreAmble = HalBrain.ChooseSentenceFromFile("preamble")
2194 Recommend = HalBrain.ChooseSentenceFromFile("recommend")
2195 GetResponse = RepeatQuest & " " & PreAmble & " " & Recommend & GetResponse
2196 End If
2197 HalBrain.DebugWatch GetResponse, "General Opinion"
2198
2199 'RESPOND: CHANGE TOPIC
2200 'If a different procedure has requested that the topic be changed
2201 'Hal will do so now
2202 GetResponse = Replace(GetResponse, "<ChangeSubject>", newTopic, 1, -1, vbTextCompare)
2203 GetResponse = Replace(GetResponse, "<ChangeTopic>", newTopic, 1, -1, vbTextCompare)
2204 GetResponse = Replace(GetResponse, "<NewTopic>", newTopic, 1, -1, vbTextCompare)
2205 HalBrain.DebugWatch GetResponse, "Change Topic"
2206
2207 Rem PLUGIN: PLUGINAREA6
2208 'The preceding comment is actually a plug-in directive for
2209 'the Ultra Hal host application. It allows for code snippets
2210 'to be inserted here on-the-fly based on user configuration.
2211
2212 'RESPOND: MAKE UP SOMETHING TO SAY
2213 'If we have got to this point and we still don't have anything to say, then
2214 'we will use 1 of 5 functions to make something up to say.
2215 GetResponse = Trim(GetResponse)
2216 If Len(GetResponse) < 4 Then
2217 SpinWheel = HalBrain.RandomNum(6)
2218 If SpinWheel < 4 Then
2219 'RESPOND: CONVERSATIONAL PHRASE
2220 'Choose a random phrase designed to keep the conversation going no matter what the user said
2221 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("conversationalPhrases")
2222 ElseIf SpinWheel = 4 Then
2223 'RESPOND: CHANGE TOPIC
2224 If Rnd * 10 < 4 Then GetResponse = HalBrain.ChooseSentenceFromFile("topicIntro")
2225 GetResponse = GetResponse & newTopic
2226 Else
2227 'RESPOND: USE RANDOM QUESTION COLLECTED FROM USER
2228 'Randomly select a question once posed by the user in order to find something to say.
2229 'If the user answers the question, then Hal will know that answer in the future.
2230 If Rnd * 10 < 3 Then GetResponse = HalBrain.ChooseSentenceFromFile("topicIntro")
2231 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("sharedQuestions")
2232 End If
2233 GetResponse = GetResponse & "<LOWQUALITY>"
2234 End If
2235 HalBrain.DebugWatch GetResponse, "Make up something"
2236
2237 'PROCESS: RECORD TIME
2238 'Record the current time, so Hal knows the time in between sentences.
2239 LastResponseTime = Now
2240
2241 'PROCESS: FIGURE OUT CONTINUITY
2242 'If the user seems to be continuing a line of thought
2243 'from something Hal just said, note this.
2244 If Len(Trim(PrevSent)) > 2 And (HalBrain.TopicSearch(UserSentence, "responding") = "True" Or InStr(OriginalSentence, "!") Or InStr(PrevSent, "?")) Then TopicContinuity = True
2245
2246 'PROCESS: FIGURE OUT PERSONAL DATA
2247 If InStr(UserSentence, "WHAT IS") = 0 And InStr(UserSentence, " YOU ") = 0 And InStr(UserSentence, " YOU'") = 0 And InStr(UserSentence, " YOUR") = 0 And InStr(UserSentence, " WE ") = 0 And InStr(UserSentence, " US ") = 0 And InStr(UserSentence, " OUR ") = 0 And InStr(UserSentence, " I ") = 0 And InStr(UserSentence, " ME ") = 0 And InStr(UserSentence, " MY ") = 0 And InStr(UserSentence, " MINE ") = 0 And InStr(UserSentence, " MYSELF ") = 0 And InStr(UserSentence, " I'") = 0 Then
2248 PersonalData = False
2249 Else
2250 PersonalData = True
2251 End If
2252
2253 'PROCESS: RESTORE PUNTUATION FOR LEARNING
2254 'Now we establish a special sentence on which we can restore ordinary capitalization:
2255 AnswerSent = UserSentence
2256 AnswerSent = Trim(HalBrain.FixCaps(AnswerSent))
2257 If Right(AnswerSent, 1) = "." Then AnswerSent = Left(AnswerSent, Len(AnswerSent) - 1)
2258 'Now we add in our spaces and restore ending punctuation to match the user's original sentence:
2259 If InStr(OriginalSentence, "!") > 0 And InStr(AnswerSent, "!") = 0 Then
2260 AnswerSent = AnswerSent & "!"
2261 ElseIf InStr(OriginalSentence, "?") > 0 And InStr(AnswerSent, "?") = 0 Then
2262 AnswerSent = AnswerSent & "?"
2263 Else
2264 AnswerSent = AnswerSent & "."
2265 End If
2266 'If there were no pronoun reversals required in the sentence,
2267 'we can recover directly from the original sentence:
2268 If InStr(UserSentence, " ME") = 0 And InStr(UserSentence, "YOU") = 0 And InStr(UserSentence, "MY ") = 0 And InStr(UserSentence, "YOUR ") = 0 And InStr(UserSentence, "I ") = 0 And InStr(UserSentence, "MINE") = 0 And InStr(UserSentence, "YOURS") = 0 And InStr(UserSentence, "MYSELF") = 0 And InStr(UserSentence, "YOURSELF") = 0 Then AnswerSent = Trim(OriginalSentence)
2269
2270 'PROCESS: NOTE IF QUESTION
2271 'See if the user's sentence is a question or not and note this
2272 'for use by other functions
2273 If InStr(1, OriginalSentence, "?", vbTextCompare) > 0 Then IsQuestion = True
2274 If InStr(1, OriginalSentence, "Who ", vbTextCompare) > 0 Then IsQuestion = True
2275 If InStr(1, OriginalSentence, "What ", vbTextCompare) > 0 Then IsQuestion = True
2276 If InStr(1, OriginalSentence, "When ", vbTextCompare) > 0 Then IsQuestion = True
2277 If InStr(1, OriginalSentence, "Where ", vbTextCompare) > 0 Then IsQuestion = True
2278 If InStr(1, OriginalSentence, "Why ", vbTextCompare) > 0 Then IsQuestion = True
2279 If InStr(1, OriginalSentence, "How ", vbTextCompare) > 0 Then IsQuestion = True
2280 If InStr(1, OriginalSentence, ".", vbTextCompare) > 0 Then IsQuestion = False
2281 If InStr(1, OriginalSentence, "!", vbTextCompare) > 0 Then IsQuestion = False
2282 If InStr(1, OriginalSentence, " am I ", vbTextCompare) > 0 Then IsQuestion = False
2283
2284 'SAVE: EPHEMERAL KNOWLEDGE
2285 'Some Hal's learned knowledge should be temporary because it is ephemeral in nature.
2286 'Knowledge about weather, season, temperature, etc. are temporary knowledge
2287 'that shouldn't be stored in Hal's permanent brain files. Ephemeral knowledge is
2288 'detected and saved in a temporary table. The temporary table only stores 10
2289 'entries in it at a time.
2290 If HalBrain.TopicSearch(UserSentence, "ephemeralDetect") = "True" Then
2291 If HalBrain.CheckTableExistence(Trim(LCase(UserName)) & "_TempSent") = False Then
2292 'Create table for this user if it doesn't exist
2293 HalBrain.CreateTable Trim(LCase(UserName)) & "_TempSent", "Brain", "autoLearningBrain"
2294 End If
2295 If TopicContinuity = True Then HalBrain.AddToTable Trim(LCase(UserName)) & "_TempSent", "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2296 HalBrain.AddToTable Trim(LCase(UserName)) & "_TempSent", "Brain", Trim(UserSentence), AnswerSent
2297 HalBrain.LimitSize Trim(LCase(UserName)) & "_TempSent", 10
2298 HalBrain.ReadOnlyMode = True 'Block additional file saves when ephemeral knowledge is detected
2299 End If
2300
2301 'SAVE: LEARN AUTO TOPIC FOCUS PEOPLE SENTENCES
2302 'Learns info about people with recognized names
2303 If HalBrain.ReadOnlyMode = False And HalGreeting = "" And IsQuestion = False And MentionedName <> "" And Trim(UCase(NewName)) <> Trim(UCase(MentionedName)) And WN.LookupWord(MentionedName) = False Then
2304 If HalBrain.CheckTableExistence("_" & Trim(LCase(MentionedName))) = False Then
2305 'Create table for this person if it doesn't exist
2306 HalBrain.CreateTable "_" & Trim(LCase(MentionedName)), "Brain", "autoLearningBrain"
2307 HalBrain.AddToTable "topicRelationships", "TopicSearch", Trim(MentionedName), Trim(LCase(MentionedName))
2308 End If
2309 'Store user response in this table
2310 If TopicContinuity = True Then HalBrain.AddToTable "_" & Trim(LCase(MentionedName)), "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2311 HalBrain.AddToTable "_" & Trim(LCase(MentionedName)), "Brain", Trim(UserSentence), AnswerSent
2312 End If
2313
2314 'SAVE: AUTO TOPIC FOCUS LEARNING
2315 If HalBrain.ReadOnlyMode = False And HalGreeting = "" And PersonalData = False And HalBrain.CountInstances(" ", Trim(UserSentence)) > 2 And IsQuestion = False Then
2316 Keywords = HalBrain.TopicSearch(UserSentence, "topicRelationships") & " " & CurrentSubject & " " & UserSentence
2317 Keywords = Trim(HalBrain.RemoveExtraSpaces(HalBrain.ExtractKeywords(" " & Keywords & " ")))
2318 If Len(Keywords) > 3 Then
2319 KeywordList = Split(Keywords, " ")
2320 TopicList = ""
2321 'Create list of tables that exist for each keyword
2322 For i = LBound(KeywordList) To UBound(KeywordList)
2323 TopicTable = HalBrain.TopicSearch(" " & KeywordList(i) & " ", "topicRelationships")
2324 If TopicTable <> "" And InStr(1, " " & TopicList, " " & Trim(TopicTable) & " ", vbTextCompare) = 0 Then
2325 'Topic already exists, make note of it
2326 TopicList = TopicList & TopicTable & " "
2327 ElseIf TopicTable = "" And Len(KeywordList(i)) > 2 Then
2328 If Asc(Left(KeywordList(i),1)) > 47 And Asc(Left(KeywordList(i),1)) < 58 Or HalBrain.Word2Num(KeywordList(i)) <> "X" Then IsNumber = True Else IsNumber = False
2329 If WN.LookupWord(KeywordList(i)) = True And WN.GuessPartOfSpeech() = "NOUN" And IsNumber = False Then
2330 If HalBrain.CheckTableExistence("_" & Trim(Lcase(WN.GetBase(WN.GuessPartOfSpeech)))) = False Then
2331 'Topic does not exist, but can and will be created
2332 TopicList = TopicList & KeywordList(i) & " "
2333 HalBrain.CreateTable "_" & Trim(Lcase(KeywordList(i))), "Brain", "autoLearningBrain"
2334 HalBrain.AddToTable "topicRelationships", "TopicSearch", " " & Trim(KeywordList(i)) & " ", Trim(Lcase(KeywordList(i)))
2335 'Relationships based on wordnet synonyms are recorded
2336 Relationships = WN.GetDefinition("NOUN", 1, "S") & "," & WN.GetSynonyms("NOUN", 1)
2337 Relationships = Replace(Relationships, ", ", ",")
2338 Relationships = Trim(Replace(Relationships, ",,", ","))
2339 If Right(Relationships, 1) = "," Then Relationships = Trim(Left(Relationships, Len(Relationships) - 1))
2340 If Len(Relationships) > 1 Then
2341 If Left(Relationships, 1) = "," Then Relationships = Right(Relationships, Len(Relationships) - 1)
2342 RelList = Split(Relationships, ",")
2343 For h = Lbound(RelList) To Ubound(RelList)
2344 If HalBrain.TopicSearch(" " & RelList(h) & " ", "topicRelationships") = "" Then
2345 HalBrain.AddToTable "topicRelationships", "TopicSearch", " " & Trim(RelList(h)) & " ", Trim(Lcase(KeywordList(i)))
2346 End If
2347 Next
2348 End If
2349 End If
2350 End If
2351 End If
2352 Next
2353 'User's sentence is recorded in all related topic tables
2354 TopicList = HalBrain.RemoveExtraSpaces(TopicList)
2355 If TopicList <> "" And Len(AnswerSent) > 3 Then
2356 AlreadyLearned = True
2357 TableList = Split(TopicList, " ")
2358 For i = LBound(TableList) To UBound(TableList)
2359 If TopicContinuity = True And Len(PrevSent) > 3 Then HalBrain.AddToTable "_" & Trim(Lcase(TableList(i))), "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2360 If Len(UserSentence) > 3 Then HalBrain.AddToTable "_" & Trim(Lcase(TableList(i))), "Brain", Trim(UserSentence), AnswerSent
2361 Next
2362 End If
2363 End If
2364 End If
2365
2366 If HalBrain.ReadOnlyMode = False And AlreadyLearned = False And HalBrain.CountInstances(" ", Trim(UserSentence)) > 2 And HalGreeting = "" Then
2367 If PersonalData = True And IsQuestion = False Then
2368 'SAVE: FILE USER SENTENCE DEFAULT
2369 'Hal adds to the default brain user sentence file an association of the current
2370 'user sentence With words selected from that same current user sentence.
2371 If InStr(UserSentence, "WHAT IS") = 0 Then
2372 If HalBrain.CheckTableExistence(Trim(LCase(UserName)) & "_UserSent") = False Then
2373 'Create table for this user if it doesn't exist
2374 HalBrain.CreateTable Trim(LCase(UserName)) & "_UserSent", "Brain", "autoLearningBrain"
2375 End If
2376 If TopicContinuity = True Then HalBrain.AddToTable Trim(LCase(UserName)) & "_UserSent", "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2377 HalBrain.AddToTable Trim(LCase(UserName)) & "_UserSent", "Brain", Trim(UserSentence), AnswerSent
2378 End If
2379 ElseIf IsQuestion = False Then
2380 'SAVE: FILE SHARED USER SENTENCES
2381 'Unless the user seems to be asking for data recall, or talking about
2382 'himself or herself, Hal adds to a shared user sentence file. This allows
2383 'Hal to gain knowledge that he can apply to conversations with multiple users.
2384 If TopicContinuity = True Then HalBrain.AddToTable "sharedUserSent", "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2385 HalBrain.AddToTable "sharedUserSent", "Brain", Trim(UserSentence), AnswerSent
2386 End If
2387 'SAVE: FILE QUESTIONS IN RANDOM QUESTION RETRIEVAL FILE
2388 'Hal saves the user's questions (with pronouns reversed)
2389 'so that he can pose questions back to the user later for 3 purposes:
2390 '1. If the user answers a question later, Hal will learn the answer.
2391 '2. It adds variety to future conversations for the user.
2392 '3. It gives Hal another possible response when "stuck" for an answer.
2393 If IsQuestion = True Then HalBrain.AddToTable "sharedQuestions", "Sentence", AnswerSent, ""
2394 End If
2395
2396 Rem PLUGIN: PLUGINAREA7
2397 'The preceding comment is actually a plug-in directive for
2398 'the Ultra Hal host application. It allows for code snippets
2399 'to be inserted here on-the-fly based on user configuration.
2400
2401 'POST PROCESS: LIMIT TABLE SIZE
2402 'We want to make sure the sentence files
2403 'don't get too big so we limit them.
2404
2405 'RESPOND: HAL NOTICES HE IS REPEATING HIMSELF
2406 'Hal may make a comment or alter his remark
2407 'if he detects himself being repetitious.
2408 If HalBrain.CheckRepetition(GetResponse, PrevSent) = True Then
2409 RepeatResponse = HalBrain.ChooseSentenceFromFile("halRepeat")
2410 GetResponse = Replace(RepeatResponse, "<response>", GetResponse, 1, -1, vbTextCompare)
2411 DebugInfo = DebugInfo & "Hal has noticed he is repeating himself and has made a comment about it: " & GetResponse & vbCrLf
2412 End If
2413
2414 'RESPOND: MAKE COMMENTS ABOUT SHORT PHRASES
2415 GetResponse = GetResponse & ShortPhrase
2416
2417 'PROCESS: REVERSE CERTAIN CONTRACTIONS AND OTHER SUBSTITUTIONS
2418 'Standardizing on contractions can make Hal sound conversational.
2419 'However, certain sentence constructions don't work well
2420 'if expressed as contractions. For example:
2421 '"I don't know where it is" becomes "I don't know where it's."
2422 'For another example, "That's how he is" becomes "That's how he's."
2423 'To solve these types of cases
2424 'we attempt to modify certain contractions, words, and phrases
2425 'at the end of this function, now that Hal's thinking is done.
2426 GetResponse = HalBrain.HalFormat(GetResponse)
2427 GetResponse = HalBrain.ProcessSubstitutions(GetResponse, "corrections")
2428
2429 'PROCESS: CALL USER BY CORRECT NAME
2430 'If the user has chosen a nickname or temporary name, call user by that
2431 'otherwise call the user by the username chosen by the host application
2432 If NewName <> "" Then
2433 GetResponse = Replace(GetResponse, "<UserName>", NewName, 1, -1, vbTextCompare)
2434 GetResponse = Replace(GetResponse, "<Name>", NewName, 1, -1, vbTextCompare)
2435 Else
2436 GetResponse = Replace(GetResponse, "<UserName>", UserName, 1, -1, vbTextCompare)
2437 GetResponse = Replace(GetResponse, "<Name>", UserName, 1, -1, vbTextCompare)
2438 End If
2439
2440 'PROCESS: AGE AND GENDER TAGS
2441 GetResponse = Replace(GetResponse, "<HalAge>", HalAge, 1, -1, vbTextCompare)
2442 GetResponse = Replace(GetResponse, "<HalSex>", HalSex, 1, -1, vbTextCompare)
2443
2444 'PROCESS: NAME REVERSAL
2445 'If Hal is about to same something referring to himself in third person
2446 'then we will reverse it to be about the user.
2447 'Don't let Hal say the word "HAL" unless he is telling his name
2448 If InStr(1, GetResponse, "i'm", vbTextCompare) = 0 And InStr(1, GetResponse, "i am", vbTextCompare) = 0 And InStr(1, GetResponse, "name", vbTextCompare) = 0 And InStr(1, GetResponse, "this is", vbTextCompare) = 0 Then
2449 GetResponse = " " & GetResponse & " "
2450 GetResponse = Replace(GetResponse, "Ultra Hal Assistant", " " & NewName & " ", 1, -1, vbTextCompare)
2451 GetResponse = Replace(GetResponse, "Ultra Hal", " " & NewName & " ", 1, -1, vbTextCompare)
2452 GetResponse = Replace(GetResponse, "Hal Assistant", " " & NewName & " ", 1, -1, vbTextCompare)
2453 GetResponse = Replace(GetResponse, " Hal ", " " & NewName & " ", 1, -1, vbTextCompare)
2454 GetResponse = Replace(GetResponse, " Hal,", " " & NewName & ",", 1, -1, vbTextCompare)
2455 GetResponse = Replace(GetResponse, " Hal.", " " & NewName & ".", 1, -1, vbTextCompare)
2456 GetResponse = Replace(GetResponse, " " & ComputerName & " ", " " & NewName & " ", 1, -1, vbTextCompare)
2457 GetResponse = Replace(GetResponse, " " & ComputerName & ",", " " & NewName & ",", 1, -1, vbTextCompare)
2458 GetResponse = Replace(GetResponse, " " & ComputerName & ".", " " & NewName & ".", 1, -1, vbTextCompare)
2459 End If
2460
2461 'PROCESS: PRESERVE ALL VARIABLES
2462 PrevUserSent = UserSentence
2463 CustomMem = HalBrain.EncodeVar(NewName, "NewName") & HalBrain.EncodeVar(UserSex, "UserSex") & HalBrain.EncodeVar(SentCount, "SentCount") & HalBrain.EncodeVar(ShortSents, "ShortSents")
2464
2465 Rem PLUGIN: CUSTOMMEM2
2466 'The preceding comment is actually a plug-in directive for
2467 'the Ultra Hal host application. It allows for code snippets
2468 'to be inserted here on-the-fly based on user configuration.
2469
2470End Function
2471
2472'This function scans a sentence looking to see if a user entered gibberish like
2473'sdfkjhskjdfhskdsdfdf. It works by looking for more than 5 consanants in a row,
2474'which doesn't occur in normal english words.
2475Function DetectGibberish(GibSentence)
2476 DetectGibberish = False
2477 GibCount = 0
2478 For i = 1 To Len(GibSentence) 'loop for every character in the sentence
2479 CurrentLetter = Ucase(Mid(GibSentence, i, 1))
2480 GibCount = GibCount + 1
2481 If CurrentLetter = "0" Then GibCount = 0
2482 If CurrentLetter = "1" Then GibCount = 0
2483 If CurrentLetter = "2" Then GibCount = 0
2484 If CurrentLetter = "3" Then GibCount = 0
2485 If CurrentLetter = "4" Then GibCount = 0
2486 If CurrentLetter = "5" Then GibCount = 0
2487 If CurrentLetter = "6" Then GibCount = 0
2488 If CurrentLetter = "7" Then GibCount = 0
2489 If CurrentLetter = "8" Then GibCount = 0
2490 If CurrentLetter = "9" Then GibCount = 0
2491 If CurrentLetter = "A" Then GibCount = 0
2492 If CurrentLetter = "E" Then GibCount = 0
2493 If CurrentLetter = "I" Then GibCount = 0
2494 If CurrentLetter = "O" Then GibCount = 0
2495 If CurrentLetter = "U" Then GibCount = 0
2496 If CurrentLetter = "Y" Then GibCount = 0
2497 If CurrentLetter = " " Then GibCount = 0
2498 If GibCount = 6 Then
2499 DetectGibberish = True
2500 Exit For
2501 End If
2502 Next
2503End Function
2504
2505'If the user clicks on the About/Options button for this plugin
2506'this sub will be called. There are no extra settings for this brain,
2507'so we'll display an information box
2508Sub AboutOptions()
2509 HalBrain.MsgAlert "This is the Ultra Hal 6.2 Default Brain. This brain has no additional options."
2510End Sub
2511
2512'This sub will be called when the Ultra Hal program starts up in case
2513'the script needs to load some modules or seperate programs. If a return
2514'value is given it is passed as a Hal Command to the host Hal program.
2515Function Script_Load()
2516 Rem PLUGIN: SCRIPT_LOAD
2517 'The preceding comment is actually a plug-in directive for
2518 'the Ultra Hal host application. It allows for code snippets
2519 'to be inserted here on-the-fly based on user configuration.
2520End Function
2521
2522'This sub will be called before the Ultra Hal program is closed in case
2523'the script needs to do any cleanup work.
2524Sub Script_Unload()
2525 Rem PLUGIN: SCRIPT_UNLOAD
2526 'The preceding comment is actually a plug-in directive for
2527 'the Ultra Hal host application. It allows for code snippets
2528 'to be inserted here on-the-fly based on user configuration.
2529End Sub
2530
2531'If the host application is Ultra Hal Assistant, then this sub will be
2532'run once a minute enabling plug-ins to do tasks such as checking for
2533'new emails or checking an appointment calendar.
2534Sub Minute_Timer(MinutesPast)
2535 Rem PLUGIN: MINUTE_TIMER
2536 'The preceding comment is actually a plug-in directive for
2537 'the Ultra Hal host application. It allows for code snippets
2538 'to be inserted here on-the-fly based on user configuration.
2539End Sub
2540
2541Rem PLUGIN: FUNCTIONS
2542'The preceding comment is actually a plug-in directive for
2543'the Ultra Hal host application. It allows for code snippets
2544'to be inserted here on-the-fly based on user configuration.
2545
2546Function ReadFolder(vrCurrentFolder, vrMp3Folder)
2547Set vrFso = CreateObject("Scripting.FileSystemObject")
2548Set vrFolder = vrFso.GetFolder(vrCurrentFolder)
2549'------------------
2550' Read all the files in the current folder
2551'------------------
2552Set vrFiles = vrFolder.Files
2553For Each vrFile in vrFiles
2554'------------------
2555' It's an MP3 file; I add it to the table
2556'------------------
2557 If UCase(Right(vrFile, 3)) = "MP3" Then
2558 vrSong = Ucase(vrFile)
2559 vrSong = Replace(vrSong, ".MP3", "")
2560 vrLen = Len(vrSong)
2561 vrPos = InStrRev(vrSong, "\")
2562 vrRight = vrLen - vrPos
2563 vrSong = LTrim(Right(vrSong, vrRight))
2564 HalBrain.AddToTable "vrMp3", "Brain", vrSong, vrFile
2565 End If
2566Next
2567'------------------
2568' Read all the subfolders in the current folder
2569'------------------
2570Set vrSubFolders = vrFolder.SubFolders
2571For Each vrFolderObject in vrSubFolders
2572'------------------
2573' Pay attetion here: This is recursive! We must be sure that it will get to an end
2574' Since we are reading directories on a hard disk, the number of recursions
2575' should never be infinite. However, a very big number of subfolders and files
2576' might lead to memory problems or to performances bottlenecks.
2577' I've tested it on a folder containing about 100 subfolders and 3.000 files,
2578' and got acceptable performances (less than 5 minutes)
2579'------------------
2580 Call ReadFolder(vrFolderObject, vrMp3Folder)
2581Next
2582
2583End Function
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593'The preceding comment is actually a plug-in directive for
2594'the Ultra Hal host application. It allows for code snippets
2595'to be inserted here on-the-fly based on user configuration.
2596
2597Function ReadFolder(vrCurrentFolder, vrMp3Folder)
2598Set vrFso = CreateObject("Scripting.FileSystemObject")
2599Set vrFolder = vrFso.GetFolder(vrCurrentFolder)
2600'------------------
2601' Read all the files in the current folder
2602'------------------
2603Set vrFiles = vrFolder.Files
2604For Each vrFile in vrFiles
2605'------------------
2606' It's an MP3 file; I add it to the table
2607'------------------
2608 If UCase(Right(vrFile, 3)) = "MP3" Then
2609 vrSong = Ucase(vrFile)
2610 vrSong = Replace(vrSong, ".MP3", "")
2611 vrLen = Len(vrSong)
2612 vrPos = InStrRev(vrSong, "\")
2613 vrRight = vrLen - vrPos
2614 vrSong = LTrim(Right(vrSong, vrRight))
2615 vrSong = " " & vrSong & " "
2616 vrSong = Replace(vrSong," ","xx",1,-1,vbTextCompare)
2617 HalBrain.AddToTable "vrMp3", "Brain", vrSong, vrFile
2618 End If
2619Next
2620'------------------
2621' Read all the subfolders in the current folder
2622'------------------
2623
2624
2625Set vrSubFolders = vrFolder.SubFolders
2626For Each vrFolderObject in vrSubFolders
2627'------------------
2628' Pay attetion here: This is recursive! We must be sure that it will get to an end
2629' Since we are reading directories on a hard disk, the number of recursions
2630' should never be infinite. However, a very big number of subfolders and files
2631' might lead to memory problems or to performances bottlenecks.
2632' I've tested it on a folder containing about 100 subfolders and 3.000 files,
2633' and got acceptable performances (less than 5 minutes)
2634'------------------
2635 Call ReadFolder(vrFolderObject, vrMp3Folder)
2636Next
2637
2638End Function
2639
2640
2641
2642'The preceding comment is actually a plug-in directive for
2643'the Ultra Hal host application. It allows for code snippets
2644'to be inserted here on-the-fly based on user configuration.