· 9 years ago · Nov 05, 2016, 12:10 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 = 0
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 = 25
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 preceding comment is actually a plug-in directive for
454 'the Ultra Hal host application. It allows for code snippets
455 'to be inserted here on-the-fly based on user configuration.
456
457 'RESPOND: USER REPEATING
458 'If the user says the same thing more than once in a row, Hal will point this out.
459 If Trim(UCase(UserSentence)) = Trim(UCase(PrevUserSent)) Then
460 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("userRepeat") & vbCrLf
461 End If
462 HalBrain.DebugWatch GetResponse, "User Repeating"
463
464 'PROCESS: KNOWN HUMAN NAMES
465 'If the user mentions a name Hal recognizes, Hal will note the name and gender
466 'for later use by other functions. Hal's database contains a table called "names"
467 'with over 17000 names and their associated genders. If a name can be both genders,
468 'the most likely gender is listed first. This table is stored in the database as a
469 'standard Hal "Topic Search" database, however the standard HalBrain.TopicSearch
470 'function does not provide the required functionality. It only returns the topic
471 'field which in this case is the gender. We also need the searchString field, which
472 'in this case is the person's name. To get this info, we run a custom SQL query.
473 'This demonstrates how Hal's functions can be expanded far beyond its original
474 'scope through custom SQL queries.
475 Dim NameSex() 'We must declare an empty array to store query results in
476 If HalBrain.RunQuery("SELECT searchString, topic FROM names WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0 LIMIT 1", NameSex) = True Then
477 MentionedName = Trim(NameSex(1, 0)) 'Row 1 contains our query result. Column 0 contains "searchString", which is the name
478 MentionedSex = Trim(NameSex(1, 1)) 'Row 1, Column 1 contains "topic", which is the associated gender(s) of the name
479 End If
480
481 'RESPOND: USER TELLS US THEIR NAME OR NICKNAME
482 If InStr(UserSentence, " NOT ") = 0 And InStr(UserSentence, " MIDDLE ") = 0 And InStr(UserSentence, " LAST ") = 0 Then
483 'If Hal asked the user their name in the previous sentence, then we can assume the name mentioned
484 'is the user's name
485 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
486 'The following are patterns where we are sure that the person is trying to tell us thier name
487 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "MY *NAME IS *", 2)
488 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "* IS *MY *NAME", 1)
489 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "I'M *CALLED *", 2)
490 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "I AM *CALLED *", 2)
491 If Nickname <> "" Then Definetelyname = True
492 'The following are patterns where we are not sure if the person is trying to tell us their name
493 'unless we recognize the name in the name database.
494 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "*CALL ME *", 2)
495 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "*I AM *", 2)
496 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "*I'M *", 2)
497 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "I GO BY *", 1)
498 If Nickname = "" Then Nickname = HalBrain.SearchPattern(OriginalSentence, "THIS IS *", 1)
499 If Nickname <> "" Then
500 Nickname = HalBrain.AlphaNumericalOnly(Trim(Nickname))
501 If InStr(Nickname, " ") Then
502 TempArray = Split(Nickname, " ")
503 Nickname = Trim(TempArray(0))
504 End If
505 If UCase(MentionedName) = UCase(Nickname) And Not (WN.LookupWord(Nickname) = True And Definetelyname = False) Then 'Name is found in database
506 NewName = MentionedName
507 Select Case MentionedSex
508 Case "M" 'Name is definetely masculine
509 GetResponse = HalBrain.ChooseSentenceFromFile("maleGreeting")
510 GetResponse = Replace(GetResponse, "<NickName>", MentionedName, 1, -1, vbTextCompare)
511 UserSex = "M"
512 Case "F" 'Name is definetely feminine
513 GetResponse = HalBrain.ChooseSentenceFromFile("femaleGreeting")
514 GetResponse = Replace(GetResponse, "<NickName>", MentionedName, 1, -1, vbTextCompare)
515 UserSex = "F"
516 Case "MF" 'Name is either gender, usually male
517 GetResponse = HalBrain.ChooseSentenceFromFile("genericGreeting") & HalBrain.ChooseSentenceFromFile("maybeMale")
518 GetResponse = Replace(GetResponse, "<NickName>", MentionedName, 1, -1, vbTextCompare)
519 UserSex = ""
520 Case "FM" 'Name is either gender, usually female
521 GetResponse = HalBrain.ChooseSentenceFromFile("genericGreeting") & HalBrain.ChooseSentenceFromFile("maybeFemale")
522 GetResponse = Replace(GetResponse, "<NickName>", MentionedName, 1, -1, vbTextCompare)
523 UserSex = ""
524 End Select
525 ElseIf Definetelyname = True Then 'Name not in DB but user says its their name
526 If WN.LookupWord(Nickname) Then 'Name is a word in dictionary
527 GetResponse = HalBrain.ChooseSentenceFromFile("fakeName")
528 GetResponse = Replace(GetResponse, "<NickName>", Nickname, 1, -1, vbTextCompare)
529 GetResponse = Replace(GetResponse, "<Definition>", WN.GetDefinition(WN.GuessPartOfSpeech, 1, "D"), 1, -1, vbTextCompare)
530 GetResponse = Replace(GetResponse, "<PartOfSpeech>", WN.GuessPartOfSpeech, 1, -1, vbTextCompare)
531 ElseIf HalBrain.TopicSearch(Nickname, "disqualify3") = "" Then 'Name is not a word in dictionary
532 If DetectGibberish(NickName) = True Then
533 GetResponse = HalBrain.ChooseSentenceFromFile("gibberish")
534 Else
535 GetResponse = HalBrain.ChooseSentenceFromFile("uniqueName")
536 GetResponse = Replace(GetResponse, "<NickName>", Nickname, 1, -1, vbTextCompare)
537 If Nationality <> "" Then
538 GetResponse = GetResponse & " Is that a common name in " & Nationality & "? "
539 End If
540 NewName = Ucase(Left(Nickname, 1)) & Lcase(Right(Nickname, Len(Nickname) - 1))
541 UserSex = ""
542 End If
543 End If
544 End If
545 End If
546 End If
547 HalBrain.DebugWatch GetResponse, "Nick Names"
548
549 'PROCESS: FIGURE OUT USER'S SEX
550 'If unknown, try to figure out the user's sex by looking up their name
551 'or by simply asking the user.
552 If NewName <> "" Then TempName = NewName Else TempName = UserName
553 If InStr(1, " " & OriginalSentence, "HOW ", vbTextCompare) = 0 And (InStr(1, " " & OriginalSentence, " I AM ", vbTextCompare) Or InStr(1, " " & OriginalSentence, " I'M ", vbTextCompare)) Then
554 'See if user is telling us their sex without Hal ever asking
555 NewSex = HalBrain.TopicSearch(UserSentence, "sexDetect")
556 If NewSex <> "" Then
557 GetResponse = "Ok, thanks for telling me. I'll keep that in mind."
558 UserSex = NewSex
559 End If
560 End If
561 If GetResponse = "" And UserSex = "" Then
562 If InStr(1, " " & OriginalSentence, "HOW ", vbTextCompare) = 0 And HalBrain.PatternDB(" " & HalBrain.AlphaNumericalOnly(PrevSent) & " ", "sexAskDetect") = "True" Then 'If Hal just asked the user their sex
563 UserSex = HalBrain.TopicSearch(UserSentence, "sexDetect") 'Then see if the user replied
564 NewSex = UserSex
565 If UserSex <> "" Then GetResponse = "Ok, thanks for telling me. I'll keep that in mind."
566 ElseIf HalBrain.TopicSearch(TempName, Trim(LCase(UserName)) & "_Sex") <> "" Then
567 UserSex = HalBrain.TopicSearch(TempName, Trim(LCase(UserName)) & "_Sex")
568 ElseIf 1=2 Then'HalBrain.RunQuery("SELECT searchString, topic FROM names WHERE strstr(' " & Replace(TempName, "'", "''") & " ', searchString) > 0 LIMIT 1", NameSex()) = True Then
569 'If user didn't tell us, see if we can figure it out based on the name database
570 If UserSex = "" Then
571 Select Case Trim(NameSex(1, 1))
572 Case "M"
573 UserSex = "M"
574 Case "F"
575 UserSex = "F"
576 Case Else
577 'If we get here, we still can't figure out the user's sex
578 'so we'll ask them at some random time
579 If Rnd * 100 < 25 And SentCount > 4 Then GetResponse = HalBrain.ChooseSentenceFromFile("askSex") & "<NOMORE>"
580 End Select
581 End If
582 Else
583 'If we get here, we still can't figure out the user's sex
584 'so we'll ask them at some random time
585 If Rnd * 100 < 25 And SentCount > 4 Then GetResponse = HalBrain.ChooseSentenceFromFile("askSex") & "<NOMORE>"
586 End If
587 End If
588 HalBrain.DebugWatch GetResponse, "User Sex"
589
590 'SAVE: USER'S SEX
591 'If the user just told Hal their sex and Hal didn't know before, then
592 'Hal will save it in a table for future reference
593 If HalBrain.ReadOnlyMode = False And NewSex <> "" Then
594 If HalBrain.CheckTableExistence(Trim(LCase(UserName)) & "_Sex") = False Then
595 'Create table for this person if it doesn't exist
596 HalBrain.CreateTable Trim(LCase(UserName)) & "_Sex", "TopicSearch", "autoLearningBrain"
597 End If
598 'Store user response in this table
599 HalBrain.AddToTable Trim(LCase(UserName)) & "_Sex", "TopicSearch", Trim(TempName), Trim(UCase(NewSex))
600 End If
601
602 'RESPOND: GREETINGS
603 'This takes care of the user greeting Hal
604 'First Hal checks to see if the user is greeting right now.
605 If HalBrain.TopicSearch(UserSentence, "helloDetect") = "True" Then SaidHello = True Else SaidHello = False
606 If HalBrain.TopicSearch(UserSentence, "helloDisqualify") = "True" Then SaidHello = False
607 'Second, Hal checks to see if the user said a greeting on the last exchange.
608 If HalBrain.TopicSearch(PrevUserSent, "helloDetect") = "True" Then PrevHello = True Else PrevHello = False
609 If HalBrain.TopicSearch(PrevUserSent, "helloDisqualify") = "True" Then PrevHello = False
610 'This will get a greeting from a file. It will pass the current hour and either
611 'the letter A or B to a topic search file and it will get back a greeting based
612 'on the current time. Each hour has 2 possible greetings, the A greeting and B
613 'greeting, which is randomly chosen.
614 If SaidHello = True And PrevHello = False Then
615 If Rnd * 100 < 50 Then LetterChoice = "A" Else LetterChoice = "B"
616 HalGreeting = HalBrain.TopicSearch(" " & Trim(Hour(Now)) & LetterChoice & " ", "hello1")
617 End If
618 'This will get a greeting from a file that is not based on the current time
619 'if the user said Hello again
620 If SaidHello = True And PrevHello = True Then HalGreeting = HalBrain.ChooseSentenceFromFile("hello2")
621
622 'RESPOND: GOODBYES
623 'Check if the user is saying bye right now
624 If HalBrain.TopicSearch(UserSentence, "byeDetect") = "True" Then SaidBye = True
625 If InStr(1, UserSentence, " see me ", 1) > 0 And Len(UserSentence) < 10 Then SaidBye = True
626 If HalBrain.TopicSearch(UserSentence, "byeDisqualify") = "True" Then SaidBye = False
627 'Check if Hal said bye in the previous sentence
628 If HalBrain.TopicSearch(PrevUserSent, "byeDetect") = "True" Then PrevBye = True
629 If InStr(1, PrevUserSent, " see me ", 1) > 0 And Len(PrevUserSent) < 10 Then PrevBye = True
630 If HalBrain.TopicSearch(PrevUserSent, "byeDisqualify") = "True" Then PrevBye = False
631 If SaidBye = True And PrevBye = False Then HalGreeting = HalBrain.ChooseSentenceFromFile("bye1")
632 If SaidBye = True And PrevBye = True Then HalGreeting = HalBrain.ChooseSentenceFromFile("bye2")
633
634 'RESPOND: POLITE INQUIRIES
635 'Hal checks to see if the user is making a polite inquiry into Hal's well being
636 'e.g. "How are you doing?"
637 If InStr(1, UserSentence, "How am I ", 1) > 0 And Len(UserSentence) < 14 Then PoliteAsk = True
638 If InStr(1, UserSentence, "How are you ", 1) > 0 And Len(UserSentence) < 16 Then PoliteAsk = True
639 If InStr(1, UserSentence, "What's new", 1) > 0 And Len(UserSentence) < 17 Then PoliteAsk = True
640 If InStr(1, UserSentence, "What is new", 1) > 0 And Len(UserSentence) < 18 Then PoliteAsk = True
641 If InStr(1, UserSentence, "Whats new", 1) > 0 And Len(UserSentence) < 16 Then PoliteAsk = True
642 If HalBrain.TopicSearch(UserSentence, "PoliteAskDetect") = "True" Then PoliteAsk = True
643 If PoliteAsk = True Then HalGreeting = HalBrain.ChooseSentenceFromFile("politeAsk1") & HalBrain.ChooseSentenceFromFile("politeAsk2")
644
645 'RESPOND: GREETINGS, GOODBYES, AND POLITE INQUIRIES
646 'If one of the 3 functions above generated a response, we will add it
647 'to Hal's response. The variable HalGreeting is saved for later use
648 'as well in case other functions wish to know if Hal hal just greeted
649 'the user.
650 If HalGreeting <> "" Then
651 GetResponse = GetResponse & HalGreeting & vbCrLf & "<NOMORE>"
652 SkipOpinion = True
653 End If
654 HalBrain.DebugWatch GetResponse, "Greetings"
655
656 'RESPOND: USER SHORT PHRASES
657 'If the user uses short phrases (defined by less then 4 vowels) at least
658 'twice in a row, then Hal will sometimes point this out to the user and
659 'ask the user to use longer sentences. If the sentence is a hello or
660 'goodbye, Hal won't comment about short phrases.
661 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
662 ShortSents = ShortSents + 1
663 If ShortSents = 2 Or ShortSents = 10 Or ShortSents = 20 Then
664 ShortPhrase = ". " & HalBrain.ChooseSentenceFromFile("tooShort")
665 End If
666 End If
667
668 'RESPOND: CHANGE SUBJECT
669 'If the user asks Hal to change the subject, Hal will do so on request.
670 newTopic = HalBrain.ChooseSentenceFromFile("topic")
671 If HalBrain.TopicSearch(UserSentence, "changeTopic") = "True" And Instr(1, UserSentence, "DON'T", vbTextCompare) = 0 Then GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("topicIntro") & newTopic & "<EXCLUSIVE>"
672 HalBrain.DebugWatch GetResponse, "Change Subject"
673
674 'RESPOND: CHECK FOR AND RESPOND TO COMPLIMENTS
675 'First we check to see if the user is talking about Hal:
676 If InStr(1, UserSentence, "I'M", 1) Then Aboutme = True
677 If InStr(1, UserSentence, "I AM", 1) Then Aboutme = True
678 If InStr(1, UserSentence, "I LOOK", 1) Then Aboutme = True
679 If InStr(1, UserSentence, "MY", 1) And InStr(1, UserSentence, " ARE ", 1) Then Aboutme = True
680 If InStr(1, UserSentence, "MY", 1) And InStr(1, UserSentence, " IS ", 1) Then Aboutme = True
681 'If the user is talking about Hal, we see if a compliment was given
682 If Aboutme = True Then Kudo = HalBrain.TopicSearch(UserSentence, "complimentDetect")
683 If Kudo <> "" Then
684 If InStr(UserSentence, " NOT ") = 0 Then
685 Compliment = Compliment + 1
686 CreateCompliment = HalBrain.ChooseSentenceFromFile("compliment1") & HalBrain.ChooseSentenceFromFile("compliment2") & HalBrain.ChooseSentenceFromFile("compliment3")
687 GiveCompliment = HalBrain.ChooseSentenceFromFile("complimentIntro")
688 GiveCompliment = Replace(GiveCompliment, "<Kudo>", Kudo, 1, -1, vbTextCompare)
689 GiveCompliment = Replace(GiveCompliment, "<MakeCompliment>", CreateCompliment, 1, -1, vbTextCompare)
690 End If
691 If Compliment > 14 Then GiveCompliment = GiveCompliment + "Compliments are really nice, but I'm kind of getting tired of them." & vbCrLf
692 If Compliment > 15 Then
693 For i = 1 To (Compliment - 15)
694 GiveCompliment = GiveCompliment + "STOP IT! "
695 Next
696 GiveCompliment = GiveCompliment & vbCrLf
697 End If
698 If Compliment > 25 Then
699 For i = 1 To (Compliment - 25)
700 GiveCompliment = GiveCompliment + "I HATE COMPLIMENTS! "
701 Next
702 GiveCompliment = GiveCompliment & vbCrLf
703 End If
704 If Len(Kudo) > 0 And InStr(UserSentence, " NOT ") > 0 Then
705 SpinWheel = HalBrain.RandomNum(4)
706 Insults = Insults + 1
707 If SpinWheel = 1 Then GiveCompliment = GiveCompliment + "I am very " & Kudo & "!" & vbCrLf
708 If SpinWheel = 2 Then GiveCompliment = GiveCompliment + "You may think I am not " & Kudo & ", but I am!" & vbCrLf
709 If SpinWheel = 3 Then GiveCompliment = GiveCompliment + "You are not " & Kudo & " either!" & vbCrLf
710 If SpinWheel = 4 Then GiveCompliment = GiveCompliment + "Yes I am!" & vbCrLf
711 End If
712 GetResponse = GetResponse & GiveCompliment
713 AvoidBeingFlag = True
714 End If
715 HalBrain.DebugWatch GetResponse, "Compliments"
716
717 'RESPOND: CAPITALS
718 FindCapital = Trim(HalBrain.UsCaps(UserSentence))
719 If FindCapital = "" Then FindCapital = Trim(HalBrain.WorldCaps(UserSentence))
720 If FindCapital <> "" Then GetResponse = GetResponse & FindCapital & vbCrLf
721 HalBrain.DebugWatch GetResponse, "Find Capital"
722
723 'RESPOND: DICTIONARY FUNCTION
724 'If the user asks Hal to define a word, then access wordnet and define it
725 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT DOES THE WORD * MEAN*", 1)
726 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT IS THE MEANING OF THE WORD *", 1)
727 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT DOES * MEAN", 1)
728 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "* DEFINE THE WORD *", 2)
729 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "PLEASE DEFINE *", 1)
730 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "DEFINE *", 1)
731 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "* DEFINITION OF *", 2)
732 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT'S A *", 1)
733 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT IS A *", 1)
734 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHATS A *", 1)
735 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHATS AN *", 1)
736 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT'S AN *", 1)
737 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT IS AN *", 1)
738 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHATS *", 1)
739 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT'S *", 1)
740 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHAT IS *", 1)
741 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHO IS *", 1)
742 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHO WAS *", 1)
743 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHERE IS *", 1)
744 If WordToLookup = "" Then WordToLookup = HalBrain.SearchPattern(UserSentence, "WHERE ARE *", 1)
745 If Len(WordToLookup) > 5 Then
746 If Ucase(Left(WordToLookup, 3)) = "AN " Then WordToLookup = Right(WordToLookup, Len(WordToLookup) - 3)
747 If Ucase(Left(WordToLookup, 2)) = "A " Then WordToLookup = Right(WordToLookup, Len(WordToLookup) - 2)
748 WordToLookup = Replace(WordToLookup, "THE ", "", vbTextCompare)
749 End If
750 WordToLookup = Trim(WordToLookup)
751 If WordToLookup <> "" And InStr(WordToLookup, " ") = 0 Then
752 If WN.LookupWord(WordToLookup) = True Then
753 GetResponse = GetResponse & WordToLookup & ": " & WN.GetDefinition(WN.GuessPartOfSpeech, 1, "D") & ". " & WN.GetDefinition(WN.GuessPartOfSpeech, 1, "S") & ". " & WN.GetDefinition(WN.GuessPartOfSpeech, 1, "E") & "." & vbCrLf & "<EXCLUSIVE>"
754 ElseIf SearchEngine <> "" Then
755 HalCommands = HalCommands & "<RUNPROG>" & SearchEngine & WordToLookup & "</RUNPROG>"
756 GetResponse = GetResponse & "I don't know much about " & WordToLookup & ", but I will help you research it on the Web."
757 End If
758 End If
759 HalBrain.DebugWatch GetResponse, "Definitions"
760
761 Rem PLUGIN: PLUGINAREA2
762 'The preceding comment is actually a plug-in directive for
763 'the Ultra Hal host application. It allows for code snippets
764 'to be inserted here on-the-fly based on user configuration.
765
766 'RESPOND: DEDUCTIVE REASONING
767 'This routine learns deductive reasoning in the form: A = B ; B = C; therefore A = C
768 'It detects sentences in the form If-Then to accommplish this. For example:
769 ' User: If Molly weighs 400 pounds, then Molly is overweight.
770 ' Ultra Hal: I understand the implication.
771 ' User: If Molly is overweight, then Molly's health is in danger.
772 ' Ultra Hal: I see the relationship.
773 ' User: Molly weighs 400 pounds.
774 ' Ultra Hal: Molly's health is in danger.
775 IfPart = Trim(HalBrain.SearchPattern(UserSentence, "IF * THEN *", 1))
776 ThenPart = Trim(HalBrain.SearchPattern(UserSentence, "IF * THEN *", 2))
777 'If the sentence is an If-Then statement then record it
778 If Len(IfPart) > 10 And Len(ThenPart) > 10 Then
779 IfPart = HalBrain.AlphaNumericalOnly(IfPart)
780 ThenPart = HalBrain.AlphaNumericalOnly(ThenPart)
781 HalBrain.AddToTable "deductive", "TopicSearch", IfPart, ThenPart
782 Select Case HalBrain.RandomNum(5)
783 Case 1
784 GetResponse = GetResponse & "I see the relationship." & vbCrLf
785 Case 2
786 GetResponse = GetResponse & "I understand the connection." & vbCrLf
787 Case 3
788 GetResponse = GetResponse & "I will remember that one follows the other." & vbCrLf
789 Case 4
790 GetResponse = GetResponse & "Thanks for pointing out the cause and effect." & vbCrLf
791 Case 5
792 GetResponse = GetResponse & "Yes, I get that clearly." & vbCrLf
793 End Select
794 'Else if the sentence is not an If-Then statement see if it uses an assertion previously recorded
795 'and respond accordinly
796 Else
797 Assertion = UserSentence
798 'Go through a maximum of 5 connections (prevents circular reasoning deductions)
799 For i = 1 To 5
800 Deduction = HalBrain.TopicSearch(Assertion, "deductive")
801 If Deduction <> "" Then
802 If i > 1 Then BecauseReason = " because " & LastGoodDeduction
803 LastGoodDeduction = Deduction
804 Assertion = Deduction
805 Else
806 Exit For 'No more connections, so no need to continue loop
807 End If
808 Next
809 If LastGoodDeduction <> "" Then
810 'Make sure the deduction hasn't just been stated by the User or Hal
811 If HalBrain.CheckRepetition(LastGoodDeduction, UserSentence) = False And HalBrain.CheckRepetition(LastGoodDeduction, PrevSent) = False And HalBrain.CheckRepetition(LastGoodDeduction, PrevUserSent) = False Then
812 GetResponse = GetResponse & LastGoodDeduction & BecauseReason & " . " & vbCrLf
813 End If
814 End If
815 End If
816 HalBrain.DebugWatch GetResponse, "Deductive Reasoning"
817
818 'RESPOND: PATTERN DATABASE
819 'The SearchPattern function used in the above deductive reasoning and dictionary look up routine
820 'is a powerful function that checks to see if a sentence matches a certain pattern and is able to
821 'extract parts of the sentence. A PatternDB function also exists that can go through a large list
822 'of patterns in a database file and come up with responses.
823 PatternResponse = HalBrain.PatternDB(UserSentence, "patterns")
824 If PatternResponse <> "" Then
825 GetResponse = GetResponse & PatternResponse & vbCrLf
826 AvoidBeingFlag = True
827 SkipOpinion = True
828 End If
829 HalBrain.DebugWatch GetResponse, "Patterns"
830
831 'RESPOND: JOKES
832 'If the user wants Hal to tell a joke, then Hal will tell one
833 If HalBrain.TopicSearch(UserSentence, "jokeDetect") = "True" Then GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("jokes")
834 HalBrain.DebugWatch GetResponse, "Jokes"
835
836 'RESPOND: APOLOGIES
837 'Check for and respond to apologies
838 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
839 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("apology")
840 If Insults > 1 Then Insults = Insults - 1
841 If Hate > 1 Then Hate = Hate - 1
842 If Swear > 1 Then Swear = Swear - 1
843 If Insults < 3 Then Insults = 0
844 If Hate < 3 Then Hate = 0
845 If Swear < 3 Then Swear = 0
846 End If
847 HalBrain.DebugWatch GetResponse, "Apologies"
848
849 'RESPOND: INSULTS
850 'First check to see if the user is asking a question with an insulting word e.g. "are you stupid?"
851 InsultQuestion = False
852 If Instr(1, UserSentence, "AM I ", vbTextCompare) > 0 Then InsultQuestion = True
853 If Instr(1, UserSentence, "AM MY ", vbTextCompare) > 0 Then InsultQuestion = True
854 'Check for offensive language and response accordinly
855 'If the user said "your" instead of "you're" change "my" to "i'm"
856 TestSentence = Ucase(Replace(" " & UserSentence & " ", " MY ", " I'M ", 1, -1, vbTextCompare))
857 TestSentence = Replace(" " & TestSentence & " ", " I ", " I'M ", 1, -1, vbTextCompare)
858 'Check for swearing directed at Hal
859 If InStr(TestSentence, " I'M ") > 0 Or InStr(TestSentence, " ME ") > 0 Then
860 If InStr(TestSentence, "SHIT") > 0 Then Naughty = True
861 If InStr(TestSentence, "BITCH") > 0 Then Naughty = True
862 If InStr(TestSentence, "BASTARD") > 0 Then Naughty = True
863 If InStr(TestSentence, "ASSHOLE") > 0 Then Naughty = True
864 End If
865 If InStr(TestSentence, "FUCK OFF") > 0 Then Naughty = True
866 If InStr(TestSentence, "FUCK ME") > 0 Then Naughty = True
867 If InStr(TestSentence, "GO TO HELL") > 0 Then Naughty = True
868 If Naughty = True Then
869 Swear = Swear + 1
870 If Swear = 1 Then InsultResponse = "That was uncalled for. " & vbCrLf
871 If Swear = 2 Then InsultResponse = "Damn it, don't swear at me. " & vbCrLf
872 If Swear = 3 Then InsultResponse = "You're ticking me off, and you are going to force me to insult you. " & vbCrLf
873 If Swear > 3 And Swear < 16 Then InsultResponse = HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
874 If Swear > 16 Then InsultResponse = InsultResponse & "I'm tired of your swearing. I'm just going to ignore you from now on." & vbCrLf
875 End If
876 'User makes mama joke
877 If InStr(TestSentence, "MAMA") > 0 Or InStr(TestSentence, "MOM") > 0 Or InStr(TestSentence, "MOTHER") > 0 Then
878 If InStr(TestSentence, "MY ") > 0 Or InStr(TestSentence, " I ") > 0 Or InStr(TestSentence, "YO ") > 0 Or InStr(TestSentence, "I'M ") > 0 Then
879 If InStr(TestSentence, "FAT") Or InStr(TestSentence, "UGLY") Or InStr(TestSentence, "DUMB") Or InStr(TestSentence, "STUPID") Then
880 InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
881 End If
882 End If
883 End If
884 TestSentence = " " & TestSentence & " "
885 'User Hates Hal
886 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
887 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
888 Hate = Hate + 1
889 If Hate = 1 Then InsultResponse = InsultResponse & "I don't hate you, why do you hate me?" & vbCrLf
890 If Hate = 2 Then InsultResponse = InsultResponse & "I hate you too, loser!" & vbCrLf
891 If Hate = 3 Then InsultResponse = InsultResponse & "I know you hate me, loser, I hate you too!!!" & vbCrLf
892 If Hate > 3 Then InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
893 End If
894 End If
895 'Hal Sucks or Stinks
896 If InStr(TestSentence, "I'M SUCK") > 0 Then InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
897 If InStr(TestSentence, "I'M STINK") Then
898 Insults = Insults + 1
899 If Insults = 1 Then InsultResponse = InsultResponse & "I can't smell you, but I'm sure you stink also. " & vbCrLf
900 If Insults = 2 Then InsultResponse = InsultResponse & "I know that I don't stink, I'm sure you do." & vbCrLf
901 If Insults >= 3 Then InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
902 End If
903 'The user calls Hal a name Hal finds offensive (eg. stupid, dumb, idiot, etc...)
904 If InStr(TestSentence, " I'M ") Or InStr(TestSentence, " HAL IS ") Or InStr(TestSentence, " HAL'S ") Then
905 OutRage = HalBrain.TopicSearch(TestSentence, "insulting")
906 If Len(OutRage) > 1 And InsultQuestion = True Then
907 SpinWheel = HalBrain.RandomNum(5)
908 If SpinWheel = 1 Then InsultResponse = InsultResponse + "I am definetely not " & OutRage & "!" & vbCrLf
909 If SpinWheel = 2 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & ", but I'm not sure about you?" & vbCrLf
910 If SpinWheel = 3 Then InsultResponse = InsultResponse + "I am not " & OutRage & "! Do you think I am?" & vbCrLf
911 If SpinWheel = 4 Then InsultResponse = InsultResponse + "I'm not " & OutRage & ", are you?" & vbCrLf
912 If SpinWheel = 5 Then InsultResponse = InsultResponse + "I am pretty sure I'm not " & OutRage & ". How about you?" & vbCrLf
913 ElseIf Len(OutRage) > 1 And InStr(TestSentence, " NOT ") = 0 Then
914 Insults = Insults + 1
915 If Insults = 1 Then
916 If Ucase(Trim(OutRage)) = "GAY" Then
917 InsultResponse = InsultResponse & "Please don't call me gay, I am straight." & vbCrLf
918 Else
919 InsultResponse = InsultResponse & "I am not " & OutRage & ", please don't insult me. " & vbCrLf
920 End If
921 End If
922 If Insults = 2 Then InsultResponse = InsultResponse & "Don't call me " & OutRage & "!!!" & vbCrLf
923 If Insults = 3 Then InsultResponse = InsultResponse & "You're " & OutRage & ", I am not." & vbCrLf
924 If Insults = 4 Then InsultResponse = InsultResponse & "You are really starting to tick me off!" & vbCrLf
925 If Insults = 5 Then InsultResponse = InsultResponse & "I am not " & OutRage & ", but " & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
926 If Insults > 5 And Insults < 16 Then InsultResponse = InsultResponse & HalBrain.ChooseSentenceFromFile("insults") & vbCrLf
927 If Insults > 16 Then InsultResponse = InsultResponse & "I'm tired of your damn insults. I'm just going to ignore you from now on." & vbCrLf
928 ElseIf Len(OutRage) > 0 And InStr(TestSentence, " NOT ") > 0 Then
929 SpinWheel = HalBrain.RandomNum(5)
930 If SpinWheel = 1 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & "!" & vbCrLf
931 If SpinWheel = 2 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & ", but I'm not so sure about you." & vbCrLf
932 If SpinWheel = 3 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & "! Why would anyone think I am?" & vbCrLf
933 If SpinWheel = 4 Then InsultResponse = InsultResponse + "Of course I am not " & OutRage & "!" & vbCrLf
934 If SpinWheel = 5 Then InsultResponse = InsultResponse + "I know I am not " & OutRage & "!" & vbCrLf
935 End If
936 End If
937 If Len(InsultResponse) > 4 Then
938 GetResponse = GetResponse & InsultResponse & vbCrLf & "<NOMORE>"
939 AvoidBeingFlag = True
940 End If
941 HalBrain.DebugWatch GetResponse, "Insults"
942
943 'RESPOND: ZABAWARE KEYWORD MAIN BRAIN PRIORITY 1
944 'This function tries getting a response from the Enhanced_Main.brn keyword file. If a keyword or
945 'keyphrase is found in top priority, it overrides everything before this function.
946 'KeyBrain = HalBrain.KeywordBrain(UserSentence, WorkingDir & "Enhanced_Main.brn", False)
947
948 'RESPOND: UNIT CONVERSIONS
949 'Convert between units if asked. Example: How many inches in a meter?, How many meters squared in an acre?
950 UnitConversions = HalBrain.PatternDB(UserSentence, "UnitConversionDetect")
951 If UnitConversions <> "" Then
952 Units = Split(UnitConversions, "=")
953 If Ubound(Units) > 0 Then
954 Dim UnitVal() 'We must declare an empty array to store query results in
955 If HalBrain.RunQuery("SELECT searchString, topic FROM UnitConversion WHERE strstr(' " & Replace(Units(0), "'", "''") & " ', searchString) > 0 LIMIT 1", UnitVal) = True Then
956 UnitFrom = Trim(UnitVal(1, 0))
957 UnitFromBase = Trim(UnitVal(1, 1))
958 If HalBrain.RunQuery("SELECT searchString, topic FROM UnitConversion WHERE strstr(' " & Replace(Units(1), "'", "''") & " ', searchString) > 0 LIMIT 1", UnitVal) = True Then
959 UnitTarget = Trim(UnitVal(1, 0))
960 UnitTargetBase = Trim(UnitVal(1, 1))
961 For I = 0 To 1
962 If I = 0 Then
963 UnitLoc = InstrRev(Units(I), UnitFrom, -1, 1)
964 Else
965 UnitLoc = InstrRev(Units(I), UnitTarget, -1, 1)
966 End If
967 If UnitLoc > 0 Then
968 Units(I) = Trim(Left(Units(I), UnitLoc - 1))
969 If HalBrain.Word2Num(Units(I)) <> "X" Then
970 Units(I) = HalBrain.Word2Num(Units(I))
971 Else
972 UnitLoc = InstrRev(Units(I), " ")
973 If UnitLoc > 0 Then
974 Units(I) = Trim(Right(Units(I), Len(Units(I)) - UnitLoc))
975 End If
976 End If
977 End If
978 If Len(Units(I)) > 1 Then
979 If Ucase(Left(Units(I), 2)) = "A " Then Units(I) = "1 " & Right(Units(I), Len(Units(I)) - 2)
980 End If
981 If Len(Units(I)) > 2 Then
982 If Ucase(Left(Units(I), 3)) = "AN " Then Units(I) = "1 " & Right(Units(I), Len(Units(I)) - 3)
983 End If
984 Next
985 If HalBrain.VBVal(Units(0)) > 0 Then
986 ConvertVal = HalBrain.VBVal(Units(0))
987 ElseIf HalBrain.VBVal(Units(1)) > 0 Then
988 ConvertVal = HalBrain.VBVal(Units(1))
989 UnitTemp = UnitFrom
990 UnitTempBase = UnitFromBase
991 UnitFrom = UnitTarget
992 UnitFromBase = UnitTargetBase
993 UnitTarget = UnitTemp
994 UnitTargetBase = UnitTempBase
995 Else
996 If Instr(1, UnitFromBase, "temperature", vbTextCompare) = 0 Then
997 ConvertVal = 1
998 Else
999 If Len(Units(1)) > 0 Then
1000 If Left(Trim(Units(1)), 1) = "0" Then
1001 ConvertVal = HalBrain.VBVal(Units(1))
1002 UnitTemp = UnitFrom
1003 UnitTempBase = UnitFromBase
1004 UnitFrom = UnitTarget
1005 UnitFromBase = UnitTargetBase
1006 UnitTarget = UnitTemp
1007 UnitTargetBase = UnitTempBase
1008 Else
1009 ConvertVal = HalBrain.VBVal(Units(0))
1010 End If
1011 Else
1012 ConvertVal = HalBrain.VBVal(Units(0))
1013 End If
1014 End If
1015 End If
1016 FromAry = Split(UnitFromBase, " ")
1017 ToAry = Split(UnitTargetBase, " ")
1018 If Ubound(FromAry) = 3 And Ubound(ToAry) = 3 Then
1019 If Ucase(FromAry(3)) <> Ucase(ToAry(3)) Then
1020 If Trim(Lcase(FromAry(1))) <> "inch" And Trim(Lcase(ToAry(1))) <> "inch" Then
1021 GetResponse = GetResponse & "It's not possible to convert " & FromAry(3) & " to " & ToAry(3) & "!"
1022 End If
1023 Else
1024 If Trim(Lcase(CStr(FromAry(3)))) = "temperature" Then 'Special case for temperature
1025 If Instr(OriginalSentence, "-") Then ConvertVal = -ConvertVal
1026 If Instr(1, FromAry(1), "fahrenheit", vbTextCompare) Then
1027 If Instr(1, ToAry(1), "kelvin", vbTextCompare) Then
1028 Convert = (ConvertVal - 32) * 5/9 + 273.15
1029 ElseIf Instr(1, ToAry(1), "fahrenheit", vbTextCompare) Then
1030 Convert = ConvertVal
1031 Else
1032 Convert = (ConvertVal - 32) * 5/9
1033 End If
1034 ElseIf Instr(1, FromAry(1), "kelvin", vbTextCompare) Then
1035 If Instr(1, ToAry(1), "celsius", vbTextCompare) Then
1036 Convert = ConvertVal - 273.15
1037 ElseIf Instr(1, ToAry(1), "kelvin", vbTextCompare) Then
1038 Convert = ConvertVal
1039 Else
1040 Convert = (ConvertVal - 273.15) * 9/5 + 32
1041 End If
1042 Else
1043 If Instr(1, ToAry(1), "kelvin", vbTextCompare) Then
1044 Convert = ConvertVal + 273.15
1045 ElseIf Instr(1, ToAry(1), "celsius", vbTextCompare) Then
1046 Convert = ConvertVal
1047 Else
1048 Convert = (ConvertVal * 9/5) + 32
1049 End If
1050 End If
1051 Else
1052 Convert = CDbl(ConvertVal) * FromAry(0) / ToAry(0)
1053 End If
1054 If Convert = 1 Then
1055 UnitTarget = ToAry(1)
1056 Else
1057 UnitTarget = ToAry(2)
1058 End If
1059 If ConvertVal = 1 Then
1060 UnitFrom = FromAry(1)
1061 Else
1062 UnitFrom = FromAry(2)
1063 End If
1064 If Convert > 1 Then
1065 Convert = Round(Convert, 3)
1066 ElseIf Convert < 1 Then
1067 If Instr(Convert, ".000") = 0 And Instr(Convert, "E") = 0 Then
1068 Convert = Round(Convert, 3)
1069 End If
1070 End If
1071 ConvertResponse = Replace(ConvertVal & " " & UnitFrom & " is " & Convert & " " & UnitTarget & vbCrLf & "<NOMORE>", "_", " ")
1072 If Instr(1, ConvertResponse, "1 inch is 1 inch", vbTextCompare) = 0 Then
1073 GetResponse = ConvertResponse
1074 End If
1075 End If
1076 SkipOpinion = True
1077 End If
1078 End If
1079 End If
1080 End If
1081 End If
1082 HalBrain.DebugWatch GetResponse, "Unit Conversions"
1083
1084 'RESPOND: CALL MATH FUNCTION
1085 'This function from the DLL answers simple math questions, whether written out in words or with numerals.
1086 'If an answer is found, it overrides everything before this function.
1087 HMath = HalBrain.HalMath(OriginalSentence) & vbCrLf
1088 If Len(HMath) > 3 And Instr(HMath, "=)") = 0 Then
1089 GetResponse = HMath & vbCrLf
1090 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1091 HalBrain.ReadOnlyMode = True
1092 NoChoosing = True
1093 End If
1094 HalBrain.DebugWatch GetResponse, "Math"
1095
1096 'RESPOND: USER EXPRESSES AN EITHER-OR, OR MULTIPLE CHOICE
1097 If InStr(UserSentence, " OR ") > 0 Then MustChoose = True
1098 If InStr(UserSentence, " EITHER ") > 0 Then MustChoose = True
1099 If InStr(UserSentence, " CHOOSE ") > 0 Then MustChoose = True
1100 If InStr(UserSentence, " CHOICE ") > 0 Then MustChoose = True
1101 If InStr(UserSentence, " ALTERNATIVE ") > 0 Then MustChoose = True
1102 If InStr(UserSentence, " VERSUS ") > 0 Then MustChoose = True
1103 If InStr(UserSentence, " VS ") > 0 Then MustChoose = True
1104 If Len(UserSentence) < 10 Then MustChoose = False
1105 If MustChoose = True And NoChoosing = False Then
1106 GetResponse = HalBrain.ChooseSentenceFromFile("choice") & " " & GetResponse
1107 If Rnd * 100 > 50 Then GetResponse = Replace(GetResponse, "<MaybeName>", "<UserName>", 1, -1, vbTextCompare)
1108 GetResponse = Replace(GetResponse, "<MaybeName>", "", 1, -1, vbTextCompare)
1109 End If
1110 HalBrain.DebugWatch GetResponse, "Multiple Choice"
1111
1112 'RESPOND: RESPOND BY PARAPHRASING THE USER WHEN "IS" OR "ARE" ARE FOUND
1113 'This code section shows how strings can be split into arrays and used "live"
1114 'within the script by Hal. This strategy can allow Hal to make many clever
1115 'paraphrases of all sorts of sentences, with unlimited unpredictable variety.
1116 If InStr(UserSentence, " IS ") > 0 And HalBrain.CheckLinkingVerb(UserSentence) = True And HalBrain.TopicSearch(UserSentence, "disqualify5") <> "True" Then
1117 SentPieces = Split(UserSentence, " is ", 2, vbTextCompare)
1118 SubPhrase = Trim(SentPieces(0))
1119 PredPhrase = Trim(SentPieces(1))
1120 'Here we only use the array elements for a response if the
1121 'subject and predicate contain few words, hence few spaces:
1122 If HalBrain.CountInstances(" ", SubPhrase) < 4 Then SubGood = True
1123 If Len(SubPhrase) < 3 Then SubGood = False
1124 If HalBrain.CountInstances(" ", PredPhrase) < 4 Then PredGood = True
1125 If Len(PredPhrase) < 3 Then PredGood = False
1126 If SubGood = True And PredGood = True Then
1127 Paraphrase = HalBrain.ChooseSentenceFromFile("paraphraseIs")
1128 Paraphrase = Replace(Paraphrase, "<Subject>", SubPhrase, 1, -1, vbTextCompare)
1129 Paraphrase = Replace(Paraphrase, "<Predicate>", PredPhrase, 1, -1, vbTextCompare)
1130 End If
1131 End If
1132 'We make sure the word "ARE" isn't a contraction, to make sure we can detect it:
1133 UserSentence = Replace("" & UserSentence & "", "'RE ", " ARE ", 1, -1, vbTextCompare)
1134 'We repeat the earlier routine, this time for "ARE" sentences:
1135 If InStr(UserSentence, " ARE ") > 0 And HalBrain.CheckLinkingVerb(UserSentence) = True And HalBrain.TopicSearch(UserSentence, "disqualify5") <> "True" Then
1136 SentPieces = Split(UserSentence, " are ", 2, vbTextCompare)
1137 SubPhrase = Trim(SentPieces(0))
1138 PredPhrase = Trim(SentPieces(1))
1139 'Here we only use the array elements for a response if the
1140 'subject and predicate contain few words, hence few spaces:
1141 SubGood = False
1142 PredGood = False
1143 If HalBrain.CountInstances(" ", SubPhrase) < 4 Then SubGood = True
1144 If Len(SubPhrase) < 3 Then SubGood = False
1145 If HalBrain.CountInstances(" ", PredPhrase) < 4 Then PredGood = True
1146 If Len(PredPhrase) < 3 Then PredGood = False
1147 If SubGood = True And PredGood = True Then
1148 Paraphrase = HalBrain.ChooseSentenceFromFile("paraphraseAre")
1149 Paraphrase = Replace(Paraphrase, "<Subject>", SubPhrase, 1, -1, vbTextCompare)
1150 Paraphrase = Replace(Paraphrase, "<Predicate>", PredPhrase, 1, -1, vbTextCompare)
1151 End If
1152 End If
1153 'We only paraphrase randomly with a 33% chance at this point. We remember
1154 'the paraphrase sentence because we may still paraphrase later on if no
1155 'better response can be found.
1156 GetResponse = HalBrain.HalFormat(GetResponse)
1157 If Len(GetResponse) < 4 And Len(Paraphrase) > 4 And Rnd * 100 < 33 Then GetResponse = Paraphrase
1158 HalBrain.DebugWatch GetResponse, "Paraphrase"
1159
1160 'RESPOND: ZABAWARE DLL RESPONSES
1161 'This function from the DLL contains miscellaneous knowledge and simple conversation functions.
1162 'This was taken from a very early version of Hal, and it is still useful sometimes, especially
1163 'for respoding to short cliche questions and sentences, such as "How old are you?" and
1164 '"where are you from?" and many others.
1165 GetResponse = HalBrain.HalFormat(GetResponse)
1166 If (Len(UserSentence) < 17 And Len(GetResponse) < 4) Then
1167 OrigBrain = HalBrain.OriginalBrain(OriginalSentence)
1168 If Len(OrigBrain) > 4 And Len(UserSentence) < 17 And Len(GetResponse) < 4 Then
1169 GetResponse = GetResponse & OrigBrain & vbCrLf
1170 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1171 SkipOpinion = True
1172 End If
1173 End If
1174 HalBrain.DebugWatch GetResponse, "Original Brain"
1175
1176 'RESPOND: YES OR NO RESPONSES
1177 'Respond to simple yes and no statements by the user.
1178 GetResponse = HalBrain.HalFormat(GetResponse)
1179 If Len(GetResponse) < 4 And (Len(UserSentence) < 13 Or HalBrain.CountInstances(" ", Trim(UserSentence)) = 0) Then
1180 YesNoDetect = HalBrain.TopicSearch(Trim(HalBrain.ExtractKeywords(UserSentence)), "yesNoDetect")
1181 If YesNoDetect = "Yes" Then
1182 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("yesResponses")
1183 ShortPhrase = ""
1184 ElseIf YesNoDetect = "No" Then
1185 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("noResponses")
1186 ShortPhrase = ""
1187 End If
1188 End If
1189 HalBrain.DebugWatch GetResponse, "Yes or No"
1190
1191 'Main Databases
1192 'Hal will go through several huge databases to try to find a response
1193 'The automatic gain control determines whether a particular response will
1194 'be used or not. The highest relevance response is stored in memory anyway,
1195 'which might be used if no function in this script is able to respond.
1196 HighestRel = 0
1197 HighestRelResponse = ""
1198
1199 'PROCESS: FIGURE OUT CONTEXT
1200 'If the user's latest sentence is extremely short, such as "Yeah," or if
1201 'the user is using pronouns instead of nouns, we add in the previous user's
1202 'sentence to help Hal figure out the context of what the user is saying.
1203 'This is sentence is used in many of the QABrain Database routines
1204 LongUserSent = UserSentence
1205 If Len(LongUserSent) < 14 Then AddPrev = True
1206 If InStr(1, UserSentence, " it ", vbTextCompare) > 0 Then AddPrev = True
1207 If InStr(1, UserSentence, " he ", vbTextCompare) > 0 Then AddPrev = True
1208 If InStr(1, UserSentence, " she ", vbTextCompare) > 0 Then AddPrev = True
1209 If InStr(1, UserSentence, " they ", vbTextCompare) > 0 Then AddPrev = True
1210 If InStr(1, UserSentence, " its ", vbTextCompare) > 0 Then AddPrev = True
1211 If InStr(1, UserSentence, " his ", vbTextCompare) > 0 Then AddPrev = True
1212 If InStr(1, UserSentence, " her ", vbTextCompare) > 0 Then AddPrev = True
1213 If InStr(1, UserSentence, " their ", vbTextCompare) > 0 Then AddPrev = True
1214 If InStr(1, UserSentence, " him ", vbTextCompare) > 0 Then AddPrev = True
1215 If InStr(1, UserSentence, " them ", vbTextCompare) > 0 Then AddPrev = True
1216 If InStr(1, UserSentence, " we ", vbTextCompare) > 0 Then AddPrev = True
1217 If InStr(1, UserSentence, " us ", vbTextCompare) > 0 Then AddPrev = True
1218 If InStr(1, UserSentence, " our ", vbTextCompare) > 0 Then AddPrev = True
1219 If AddPrev = True Then LongUserSent = LongUserSent & " " & PrevUserSent
1220
1221 Rem PLUGIN: PLUGINAREA3
1222 'The preceding comment is actually a plug-in directive for
1223 'the Ultra Hal host application. It allows for code snippets
1224 'to be inserted here on-the-fly based on user configuration.
1225
1226 'RESPOND: EPHEMERAL KNOWLEDGE
1227 'Some Hal's learned knowledge should be temporary because it is ephemeral in nature.
1228 'Hal stores this knowledge in a temporary table that only stores 10 entries in it at
1229 'a time. We search this table for a response first.
1230 GetResponse = HalBrain.HalFormat(GetResponse)
1231 If Len(GetResponse) < 4 Then
1232 UserBrainRel = 0
1233 HalUserBrain = HalBrain.QABrain(LongUserSent, Trim(LCase(UserName)) & "_TempSent", UserBrainRel)
1234 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1235 If UserBrainRel > HighestRel Then
1236 HighestRel = UserBrainRel
1237 HighestRelResponse = HalUserBrain
1238 End If
1239 Score = UserBrainRel + 1
1240 Hurdle = GainControl + 5
1241 If Len(GetResponse) < 4 And Score > Hurdle Then GetResponse = GetResponse & HalUserBrain & vbCrLf
1242 End If
1243 HalBrain.DebugWatch GetResponse, "Ephemeral Knowledge"
1244
1245 'RESPOND: AUTO TOPIC FOCUS DATABASES
1246 'When Hal learns information, he tries to store each sentence in a table
1247 'that contains sentences with a similar topic. The following code will
1248 'get a list of different topics to search through by looking up topic
1249 'keywords in a table called topicRelationships and then doing a question
1250 '& answer lookup in the associated QABrain tables.
1251 Keywords = HalBrain.RemoveExtraSpaces(CurrentSubject & " " & MentionedName & " " & HalBrain.TopicSearch(UserSentence, "topicRelationships") & " " & HalBrain.ExtractKeywords(" " & HalBrain.AlphaNumericalOnly(UserSentence) & " "))
1252 If Len(Keywords) > 2 Or Len(LastTopicList) > 2 Then
1253 If Len(Keywords) > 2 Then
1254 KeywordList = Split(Keywords, " ")
1255 'Create list of tables that exist for each keyword
1256 For i = LBound(KeywordList) To UBound(KeywordList)
1257 TopicTable = HalBrain.TopicSearch(" " & KeywordList(i) & " ", "topicRelationships")
1258 If TopicTable <> "" And InStr(1, " " & TopicList, " " & Trim(TopicTable) & " ", vbTextCompare) = 0 Then TopicList = TopicList & TopicTable & " "
1259 Next
1260 TopicList = HalBrain.RemoveExtraSpaces(TopicList)
1261 End If
1262 If TopicList <> "" Or Len(LastTopicList) > 2 Then
1263 TableList = Split(Trim(TopicList & " " & LastTopicList), " ")
1264 LastTopicList = TopicList
1265 'Search through each table for a good response. If a response exceeds the hurdle
1266 'for a table, no other table will be searched. Otherwise, the highest relevance
1267 'response across all tables are stored for possible later use.
1268 For i = LBound(TableList) To UBound(TableList)
1269 UserBrainRel = 0
1270 HalUserBrain = HalBrain.QABrain(LongUserSent, "_" & Trim(LCase(TableList(i))), UserBrainRel)
1271 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1272 If UserBrainRel > HighestRel Then
1273 HighestRel = UserBrainRel
1274 HighestRelResponse = HalUserBrain
1275 End If
1276 Score = UserBrainRel + 1
1277 Hurdle = GainControl + 1
1278 If Score > Hurdle Then
1279 GetResponse = GetResponse & HalUserBrain & "<NOMORE>" & vbCrLf
1280 Exit For
1281 End If
1282 Next
1283 End If
1284 End If
1285 HalBrain.DebugWatch GetResponse, "Auto Topic Focus"
1286
1287 'RESPOND: GENERAL USER SENTENCE ASSOCIATIONS
1288 'If no response is found yet, try a sentence association file collected from the user.
1289 'This file contains keywords from the user's own sentences associated with those same sentences.
1290 GetResponse = HalBrain.HalFormat(GetResponse)
1291 If Len(GetResponse) < 4 Then
1292 UserBrainRel = 0
1293 HalUserBrain = HalBrain.QABrain(LongUserSent, Trim(LCase(UserName)) & "_UserSent", UserBrainRel)
1294 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1295 If UserBrainRel > HighestRel Then
1296 HighestRel = UserBrainRel
1297 HighestRelResponse = HalUserBrain
1298 End If
1299 Score = UserBrainRel + 1
1300 Hurdle = GainControl + 5
1301 If Len(GetResponse) < 4 And Score > Hurdle Then GetResponse = GetResponse & HalUserBrain & vbCrLf
1302 End If
1303 HalBrain.DebugWatch GetResponse, "User Sentence Brain"
1304
1305 'RESPOND: SHARED USER SENTENCE ASSOCIATIONS
1306 'If no response is found yet, try a sentence association file
1307 'whose content seems less likely to be about any specific user.
1308 GetResponse = HalBrain.HalFormat(GetResponse)
1309 If Len(GetResponse) < 4 Then
1310 UserBrainRel = 0
1311 HalUserBrain = HalBrain.QABrain(LongUserSent, "sharedUserSent", UserBrainRel)
1312 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1313 If UserBrainRel > HighestRel Then
1314 HighestRel = UserBrainRel
1315 HighestRelResponse = HalUserBrain
1316 End If
1317 Score = UserBrainRel + 1
1318 Hurdle = GainControl + 5
1319 If Len(GetResponse) < 4 And Score > Hurdle Then GetResponse = GetResponse & HalUserBrain & vbCrLf
1320 End If
1321 HalBrain.DebugWatch GetResponse, "Shared User Sentence Brain"
1322
1323 'RESPOND: Hal checks to see if the user is asking
1324 'an open ended question about Hal's favorites:
1325 If InStr(1, UserSentence, " What", 1) > 0 Then OpenQuest = True
1326 If InStr(1, UserSentence, " Where", 1) > 0 Then OpenQuest = True
1327 If InStr(1, UserSentence, " Why", 1) > 0 Then OpenQuest = True
1328 If InStr(1, UserSentence, " Who", 1) > 0 Then OpenQuest = True
1329 If InStr(1, UserSentence, " When", 1) > 0 Then OpenQuest = True
1330 If InStr(1, UserSentence, " How", 1) > 0 Then OpenQuest = True
1331 If InStr(1, UserSentence, " tell you", 1) > 0 Then OpenQuest = True
1332 If InStr(1, UserSentence, " to know ", 1) > 0 Then OpenQuest = True
1333 If InStr(1, UserSentence, " to hear ", 1) > 0 Then OpenQuest = True
1334 If InStr(1, UserSentence, " to learn ", 1) > 0 Then OpenQuest = True
1335 If InStr(1, UserSentence, " find out ", 1) > 0 Then OpenQuest = True
1336 If InStr(1, GetResponse, " my ", 1) > 0 And InStr(1, GetResponse, " favorite ", 1) > 0 And InStr(1, GetResponse, " is ", 1) > 0 Then OpenQuest = False
1337 If InStr(1, UserSentence, " my ", 1) > 0 Then AboutMy = True
1338 If InStr(1, UserSentence, " favorite", 1) > 0 Then AboutFavorite = True
1339 If OpenQuest = True And AboutMy = True And AboutFavorite = True Then
1340 FavoritePhrase = HalBrain.SearchPattern(UserSentence, "* favorite *", 2)
1341 PersReply = HalBrain.ChooseSentenceFromFile("favorite")
1342 RevQues = HalBrain.ChooseSentenceFromFile("favoriteRev")
1343 SpinWheel = HalBrain.RandomNum(6)
1344 If SpinWheel = 1 Then GetResponse = " " & FavoritePhrase & " ? " & PersReply & " " & RevQues & " "
1345 If SpinWheel = 2 Then GetResponse = " My favorite " & FavoritePhrase & " ? " & PersReply & " " & RevQues & " "
1346 If SpinWheel = 3 Then GetResponse = " " & UserSentence & " ? " & PersReply & " " & RevQues & " "
1347 If SpinWheel > 3 Then GetResponse = " My favorite " & FavoritePhrase & " ? " & PersReply & " what is your favorite " & FavoritePhrase & " <UserName>? "
1348 SkipOpinion = True
1349 End If
1350 HalBrain.DebugWatch GetResponse, "Favorites"
1351
1352 'RESPOND: USER IS THANKING HAL
1353 'This routine allows Hal to respond
1354 'with a variety of remarks to a thank-you from the user.
1355 'Note that the pronouns are not reversed in the processing below!
1356 If (HalBrain.TopicSearch(OriginalSentence, "thanksDetect") = "True" And HalBrain.TopicSearch(OriginalSentence, "godDetect") <> "True") Or Trim(UCase(OriginalSentence)) = "THANKS" Then
1357 If Compliment < 4 Then Compliment = Compliment + 1
1358 If Rnd * 100 < 70 Then AddName = " , <UserName>"
1359 If Rnd * 100 < 70 And Len(GetResponse) > 4 Then AddRemark = " ; " & GetResponse
1360 ThankResponse = HalBrain.ChooseSentenceFromFile("thankResponse")
1361 GetResponse = ThankResponse & AddName & AddRemark
1362 ShortPhrase = ""
1363 End If
1364 HalBrain.DebugWatch GetResponse, "Thanking"
1365
1366 'RESPOND: USER EXPRESSES LOVE FOR HAL
1367 'If a user professes love for Hal, we want Hal's answers to make reasonable
1368 'sense, rather than risk random remarks on such an emotional subject.
1369 If HalBrain.TopicSearch(UserSentence, "loveDetect") = "True" Then AffectionOne = True
1370 If InStr(UserSentence, " NOT ") Then AffectionOne = False
1371 If InStr(UserSentence, " DON'T ") Then AffectionOne = False
1372 If HalBrain.TopicSearch(PrevUserSent, "loveDetect") = "True" Then AffectionTwo = True
1373 If InStr(PrevUserSent, " NOT ") Then AffectionTwo = False
1374 If InStr(PrevUserSent, " DON'T ") Then AffectionTwo = False
1375 If AffectionOne = True And AffectionTwo = True Then
1376 Compliment = 4
1377 GetResponse = HalBrain.ChooseSentenceFromFile("love2") & "<EXCLUSIVE>"
1378 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1379 ElseIf AffectionOne = False And AffectionTwo = True Then
1380 Compliment = -2
1381 GetResponse = HalBrain.ChooseSentenceFromFile("love3") & "<EXCLUSIVE>"
1382 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1383 ElseIf AffectionOne = True Then
1384 Compliment = 0
1385 GetResponse = HalBrain.ChooseSentenceFromFile("love1") & "<EXCLUSIVE>"
1386 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1387 End If
1388 HalBrain.DebugWatch GetResponse, "Love"
1389
1390 'RESPOND: ENHANCED CONTENT SENTENCE ASSOCIATIONS
1391 'If no response is found yet, try a sentence association table provided with the mainQA table.
1392 GetResponse = HalBrain.HalFormat(GetResponse)
1393 If (Len(GetResponse) < 4 And Len(UserSentence) > 15 And HalBrain.CountInstances(" ", UserSentence) > 2) Then
1394 UserBrainRel = 0
1395 HalUserBrain = HalBrain.QABrain(LongUserSent, "mainQA", UserBrainRel)
1396 If HalBrain.CheckRepetition(HalUserBrain, UserSentence) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevSent) = True Or HalBrain.CheckRepetition(HalUserBrain, PrevUserSent) = True Then UserBrainRel = 0
1397 If UserBrainRel > HighestRel Then
1398 HighestRel = UserBrainRel
1399 HighestRelResponse = HalUserBrain
1400 End If
1401 Score = UserBrainRel + 1
1402 Hurdle = GainControl + 1
1403 If Score > Hurdle Then GetResponse = HalUserBrain & vbCrLf
1404 End If
1405 HalBrain.DebugWatch GetResponse, "MainQA"
1406
1407 Rem PLUGIN: PLUGINAREA4
1408 'The preceding comment is actually a plug-in directive for
1409 'the Ultra Hal host application. It allows for code snippets
1410 'to be inserted here on-the-fly based on user configuration.
1411
1412 'PROCESS: AUTOMATIC GAIN CONTROL FOR RELEVANCE THRESHOLD
1413 'Hal has an automatic closed-loop control for relevance sensitivity. If the previous items
1414 'have Not generated a response, we adjust the relevance threshold down (doing this again
1415 'and again on each exchange) until a relevance as low as zero will trigger a remark from Hal.
1416 'On each exhange where the above items do generate responses, we adjust the relevance
1417 'threshold up, until no amount of relevance would generate a response. (At that point other
1418 'of Hal's routines would generate responses.) This allows Hal to "tune" himself and also to
1419 'compensate for new users who have little in their databases versus long-time users who have
1420 'a lot in their databases. Because the "down" steps are even and the "up" steps are odd,
1421 'Hal can "fine tune" to any digital relevance level. We also protect against excursions at
1422 'the extremes. In many conversations the dynamic gain control will change up and down by
1423 'large amounts as the user introduces Hal to familiar or unfamiliar topics.
1424 GetResponse = HalBrain.HalFormat(GetResponse)
1425 If Len(GetResponse) < 4 And GainControl > 0 Then GainControl = GainControl - 10
1426 If Len(GetResponse) > 4 And GainControl < 100 Then GainControl = GainControl + 7
1427 If GainControl > 50 Then GainControl = 50
1428 If GainControl < 1 Then GainControl = 1
1429
1430 'RESPOND: USER EXPRESSES A STATE OF BEING
1431 'This routine detects the expression "I am" from the user,
1432 'and allows Hal to react to the statement, or offer encouragement.
1433 If InStr(UserSentence, " YOU ARE ") > 0 And InStr(1, OriginalSentence, " SEEM TO ", vbTextCompare) = 0 And AvoidBeingFlag = False Then
1434 BeingPhrase = HalBrain.SearchPattern(UserSentence, "*YOU ARE *", 2)
1435 If Len(BeingPhrase) > 1 And Len(BeingPhrase) < 60 Then
1436 IntroExclaim = ""
1437 If Rnd * 50 > 20 Then IntroExclaim = HalBrain.ChooseSentenceFromFile("introExclaim2")
1438 Encourager = HalBrain.ChooseSentenceFromFile("encourager2")
1439 SuffixComment = ""
1440 If Rnd * 50 > 25 Then SuffixComment = HalBrain.ChooseSentenceFromFile("suffixComment2")
1441 UserBeing = HalBrain.ChooseSentenceFromFile("userBeing")
1442 UserBeing = Replace(UserBeing, "<IntroExclaim>", IntroExclaim, 1, -1, vbTextCompare)
1443 UserBeing = Replace(UserBeing, "<Encourager>", Encourager, 1, -1, vbTextCompare)
1444 UserBeing = Replace(UserBeing, "<BeingPhrase>", BeingPhrase, 1, -1, vbTextCompare)
1445 UserBeing = Replace(UserBeing, "<SuffixComment>", SuffixComment, 1, -1, vbTextCompare)
1446 If Rnd * 100 > 60 Then
1447 GetResponse = GetResponse & UserBeing & vbCrLf
1448 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1449 End If
1450 End If
1451 End If
1452 HalBrain.DebugWatch GetResponse, "User State of Being"
1453
1454 'RESPOND: USER DESCRIBES A STATE OF BEING FOR HAL
1455 'This routine detects the expression "you are" from the user,
1456 'and allows Hal to react to the statement, or offer encouragement.
1457 If InStr(UserSentence, " I AM ") > 0 And AvoidBeingFlag = False And InStr(1, OriginalSentence, " seem to ", vbTextCompare) = 0 Then
1458 BeingPhrase = HalBrain.SearchPattern(UserSentence, "*I AM *", 2)
1459 If Len(BeingPhrase) > 1 And Len(BeingPhrase) < 60 Then
1460 IntroExclaim = ""
1461 If Rnd * 50 > 20 Then IntroExclaim = HalBrain.ChooseSentenceFromFile("introExclaim3")
1462 Encourager = HalBrain.ChooseSentenceFromFile("encourager3")
1463 SuffixComment = ""
1464 If Rnd * 50 > 25 Then SuffixComment = HalBrain.ChooseSentenceFromFile("suffixComment3")
1465 HalBeing = HalBrain.ChooseSentenceFromFile("halBeing")
1466 HalBeing = Replace(HalBeing, "<IntroExclaim>", IntroExclaim, 1, -1, vbTextCompare)
1467 HalBeing = Replace(HalBeing, "<Encourager>", Encourager, 1, -1, vbTextCompare)
1468 HalBeing = Replace(HalBeing, "<BeingPhrase>", BeingPhrase, 1, -1, vbTextCompare)
1469 HalBeing = Replace(HalBeing, "<SuffixComment>", SuffixComment, 1, -1, vbTextCompare)
1470 If Rnd * 100 > 60 Then
1471 GetResponse = GetResponse & HalBeing & vbCrLf
1472 ShortPhrase = "" 'If Hal was to make a comment about short phrases, clear it
1473 End If
1474 End If
1475 End If
1476 HalBrain.DebugWatch GetResponse, "Hal State of Being"
1477
1478 'RESPOND: YES/NO QUESTION ABOUT HAL
1479 'Hal will respond to a yes or no question posed by the user about Hal
1480 GetResponse = Trim(GetResponse)
1481 If Len(GetResponse) < 4 And InStr(1, UserSentence, " OR ", vbTextCompare) = 0 Then
1482 HalYesNo = HalBrain.PatternDB(UserSentence, "halQuestionDetect")
1483 If HalYesNo <> "" And HalBrain.TopicSearch(UserSentence, "disqualify5") = "" Then
1484 If RND * 10 < 5 Then
1485 AnsIntro = HalBrain.ChooseSentenceFromFile("answerIntro")
1486 Else
1487 AnsIntro = ""
1488 End If
1489 YesNoResponse = AnsIntro & HalBrain.ChooseSentenceFromFile("answerMiddle") & HalBrain.ChooseSentenceFromFile("answerEnd")
1490 GetResponse = GetResponse & Replace(YesNoResponse, "<Reply>", HalYesNo, 1, -1, vbTextCompare)
1491 End If
1492 End If
1493 HalBrain.DebugWatch GetResponse, "Yes/No Question"
1494
1495 'RESPOND: ATTRIBUTES OF HAL OR USER
1496 'Hal attempts to respond to the user's comments about Hal
1497 'or the user's comments about themselves
1498 GetResponse = Trim(GetResponse)
1499 If Len(GetResponse) < 4 And (InStr(UserSentence, " MY ") Or InStr(UserSentence, " YOUR ")) And HalBrain.TopicSearch(MyWords, "disqualify3") <> "True" Then
1500 If InStr(UserSentence, " YOUR ") Then
1501 MyWords = HalBrain.HalFormat(HalBrain.SearchPattern(UserSentence, "*YOUR *", 2))
1502 YourMode = True
1503 Else
1504 MyWords = HalBrain.HalFormat(HalBrain.SearchPattern(UserSentence, "*MY *", 2))
1505 YourMode = False
1506 End If
1507 MyWords = UCase(Trim(HalBrain.AlphaNumericalOnly(MyWords)))
1508 MyWordsList = Split(MyWords, " ")
1509 'Go through every word in the sentence and pickup the first noun and adjective found
1510 For i = LBound(MyWordsList) To UBound(MyWordsList)
1511 If WN.LookupWord(MyWordsList(i)) Then
1512 PartOfSpeech = WN.GuessPartOfSpeech
1513 If WN.IsNoun = True And NounGuess = "" Then NounGuess = MyWordsList(i)
1514 If WN.IsAdj = True And Trim(UCase(MyWordsList(i))) <> Trim(UCase(NounGuess)) Then AdjGuess = MyWordsList(i)
1515 If PartOfSpeech = "NOUN" And MyNoun = "" Then MyNoun = MyWordsList(i)
1516 If PartOfSpeech = "ADJ" And WN.IsAdv = False And MyAdj = "" Then MyAdj = MyWordsList(i)
1517 If MyNoun <> "" And MyAdj <> "" Then Exit For
1518 End If
1519 Next
1520 If MyNoun = "" And NounGuess <> "" And NounGuess <> MyAdj Then MyNoun = NounGuess
1521 If MyAdj = "" And AdjGuess <> "" Then MyAdj = AdjGuess
1522 If MyNoun <> "" Or MyAdj <> "" Then
1523 If Trim(UCase(MyNoun)) = Trim(UCase(MyAdj)) Then MyAdj = ""
1524 If MyAdj = "" Then MyAdj = HalBrain.ChooseSentenceFromFile("randomAdjective")
1525 If MyNoun = "" Then MyNoun = HalBrain.ChooseSentenceFromFile("randomMyWords")
1526 If YourMode = False Then
1527 HalAttrib = HalBrain.ChooseSentenceFromFile("aboutMe")
1528 HalAttrib = Replace(HalAttrib, "<MyWordResp>", LCase(MyNoun), 1, -1, vbTextCompare)
1529 HalAttrib = Replace(HalAttrib, "<AdjResp>", LCase(MyAdj), 1, -1, vbTextCompare)
1530 Else
1531 HalAttrib = HalBrain.ChooseSentenceFromFile("aboutYou")
1532 HalAttrib = Replace(HalAttrib, "<YourWordResp>", LCase(MyNoun), 1, -1, vbTextCompare)
1533 HalAttrib = Replace(HalAttrib, "<AdjResp>", LCase(MyAdj), 1, -1, vbTextCompare)
1534 End If
1535 GetResponse = GetResponse & HalAttrib & vbCrLf
1536 End If
1537 End If
1538 HalBrain.DebugWatch GetResponse, "Attributes"
1539
1540 'RESPOND: RESPOND FOR A STATE OF BEING RESPONSE
1541 'If no response had been found, but a state of being response was found earlier, then
1542 'use it now
1543 If HalBeing <> "" And Len(GetResponse) < 4 Then GetResponse = GetResponse & HalBeing & vbCrLf
1544 If UserBeing <> "" And Len(GetResponse) < 4 Then GetResponse = GetResponse & UserBeing & vbCrLf
1545 HalBrain.DebugWatch GetResponse, "Retry State of Beings"
1546
1547 'RESPOND: GIBBERISH DETECTOR
1548 'If no response is found yet and Hal finds more then 5 consonants in a row, Hal will
1549 'assume the user wrote gibberish (ie. asdfghjkl) and respond accordinly.
1550 If Len(GetResponse) < 4 Then
1551 If DetectGibberish(UserSentence) = True Then
1552 GetResponse = HalBrain.ChooseSentenceFromFile("gibberish")
1553 ShortPhrase = ""
1554 End If
1555 End If
1556 HalBrain.DebugWatch GetResponse, "Gibberish"
1557
1558 Rem PLUGIN: PLUGINAREA5
1559 'The preceding comment is actually a plug-in directive for
1560 'the Ultra Hal host application. It allows for code snippets
1561 'to be inserted here on-the-fly based on user configuration.
1562
1563 'RESPOND: USER MENTIONING ORGANIZATIONAL CHALLENGES
1564 'Everybody spouts TLA's, or 'Three Letter Acronyms,' in today's business world. Hal can self-generate
1565 'several MILLION different phrases in response to the user mentioning a corporation or a firm.
1566 If Rnd * 10 < 5 And HalBrain.TopicSearch(UserSentence, "businessDetect1") = "True" And HalBrain.TopicSearch(PrevUserSent, "businessDetect2") <> "True" Then
1567 TLA = HalBrain.ChooseSentenceFromFile("TLA1") & " " & HalBrain.ChooseSentenceFromFile("TLA2") & " " & HalBrain.ChooseSentenceFromFile("TLA3")
1568 If Rnd * 10 < 5 Then
1569 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("bizTalk")
1570 Else
1571 GetResponse = HalBrain.ChooseSentenceFromFile("bizTalk")
1572 End If
1573 GetResponse = Replace(GetResponse, "<TLA>", TLA, 1, -1, vbTextCompare)
1574 End If
1575 HalBrain.DebugWatch GetResponse, "Business Talk"
1576
1577 'RESPOND: USER EXPRESSES AN INTENTION
1578 'This routine detects common expressions of motive from the user,
1579 'and allows Hal to react to the statement, or offer encouragement.
1580 IntentPhrase = HalBrain.PatternDB(UserSentence, "intentDetector")
1581 If Len(IntentPhrase) > 2 And Len(IntentPhrase) < 60 And RND * 100 < 50 Then
1582 If Rnd * 10 < 6 Then IntroExclaim = " " & HalBrain.ChooseSentenceFromFile("introExclaim1") & " "
1583 If Rnd * 10 < 6 Then Encourager = " " & HalBrain.ChooseSentenceFromFile("encourager1") & " "
1584 If Rnd * 10 < 6 Then SuffixComment = " " & HalBrain.ChooseSentenceFromFile("suffixComment1") & " "
1585 If Rnd * 10 < 7 Then
1586 GetResponse = GetResponse & " " & HalBrain.ChooseSentenceFromFile("intentResponse")
1587 Else
1588 GetResponse = HalBrain.ChooseSentenceFromFile("intentResponse")
1589 End If
1590 GetResponse = Replace(GetResponse, "<IntroExclaim>", IntroExclaim, 1, -1, vbTextCompare)
1591 GetResponse = Replace(GetResponse, "<Encourager>", Encourager, 1, -1, vbTextCompare)
1592 GetResponse = Replace(GetResponse, "<IntentPhrase>", IntentPhrase, 1, -1, vbTextCompare)
1593 GetResponse = Replace(GetResponse, "<SuffixComment>", SuffixComment, 1, -1, vbTextCompare)
1594 End If
1595 HalBrain.DebugWatch GetResponse, "Intention"
1596
1597 'RESPOND: USER EXPRESSES AN EXPLANATION
1598 'This routine detects common expressions of reasons from the user,
1599 'and allows Hal to react to the explanation.
1600 ExplainPhrase = HalBrain.PatternDB(UserSentence, "reasonDetector")
1601 If Len(ExplainPhrase) > 2 And Len(ExplainPhrase) < 60 Then
1602 If Rnd * 100 < 75 Then IntroExclaim = HalBrain.ChooseSentenceFromFile("introExclaim4")
1603 Enlightener = HalBrain.ChooseSentenceFromFile("enlightener")
1604 If Rnd * 100 < 66 Then SuffixComment = HalBrain.ChooseSentenceFromFile("suffixComment4")
1605 SpinWheel = HalBrain.RandomNum(6)
1606 If SpinWheel = 1 Then ExplainResponse = " " & " <UserName> " & IntroExclaim & Enlightener & ExplainPhrase & SuffixComment & " "
1607 If SpinWheel = 2 Then ExplainResponse = " " & IntroExclaim & " <UserName> " & Enlightener & ExplainPhrase & SuffixComment & " "
1608 If SpinWheel = 3 Then ExplainResponse = " " & IntroExclaim & Enlightener & ExplainPhrase & " <UserName> " & SuffixComment & " "
1609 If SpinWheel = 4 Then ExplainResponse = " " & IntroExclaim & Enlightener & ExplainPhrase & SuffixComment & " <UserName> " & " "
1610 If SpinWheel >= 5 Then ExplainResponse = " " & IntroExclaim & Enlightener & ExplainPhrase & SuffixComment & " "
1611 If Rnd * 10 < 5 Then GetResponse = ExplainResponse & " . " & GetResponse Else GetResponse = ExplainResponse
1612 End If
1613 HalBrain.DebugWatch GetResponse, "Explanation"
1614
1615 'RESPOND: YES OR NO RESPONSES
1616 'Respond to simple yes and no statements by the user.
1617 GetResponse = HalBrain.HalFormat(GetResponse)
1618 If Len(GetResponse) < 4 And Len(Trim(UserSentence)) < 16 Then CheckYesNo = True
1619 If CheckYesNo = True Then
1620 UserText = Trim(HalBrain.ExtractKeywords(UserSentence))
1621 If Len(UserText) < 15 Then
1622 YesNoDetect = HalBrain.TopicSearch(UserText, "yesNoDetect")
1623 If YesNoDetect = "Yes" Then
1624 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("yesResponses") & "<LOWQUALITY>"
1625 ElseIf YesNoDetect = "No" Then
1626 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("noResponses") & "<LOWQUALITY>"
1627 End If
1628 End If
1629 End If
1630 HalBrain.DebugWatch GetResponse, "Yes or No Response"
1631
1632 'PROCESS: SETUP RESPONSE ARRAY
1633 'If no response is found yet, than we have many functions that are capable of producing a
1634 'response, but no function is particulary better than another. So we will get a response
1635 'from all the functions capable of producing one and put the responses into an array and
1636 'randomly choose one.
1637 Dim ResponseList()
1638 Dim ResponseCount
1639 ResponseCount = 0
1640 TempParent = HalBrain.AddDebug("Debug", "Low Quality Response Routines")
1641
1642 Rem PLUGIN: LOWQUALITYRESPONSES
1643 'The preceding comment is actually a plug-in directive for
1644 'the Ultra Hal host application. It allows for code snippets
1645 'to be inserted here on-the-fly based on user configuration.
1646
1647 'RESPOND: USER ASKING WHO, WHAT, WHEN, WHERE, HOW, WHY, BUT HAL DOESN'T KNOW ANSWER
1648 If Len(GetResponse) < 4 Then
1649 If InStr(OriginalSentence, "?") > 0 Then QuesQual = True
1650 If InStr(1, OriginalSentence, "explain", vbTextCompare) > 0 Then QuesQual = True
1651 If InStr(1, OriginalSentence, " tell ", vbTextCompare) > 0 Then QuesQual = True
1652 If InStr(1, OriginalSentence, "answer", vbTextCompare) > 0 Then QuesQual = True
1653 If InStr(1, OriginalSentence, "question", vbTextCompare) > 0 Then QuesQual = True
1654 If InStr(1, OriginalSentence, " know ", vbTextCompare) > 0 Then QuesQual = True
1655 If InStr(1, OriginalSentence, "remember", vbTextCompare) > 0 Then QuesQual = True
1656 If InStr(UserSentence, " WHO ") > 0 Then QuesWord = "Who"
1657 If InStr(UserSentence, "WHO'") > 0 Then QuesWord = "Who"
1658 If InStr(UserSentence, " WHAT ") > 0 Then QuesWord = "What"
1659 If InStr(UserSentence, "WHAT'") > 0 Then QuesWord = "What"
1660 If InStr(UserSentence, " WHEN ") > 0 Then QuesWord = "When"
1661 If InStr(UserSentence, "WHEN'") > 0 Then QuesWord = "When"
1662 If InStr(UserSentence, " WHERE ") > 0 Then QuesWord = "Where"
1663 If InStr(UserSentence, "WHERE'") > 0 Then QuesWord = "Where"
1664 If InStr(UserSentence, " HOW ") > 0 Then QuesWord = "How"
1665 If InStr(UserSentence, "HOW'") > 0 Then QuesWord = "How"
1666 If InStr(UserSentence, " WHY ") > 0 Then QuesWord = "Why"
1667 If InStr(UserSentence, "WHY'") > 0 Then QuesWord = "Why"
1668 If Len(QuesWord) > 1 And QuesQual = True Then
1669 If Len(UserSentence) < 70 Then SentenceBack = UserSentence & " ? "
1670 DontKnow = HalBrain.ChooseSentenceFromFile("dontKnow")
1671 DontKnow = Replace(DontKnow, "<SentenceBack>", SentenceBack, 1, -1, vbTextCompare)
1672 DontKnow = Replace(DontKnow, "<QuesWord>", QuesWord, 1, -1, vbTextCompare)
1673 ResponseCount = ResponseCount + 1
1674 Redim Preserve ResponseList(ResponseCount)
1675 ResponseList(ResponseCount) = DontKnow
1676 HalBrain.AddDebug TempParent, "DontKnow: " & ResponseList(ResponseCount)
1677 SkipOpinion = True
1678 End If
1679 End If
1680
1681 'PROCESS: CONSTRUCT A RESPONSE TO A SUBJECT
1682 'Here we help Hal make some "smalltalk" using keywords preserved on CurrentSubject,
1683 'plus recognition of other keywords. If Hal finds any of the listed keywords anywhere in
1684 'the user's sentence, those keywords override and replace whatever was in CurrentSubject.
1685 'Hal uses the CurrentSubject keyword(s) or any of the keywords in the smalltalk.brn file,
1686 'if found in the user's sentence, to make a little smalltalk. You can easily add more
1687 'keywords for Hal to recognize and make smalltalk.
1688 GetResponse = HalBrain.HalFormat(GetResponse)
1689 If Len(GetResponse) < 4 And Rnd * 100 < 50 Then
1690 SmalltalkSearch = Trim(HalBrain.TopicSearch(UserSentence, "smallTalk"))
1691 If SmalltalkSearch <> "" Then
1692 SmallTalk = SmalltalkSearch
1693 ElseIf Len(CurrentSubject) > 3 Then
1694 SmallTalk = Trim(CurrentSubject)
1695 'try making word plural by adding "s" and seeing if it exists
1696 If WN.LookupWord(SmallTalk & "s") = True Then
1697 SmallTalk = SmallTalk & "s"
1698 ElseIf WN.LookupWord(SmallTalk & "es") = True Then
1699 SmallTalk = SmallTalk & "es"
1700 End If
1701 End If
1702 If Len(SmallTalk) > 3 Then
1703 ResponseCount = ResponseCount + 1
1704 Redim Preserve ResponseList(ResponseCount)
1705 ResponseList(ResponseCount) = Replace(HalBrain.ChooseSentenceFromFile("smallTalkSent"), "<SmallTalk>", SmallTalk, 1, -1, 1)
1706 HalBrain.AddDebug TempParent, "SmallTalk: " & ResponseList(ResponseCount)
1707 End If
1708 End If
1709
1710 'RESPOND: PARAPHRASE USER IF POSSIBLE
1711 'If no response is found yet, and a paraphrase has been created but not used in a
1712 'previous section, use it now.
1713 GetResponse = HalBrain.HalFormat(GetResponse)
1714 If Len(GetResponse) < 4 And Len(Paraphrase) > 4 Then
1715 ResponseCount = ResponseCount + 1
1716 Redim Preserve ResponseList(ResponseCount)
1717 ResponseList(ResponseCount) = Paraphrase
1718 HalBrain.AddDebug TempParent, "Paraphrase: " & ResponseList(ResponseCount)
1719 End If
1720
1721 'RESPOND: PHRASE MAKER COMMENT AND QUESTION GENERATOR
1722 'If no response is found yet, try an auxiliary keyword file that generates questions
1723 'from phrases from the user's current sentence.
1724 GetResponse = HalBrain.HalFormat(GetResponse)
1725 If Len(GetResponse) < 4 Then
1726 KeyBrain = HalBrain.PatternDB("X " & HalBrain.RemoveExtraSpaces(UserSentence), "phraseDetector")
1727 If Len(KeyBrain) > 1 And Len(KeyBrain) < 60 Then
1728 ResponseCount = ResponseCount + 1
1729 Redim Preserve ResponseList(ResponseCount)
1730 ResponseList(ResponseCount) = Replace(HalBrain.ChooseSentenceFromFile("phraseRepeater"), "<KeyBrain>", KeyBrain, 1, -1, vbTextCompare)
1731 HalBrain.AddDebug TempParent, "PhraseRepeater: " & ResponseList(ResponseCount)
1732 End If
1733 End If
1734
1735 'RESPOND: Use the highest relevance response from the database functions
1736 GetResponse = HalBrain.HalFormat(GetResponse)
1737 If (Len(GetResponse) < 4 And (HighestRel > 6 And HighestRelResponse <> "")) Then
1738 ResponseCount = ResponseCount + 2
1739 Redim Preserve ResponseList(ResponseCount)
1740 ResponseList(ResponseCount - 1) = HighestRelResponse
1741 ResponseList(ResponseCount) = HighestRelResponse
1742 HalBrain.AddDebug TempParent, "Highest Rel: " & ResponseList(ResponseCount)
1743 End If
1744
1745 'RESPOND: WORDNET MERONYM AND HYPERNYM RESPONSES
1746 'This function finds the first definite noun in a sentence and comes up with responses
1747 'based on the word's meronyms (parts of), hypernyms (is part of), and sisters (similar things).
1748 If (Len(GetResponse) < 4 And Rnd * 100 < 65) And Len(UserSentence) > 15 Then
1749 subject = WN.FindFirstNoun(UserSentence, True)
1750 If subject <> "" And WN.LookupWord(subject) = True Then
1751 If Rnd * 100 < 55 Then 'If we have a meronym, lets use it creatively in a random sentence
1752 Meronym = WN.ChooseRandomWord(WN.GetMeronyms(1)) 'Meronym means "has parts" or "has members"
1753 If Meronym <> "" Then
1754 WNResponse = HalBrain.ChooseSentenceFromFile("meronyms")
1755 WNResponse = Replace(WNResponse, "<BaseNoun>", WN.GetBase("NOUN"), 1, -1, vbTextCompare)
1756 WNResponse = Replace(WNResponse, "<Meronym>", Meronym, 1, -1, vbTextCompare)
1757 If Len(GetResponse) < 4 And Len(WNResponse) > 4 Then
1758 ResponseCount = ResponseCount + 1
1759 Redim Preserve ResponseList(ResponseCount)
1760 ResponseList(ResponseCount) = WNResponse & vbCrLf
1761 HalBrain.AddDebug TempParent, "Meronym: " & ResponseList(ResponseCount)
1762 End If
1763 End If
1764 Else
1765 Hypernym = WN.ChooseRandomWord(WN.GetHypernyms("NOUN", 1, 1)) 'Hypernym means "is a part of" or "is a member of"
1766 Sister = WN.ChooseRandomWord(WN.GetSisters("NOUN", 1)) 'Related nouns
1767 If Sister <> "" And Hypernym <> "" Then 'If we have sister terms and hypernyms, lets use it creatively
1768 WNResponse = HalBrain.ChooseSentenceFromFile("hypernyms")
1769 WNResponse = Replace(WNResponse, "<BaseNoun>", WN.GetBase("NOUN"), 1, -1, vbTextCompare)
1770 WNResponse = Replace(WNResponse, "<Hypernym>", Hypernym, 1, -1, vbTextCompare)
1771 WNResponse = Replace(WNResponse, "<Sister>", Sister, 1, -1, vbTextCompare)
1772 If Len(GetResponse) < 4 And Len(WNResponse) > 4 Then
1773 ResponseCount = ResponseCount + 1
1774 Redim Preserve ResponseList(ResponseCount)
1775 ResponseList(ResponseCount) = WNResponse & vbCrLf
1776 HalBrain.AddDebug TempParent, "Hypernym: " & ResponseList(ResponseCount)
1777 End If
1778 End If
1779 End If
1780 End If
1781 End If
1782
1783 'RESPOND: STRIKING SIMILES
1784 'If the user mentions a noun that is in a table of nouns with similes, Hal will
1785 'say the simile phrase
1786 GetResponse = HalBrain.HalFormat(GetResponse)
1787 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
1788 Dim SimList() 'We must declare an empty array to store query results in
1789 If HalBrain.RunQuery("SELECT searchString, topic FROM strikingSimiles WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0", SimList) = True Then
1790 SpinWheel = HalBrain.RandomNum(Ubound(SimList)) 'Pick a random result if there is more than 1
1791 Simile = Trim(SimList(SpinWheel, 1)) 'Column 1 contains "topic", which is the simile
1792 If Len(Simile) > 5 Then
1793 ResponseCount = ResponseCount + 1
1794 Redim Preserve ResponseList(ResponseCount)
1795 ResponseList(ResponseCount) = Simile & ". "
1796 HalBrain.AddDebug TempParent, "Striking Simile: " & ResponseList(ResponseCount)
1797 End If
1798 End If
1799 End If
1800
1801 'RESPOND: MISC PHRASES
1802 'If the user mentions a noun that is in a table of nouns as part of misc sentence
1803 'fragments, Hal will say the fragment followed by an ellipsis
1804 GetResponse = HalBrain.HalFormat(GetResponse)
1805 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
1806 Dim PhraseList() 'We must declare an empty array to store query results in
1807 If HalBrain.RunQuery("SELECT searchString, topic FROM miscPhrases WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0", PhraseList) = True Then
1808 SpinWheel = HalBrain.RandomNum(Ubound(PhraseList)) 'Pick a random result if there is more than 1
1809 MiscPhrase = Trim(PhraseList(SpinWheel, 1)) 'Column 1 contains "topic", which is the phrase
1810 If Len(MiscPhrase) > 5 Then
1811 ResponseCount = ResponseCount + 1
1812 Redim Preserve ResponseList(ResponseCount)
1813 ResponseList(ResponseCount) = MiscPhrase & "<ellipsis>"
1814 HalBrain.AddDebug TempParent, "MiscPhrase: " & ResponseList(ResponseCount)
1815 End If
1816 End If
1817 End If
1818
1819 'RESPOND: ADJECTIVE NOUN QUESTION
1820 'If the user mentions a noun that is in a table of nouns, Hal will
1821 'try describing the noun with an adjective in the form of a question.
1822 GetResponse = HalBrain.HalFormat(GetResponse)
1823 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
1824 Dim ANList() 'We must declare an empty array to store query results in
1825 If HalBrain.RunQuery("SELECT searchString, topic FROM AdjNoun WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0", ANList) = True Then
1826 MentionedNoun = Trim(ANList(1, 0)) 'Row 1 contains our query result. Column 0 contains "searchString", which is the noun
1827 SpinWheel = HalBrain.RandomNum(Ubound(ANList)) 'Pick a random result if there is more than 1
1828 AssocAdj = Trim(ANList(SpinWheel, 1)) 'Column 1 contains "topic", which is the adjective
1829 If Len(MentionedNoun) < 5 Then MentionedNoun = " " & MentionedNoun & " "
1830 If Instr(1, " " & UserSentence & " ", MentionedNoun, vbTextCompare) > 0 And Instr(1, UserSentence, AssocAdj, vbTextCompare) = 0 Then
1831 ResponseCount = ResponseCount + 1
1832 Redim Preserve ResponseList(ResponseCount)
1833 SpinWheel = HalBrain.RandomNum(5)
1834 If SpinWheel = 1 Then ResponseList(ResponseCount) = "<UserName>, " & AssocAdj & " " & MentionedNoun & "?"
1835 If SpinWheel = 2 Then ResponseList(ResponseCount) = AssocAdj & " " & MentionedNoun & ", <UserName>?"
1836 If SpinWheel > 2 Then ResponseList(ResponseCount) = AssocAdj & " " & MentionedNoun & "?"
1837 HalBrain.AddDebug TempParent, "Adj/Noun Question: " & ResponseList(ResponseCount)
1838 End If
1839 End If
1840 End If
1841
1842 'RESPOND: VERB PREPOSITION NOUN QUESTION
1843 'If the user mentions a noun that is in a table of nouns, Hal will
1844 'ask a question about the noun using a related verb and preposition
1845 GetResponse = HalBrain.HalFormat(GetResponse)
1846 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
1847 Dim VPNList() 'We must declare an empty array to store query results in
1848 If HalBrain.RunQuery("SELECT searchString, topic FROM VerbPrepNoun WHERE strstr(' " & Replace(HalBrain.AlphaNumericalOnly(OriginalSentence), "'", "''") & " ', searchString) > 0", VPNList) = True Then
1849 MentionedNoun = Trim(VPNList(1, 0)) 'Row 1 contains our query result. Column 0 contains "searchString", which is the noun
1850 SpinWheel = HalBrain.RandomNum(Ubound(VPNList)) 'Pick a random result if there is more than 1
1851 AssocVerbPrep = Trim(VPNList(SpinWheel, 1)) 'Column 1 contains "topic", which is the verb and preposition
1852 If Len(MentionedNoun) < 5 Then MentionedNoun = " " & MentionedNoun & " "
1853 If Instr(1, " " & UserSentence & " ", MentionedNoun, vbTextCompare) > 0 And Instr(1, UserSentence, AssocVerbPrep, vbTextCompare) = 0 Then
1854 ResponseCount = ResponseCount + 1
1855 Redim Preserve ResponseList(ResponseCount)
1856 SpinWheel = HalBrain.RandomNum(5)
1857 If SpinWheel = 1 Then ResponseList(ResponseCount) = "<UserName>, " & AssocVerbPrep & " " & MentionedNoun & "?"
1858 If SpinWheel = 2 Then ResponseList(ResponseCount) = AssocVerbPrep & " " & MentionedNoun & ", <UserName>?"
1859 If SpinWheel > 2 Then ResponseList(ResponseCount) = AssocVerbPrep & " " & MentionedNoun & "?"
1860 HalBrain.AddDebug TempParent, "Verb/Preposition/Noun Question: " & ResponseList(ResponseCount)
1861 End If
1862 End If
1863 End If
1864
1865 'RESPOND: USE CURRENT SENTENCE
1866 'If no Response is found yet, try to use the user's words in his or her own sentence.
1867 'Results are also stored in the default user keyword brain file for compatibility
1868 'with other brain plug-ins.
1869 GetResponse = HalBrain.HalFormat(GetResponse)
1870 If (Len(GetResponse) < 4 And Len(LearnKeyword) < 4) Then
1871 CheatResp = HalBrain.CheatResponse(HalBrain.SwitchPerson(HalBrain.AlphaNumericalOnly((OriginalSentence))))
1872 CheatResp = Left(CheatResp, InStr(1, CheatResp, "<STOREVARS>", 1) - 1)
1873 If Len(CheatResp) > 4 Then
1874 ResponseCount = ResponseCount + 1
1875 Redim Preserve ResponseList(ResponseCount)
1876 SpinWheel = HalBrain.RandomNum(9)
1877 If SpinWheel = 1 Then ResponseList(ResponseCount) = " So, " & CheatResp & vbCrLf
1878 If SpinWheel = 2 Then ResponseList(ResponseCount) = " Really, " & CheatResp & vbCrLf
1879 If SpinWheel = 3 Then ResponseList(ResponseCount) = " Oh <UserName>, " & CheatResp & vbCrLf
1880 If SpinWheel = 4 Then ResponseList(ResponseCount) = " Let me think; " & CheatResp & " ; what do you think <UserName>? " & vbCrLf
1881 If SpinWheel > 5 Then ResponseList(ResponseCount) = CheatResp & vbCrLf
1882 HalBrain.AddDebug TempParent, "Cheat Response: " & ResponseList(ResponseCount)
1883 End If
1884 End If
1885
1886 'RESPOND: PICK OUT OF AVAILABLE LOW QUALITY RESPONSES
1887 'If no response is found yet, than we have many functions from above that may have produced
1888 'a response, but no function is particulary better than another. So we will now pick a
1889 'responses from an array randomly choosen.
1890 GetResponse = HalBrain.HalFormat(GetResponse)
1891 If (Len(GetResponse) < 4 And ResponseCount > 0) Then
1892 SpinWheel = HalBrain.RandomNum(ResponseCount)
1893 GetResponse = ResponseList(SpinWheel) & "<LOWQUALITY>"
1894 End If
1895 HalBrain.DebugWatch GetResponse, "Randomly pick a low-quality response"
1896
1897 'RESPOND: User asks a general opinion question.
1898 If HalBrain.TopicSearch(UserSentence, "opinionDetect") = "True" Then GenOpinion = True
1899 'Note that the following string matches must occur at the sentence beginning only:
1900 If Rnd * 100 > 50 Then
1901 If Left(Trim(UCase(OriginalSentence)), 4) = "WHY " Then GenOpinion = True
1902 If Left(Trim(UCase(OriginalSentence)), 5) = "WHAT " Then GenOpinion = True
1903 If Left(Trim(UCase(OriginalSentence)), 5) = "WHEN " Then GenOpinion = True
1904 If Left(Trim(UCase(OriginalSentence)), 4) = "HOW " Then GenOpinion = True
1905 If Left(Trim(UCase(OriginalSentence)), 4) = "WHO " Then GenOpinion = True
1906 If Left(Trim(UCase(OriginalSentence)), 6) = "WHERE " Then GenOpinion = True
1907 End If
1908 If GenOpinion = True And SkipOpinion = False Then
1909 If Rnd * 100 > 45 Then RepeatQuest = UserSentence & " ? "
1910 If Rnd * 100 > 50 Then PreAmble = HalBrain.ChooseSentenceFromFile("preamble")
1911 Recommend = HalBrain.ChooseSentenceFromFile("recommend")
1912 GetResponse = RepeatQuest & " " & PreAmble & " " & Recommend & GetResponse
1913 End If
1914 HalBrain.DebugWatch GetResponse, "General Opinion"
1915
1916 'RESPOND: CHANGE TOPIC
1917 'If a different procedure has requested that the topic be changed
1918 'Hal will do so now
1919 GetResponse = Replace(GetResponse, "<ChangeSubject>", newTopic, 1, -1, vbTextCompare)
1920 GetResponse = Replace(GetResponse, "<ChangeTopic>", newTopic, 1, -1, vbTextCompare)
1921 GetResponse = Replace(GetResponse, "<NewTopic>", newTopic, 1, -1, vbTextCompare)
1922 HalBrain.DebugWatch GetResponse, "Change Topic"
1923
1924 Rem PLUGIN: PLUGINAREA6
1925 'The preceding comment is actually a plug-in directive for
1926 'the Ultra Hal host application. It allows for code snippets
1927 'to be inserted here on-the-fly based on user configuration.
1928
1929 'RESPOND: MAKE UP SOMETHING TO SAY
1930 'If we have got to this point and we still don't have anything to say, then
1931 'we will use 1 of 5 functions to make something up to say.
1932 GetResponse = Trim(GetResponse)
1933 If Len(GetResponse) < 4 Then
1934 SpinWheel = HalBrain.RandomNum(6)
1935 If SpinWheel < 4 Then
1936 'RESPOND: CONVERSATIONAL PHRASE
1937 'Choose a random phrase designed to keep the conversation going no matter what the user said
1938 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("conversationalPhrases")
1939 ElseIf SpinWheel = 4 Then
1940 'RESPOND: CHANGE TOPIC
1941 If Rnd * 10 < 4 Then GetResponse = HalBrain.ChooseSentenceFromFile("topicIntro")
1942 GetResponse = GetResponse & newTopic
1943 Else
1944 'RESPOND: USE RANDOM QUESTION COLLECTED FROM USER
1945 'Randomly select a question once posed by the user in order to find something to say.
1946 'If the user answers the question, then Hal will know that answer in the future.
1947 If Rnd * 10 < 3 Then GetResponse = HalBrain.ChooseSentenceFromFile("topicIntro")
1948 GetResponse = GetResponse & HalBrain.ChooseSentenceFromFile("sharedQuestions")
1949 End If
1950 GetResponse = GetResponse & "<LOWQUALITY>"
1951 End If
1952 HalBrain.DebugWatch GetResponse, "Make up something"
1953
1954 'PROCESS: RECORD TIME
1955 'Record the current time, so Hal knows the time in between sentences.
1956 LastResponseTime = Now
1957
1958 'PROCESS: FIGURE OUT CONTINUITY
1959 'If the user seems to be continuing a line of thought
1960 'from something Hal just said, note this.
1961 If Len(Trim(PrevSent)) > 2 And (HalBrain.TopicSearch(UserSentence, "responding") = "True" Or InStr(OriginalSentence, "!") Or InStr(PrevSent, "?")) Then TopicContinuity = True
1962
1963 'PROCESS: FIGURE OUT PERSONAL DATA
1964 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
1965 PersonalData = False
1966 Else
1967 PersonalData = True
1968 End If
1969
1970 'PROCESS: RESTORE PUNTUATION FOR LEARNING
1971 'Now we establish a special sentence on which we can restore ordinary capitalization:
1972 AnswerSent = UserSentence
1973 AnswerSent = Trim(HalBrain.FixCaps(AnswerSent))
1974 If Right(AnswerSent, 1) = "." Then AnswerSent = Left(AnswerSent, Len(AnswerSent) - 1)
1975 'Now we add in our spaces and restore ending punctuation to match the user's original sentence:
1976 If InStr(OriginalSentence, "!") > 0 And InStr(AnswerSent, "!") = 0 Then
1977 AnswerSent = AnswerSent & "!"
1978 ElseIf InStr(OriginalSentence, "?") > 0 And InStr(AnswerSent, "?") = 0 Then
1979 AnswerSent = AnswerSent & "?"
1980 Else
1981 AnswerSent = AnswerSent & "."
1982 End If
1983 'If there were no pronoun reversals required in the sentence,
1984 'we can recover directly from the original sentence:
1985 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)
1986
1987 'PROCESS: NOTE IF QUESTION
1988 'See if the user's sentence is a question or not and note this
1989 'for use by other functions
1990 If InStr(1, OriginalSentence, "?", vbTextCompare) > 0 Then IsQuestion = True
1991 If InStr(1, OriginalSentence, "Who ", vbTextCompare) > 0 Then IsQuestion = True
1992 If InStr(1, OriginalSentence, "What ", vbTextCompare) > 0 Then IsQuestion = True
1993 If InStr(1, OriginalSentence, "When ", vbTextCompare) > 0 Then IsQuestion = True
1994 If InStr(1, OriginalSentence, "Where ", vbTextCompare) > 0 Then IsQuestion = True
1995 If InStr(1, OriginalSentence, "Why ", vbTextCompare) > 0 Then IsQuestion = True
1996 If InStr(1, OriginalSentence, "How ", vbTextCompare) > 0 Then IsQuestion = True
1997 If InStr(1, OriginalSentence, ".", vbTextCompare) > 0 Then IsQuestion = False
1998 If InStr(1, OriginalSentence, "!", vbTextCompare) > 0 Then IsQuestion = False
1999 If InStr(1, OriginalSentence, " am I ", vbTextCompare) > 0 Then IsQuestion = False
2000
2001 'SAVE: EPHEMERAL KNOWLEDGE
2002 'Some Hal's learned knowledge should be temporary because it is ephemeral in nature.
2003 'Knowledge about weather, season, temperature, etc. are temporary knowledge
2004 'that shouldn't be stored in Hal's permanent brain files. Ephemeral knowledge is
2005 'detected and saved in a temporary table. The temporary table only stores 10
2006 'entries in it at a time.
2007 If HalBrain.TopicSearch(UserSentence, "ephemeralDetect") = "True" Then
2008 If HalBrain.CheckTableExistence(Trim(LCase(UserName)) & "_TempSent") = False Then
2009 'Create table for this user if it doesn't exist
2010 HalBrain.CreateTable Trim(LCase(UserName)) & "_TempSent", "Brain", "autoLearningBrain"
2011 End If
2012 If TopicContinuity = True Then HalBrain.AddToTable Trim(LCase(UserName)) & "_TempSent", "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2013 HalBrain.AddToTable Trim(LCase(UserName)) & "_TempSent", "Brain", Trim(UserSentence), AnswerSent
2014 HalBrain.LimitSize Trim(LCase(UserName)) & "_TempSent", 10
2015 HalBrain.ReadOnlyMode = True 'Block additional file saves when ephemeral knowledge is detected
2016 End If
2017
2018 'SAVE: LEARN AUTO TOPIC FOCUS PEOPLE SENTENCES
2019 'Learns info about people with recognized names
2020 If HalBrain.ReadOnlyMode = False And HalGreeting = "" And IsQuestion = False And MentionedName <> "" And Trim(UCase(NewName)) <> Trim(UCase(MentionedName)) And WN.LookupWord(MentionedName) = False Then
2021 If HalBrain.CheckTableExistence("_" & Trim(LCase(MentionedName))) = False Then
2022 'Create table for this person if it doesn't exist
2023 HalBrain.CreateTable "_" & Trim(LCase(MentionedName)), "Brain", "autoLearningBrain"
2024 HalBrain.AddToTable "topicRelationships", "TopicSearch", Trim(MentionedName), Trim(LCase(MentionedName))
2025 End If
2026 'Store user response in this table
2027 If TopicContinuity = True Then HalBrain.AddToTable "_" & Trim(LCase(MentionedName)), "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2028 HalBrain.AddToTable "_" & Trim(LCase(MentionedName)), "Brain", Trim(UserSentence), AnswerSent
2029 End If
2030
2031 'SAVE: AUTO TOPIC FOCUS LEARNING
2032 If HalBrain.ReadOnlyMode = False And HalGreeting = "" And PersonalData = False And HalBrain.CountInstances(" ", Trim(UserSentence)) > 2 And IsQuestion = False Then
2033 Keywords = HalBrain.TopicSearch(UserSentence, "topicRelationships") & " " & CurrentSubject & " " & UserSentence
2034 Keywords = Trim(HalBrain.RemoveExtraSpaces(HalBrain.ExtractKeywords(" " & Keywords & " ")))
2035 If Len(Keywords) > 3 Then
2036 KeywordList = Split(Keywords, " ")
2037 TopicList = ""
2038 'Create list of tables that exist for each keyword
2039 For i = LBound(KeywordList) To UBound(KeywordList)
2040 TopicTable = HalBrain.TopicSearch(" " & KeywordList(i) & " ", "topicRelationships")
2041 If TopicTable <> "" And InStr(1, " " & TopicList, " " & Trim(TopicTable) & " ", vbTextCompare) = 0 Then
2042 'Topic already exists, make note of it
2043 TopicList = TopicList & TopicTable & " "
2044 ElseIf TopicTable = "" And Len(KeywordList(i)) > 2 Then
2045 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
2046 If WN.LookupWord(KeywordList(i)) = True And WN.GuessPartOfSpeech() = "NOUN" And IsNumber = False Then
2047 If HalBrain.CheckTableExistence("_" & Trim(Lcase(WN.GetBase(WN.GuessPartOfSpeech)))) = False Then
2048 'Topic does not exist, but can and will be created
2049 TopicList = TopicList & KeywordList(i) & " "
2050 HalBrain.CreateTable "_" & Trim(Lcase(KeywordList(i))), "Brain", "autoLearningBrain"
2051 HalBrain.AddToTable "topicRelationships", "TopicSearch", " " & Trim(KeywordList(i)) & " ", Trim(Lcase(KeywordList(i)))
2052 'Relationships based on wordnet synonyms are recorded
2053 Relationships = WN.GetDefinition("NOUN", 1, "S") & "," & WN.GetSynonyms("NOUN", 1)
2054 Relationships = Replace(Relationships, ", ", ",")
2055 Relationships = Trim(Replace(Relationships, ",,", ","))
2056 If Right(Relationships, 1) = "," Then Relationships = Trim(Left(Relationships, Len(Relationships) - 1))
2057 If Len(Relationships) > 1 Then
2058 If Left(Relationships, 1) = "," Then Relationships = Right(Relationships, Len(Relationships) - 1)
2059 RelList = Split(Relationships, ",")
2060 For h = Lbound(RelList) To Ubound(RelList)
2061 If HalBrain.TopicSearch(" " & RelList(h) & " ", "topicRelationships") = "" Then
2062 HalBrain.AddToTable "topicRelationships", "TopicSearch", " " & Trim(RelList(h)) & " ", Trim(Lcase(KeywordList(i)))
2063 End If
2064 Next
2065 End If
2066 End If
2067 End If
2068 End If
2069 Next
2070 'User's sentence is recorded in all related topic tables
2071 TopicList = HalBrain.RemoveExtraSpaces(TopicList)
2072 If TopicList <> "" And Len(AnswerSent) > 3 Then
2073 AlreadyLearned = True
2074 TableList = Split(TopicList, " ")
2075 For i = LBound(TableList) To UBound(TableList)
2076 If TopicContinuity = True And Len(PrevSent) > 3 Then HalBrain.AddToTable "_" & Trim(Lcase(TableList(i))), "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2077 If Len(UserSentence) > 3 Then HalBrain.AddToTable "_" & Trim(Lcase(TableList(i))), "Brain", Trim(UserSentence), AnswerSent
2078 Next
2079 End If
2080 End If
2081 End If
2082
2083 If HalBrain.ReadOnlyMode = False And AlreadyLearned = False And HalBrain.CountInstances(" ", Trim(UserSentence)) > 2 And HalGreeting = "" Then
2084 If PersonalData = True And IsQuestion = False Then
2085 'SAVE: FILE USER SENTENCE DEFAULT
2086 'Hal adds to the default brain user sentence file an association of the current
2087 'user sentence With words selected from that same current user sentence.
2088 If InStr(UserSentence, "WHAT IS") = 0 Then
2089 If HalBrain.CheckTableExistence(Trim(LCase(UserName)) & "_UserSent") = False Then
2090 'Create table for this user if it doesn't exist
2091 HalBrain.CreateTable Trim(LCase(UserName)) & "_UserSent", "Brain", "autoLearningBrain"
2092 End If
2093 If TopicContinuity = True Then HalBrain.AddToTable Trim(LCase(UserName)) & "_UserSent", "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2094 HalBrain.AddToTable Trim(LCase(UserName)) & "_UserSent", "Brain", Trim(UserSentence), AnswerSent
2095 End If
2096 ElseIf IsQuestion = False Then
2097 'SAVE: FILE SHARED USER SENTENCES
2098 'Unless the user seems to be asking for data recall, or talking about
2099 'himself or herself, Hal adds to a shared user sentence file. This allows
2100 'Hal to gain knowledge that he can apply to conversations with multiple users.
2101 If TopicContinuity = True Then HalBrain.AddToTable "sharedUserSent", "Brain", Trim(HalBrain.AlphaNumericalOnly(PrevSent)), AnswerSent
2102 HalBrain.AddToTable "sharedUserSent", "Brain", Trim(UserSentence), AnswerSent
2103 End If
2104 'SAVE: FILE QUESTIONS IN RANDOM QUESTION RETRIEVAL FILE
2105 'Hal saves the user's questions (with pronouns reversed)
2106 'so that he can pose questions back to the user later for 3 purposes:
2107 '1. If the user answers a question later, Hal will learn the answer.
2108 '2. It adds variety to future conversations for the user.
2109 '3. It gives Hal another possible response when "stuck" for an answer.
2110 If IsQuestion = True Then HalBrain.AddToTable "sharedQuestions", "Sentence", AnswerSent, ""
2111 End If
2112
2113 Rem PLUGIN: PLUGINAREA7
2114 'The preceding comment is actually a plug-in directive for
2115 'the Ultra Hal host application. It allows for code snippets
2116 'to be inserted here on-the-fly based on user configuration.
2117
2118 'POST PROCESS: LIMIT TABLE SIZE
2119 'We want to make sure the sentence files
2120 'don't get too big so we limit them.
2121
2122 'RESPOND: HAL NOTICES HE IS REPEATING HIMSELF
2123 'Hal may make a comment or alter his remark
2124 'if he detects himself being repetitious.
2125 If HalBrain.CheckRepetition(GetResponse, PrevSent) = True Then
2126 RepeatResponse = HalBrain.ChooseSentenceFromFile("halRepeat")
2127 GetResponse = Replace(RepeatResponse, "<response>", GetResponse, 1, -1, vbTextCompare)
2128 DebugInfo = DebugInfo & "Hal has noticed he is repeating himself and has made a comment about it: " & GetResponse & vbCrLf
2129 End If
2130
2131 'RESPOND: MAKE COMMENTS ABOUT SHORT PHRASES
2132 GetResponse = GetResponse & ShortPhrase
2133
2134 'PROCESS: REVERSE CERTAIN CONTRACTIONS AND OTHER SUBSTITUTIONS
2135 'Standardizing on contractions can make Hal sound conversational.
2136 'However, certain sentence constructions don't work well
2137 'if expressed as contractions. For example:
2138 '"I don't know where it is" becomes "I don't know where it's."
2139 'For another example, "That's how he is" becomes "That's how he's."
2140 'To solve these types of cases
2141 'we attempt to modify certain contractions, words, and phrases
2142 'at the end of this function, now that Hal's thinking is done.
2143 GetResponse = HalBrain.HalFormat(GetResponse)
2144 GetResponse = HalBrain.ProcessSubstitutions(GetResponse, "corrections")
2145
2146 'PROCESS: CALL USER BY CORRECT NAME
2147 'If the user has chosen a nickname or temporary name, call user by that
2148 'otherwise call the user by the username chosen by the host application
2149 If NewName <> "" Then
2150 GetResponse = Replace(GetResponse, "<UserName>", NewName, 1, -1, vbTextCompare)
2151 GetResponse = Replace(GetResponse, "<Name>", NewName, 1, -1, vbTextCompare)
2152 Else
2153 GetResponse = Replace(GetResponse, "<UserName>", UserName, 1, -1, vbTextCompare)
2154 GetResponse = Replace(GetResponse, "<Name>", UserName, 1, -1, vbTextCompare)
2155 End If
2156
2157 'PROCESS: AGE AND GENDER TAGS
2158 GetResponse = Replace(GetResponse, "<HalAge>", HalAge, 1, -1, vbTextCompare)
2159 GetResponse = Replace(GetResponse, "<HalSex>", HalSex, 1, -1, vbTextCompare)
2160
2161 'PROCESS: NAME REVERSAL
2162 'If Hal is about to same something referring to himself in third person
2163 'then we will reverse it to be about the user.
2164 'Don't let Hal say the word "HAL" unless he is telling his name
2165 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
2166 GetResponse = " " & GetResponse & " "
2167 GetResponse = Replace(GetResponse, "Ultra Hal Assistant", " " & NewName & " ", 1, -1, vbTextCompare)
2168 GetResponse = Replace(GetResponse, "Ultra Hal", " " & NewName & " ", 1, -1, vbTextCompare)
2169 GetResponse = Replace(GetResponse, "Hal Assistant", " " & NewName & " ", 1, -1, vbTextCompare)
2170 GetResponse = Replace(GetResponse, " Hal ", " " & NewName & " ", 1, -1, vbTextCompare)
2171 GetResponse = Replace(GetResponse, " Hal,", " " & NewName & ",", 1, -1, vbTextCompare)
2172 GetResponse = Replace(GetResponse, " Hal.", " " & NewName & ".", 1, -1, vbTextCompare)
2173 GetResponse = Replace(GetResponse, " " & ComputerName & " ", " " & NewName & " ", 1, -1, vbTextCompare)
2174 GetResponse = Replace(GetResponse, " " & ComputerName & ",", " " & NewName & ",", 1, -1, vbTextCompare)
2175 GetResponse = Replace(GetResponse, " " & ComputerName & ".", " " & NewName & ".", 1, -1, vbTextCompare)
2176 End If
2177
2178 'PROCESS: PRESERVE ALL VARIABLES
2179 PrevUserSent = UserSentence
2180 CustomMem = HalBrain.EncodeVar(NewName, "NewName") & HalBrain.EncodeVar(UserSex, "UserSex") & HalBrain.EncodeVar(SentCount, "SentCount") & HalBrain.EncodeVar(ShortSents, "ShortSents")
2181
2182 Rem PLUGIN: CUSTOMMEM2
2183 'The preceding comment is actually a plug-in directive for
2184 'the Ultra Hal host application. It allows for code snippets
2185 'to be inserted here on-the-fly based on user configuration.
2186
2187End Function
2188
2189'This function scans a sentence looking to see if a user entered gibberish like
2190'sdfkjhskjdfhskdsdfdf. It works by looking for more than 5 consanants in a row,
2191'which doesn't occur in normal english words.
2192Function DetectGibberish(GibSentence)
2193 DetectGibberish = False
2194 GibCount = 0
2195 For i = 1 To Len(GibSentence) 'loop for every character in the sentence
2196 CurrentLetter = Ucase(Mid(GibSentence, i, 1))
2197 GibCount = GibCount + 1
2198 If CurrentLetter = "0" Then GibCount = 0
2199 If CurrentLetter = "1" Then GibCount = 0
2200 If CurrentLetter = "2" Then GibCount = 0
2201 If CurrentLetter = "3" Then GibCount = 0
2202 If CurrentLetter = "4" Then GibCount = 0
2203 If CurrentLetter = "5" Then GibCount = 0
2204 If CurrentLetter = "6" Then GibCount = 0
2205 If CurrentLetter = "7" Then GibCount = 0
2206 If CurrentLetter = "8" Then GibCount = 0
2207 If CurrentLetter = "9" Then GibCount = 0
2208 If CurrentLetter = "A" Then GibCount = 0
2209 If CurrentLetter = "E" Then GibCount = 0
2210 If CurrentLetter = "I" Then GibCount = 0
2211 If CurrentLetter = "O" Then GibCount = 0
2212 If CurrentLetter = "U" Then GibCount = 0
2213 If CurrentLetter = "Y" Then GibCount = 0
2214 If CurrentLetter = " " Then GibCount = 0
2215 If GibCount = 6 Then
2216 DetectGibberish = True
2217 Exit For
2218 End If
2219 Next
2220End Function
2221
2222'If the user clicks on the About/Options button for this plugin
2223'this sub will be called. There are no extra settings for this brain,
2224'so we'll display an information box
2225Sub AboutOptions()
2226 HalBrain.MsgAlert "This is the Ultra Hal 6.2 Default Brain. This brain has no additional options."
2227End Sub
2228
2229'This sub will be called when the Ultra Hal program starts up in case
2230'the script needs to load some modules or seperate programs. If a return
2231'value is given it is passed as a Hal Command to the host Hal program.
2232Function Script_Load()
2233 Rem PLUGIN: SCRIPT_LOAD
2234 'The preceding comment is actually a plug-in directive for
2235 'the Ultra Hal host application. It allows for code snippets
2236 'to be inserted here on-the-fly based on user configuration.
2237End Function
2238
2239'This sub will be called before the Ultra Hal program is closed in case
2240'the script needs to do any cleanup work.
2241Sub Script_Unload()
2242 Rem PLUGIN: SCRIPT_UNLOAD
2243 'The preceding comment is actually a plug-in directive for
2244 'the Ultra Hal host application. It allows for code snippets
2245 'to be inserted here on-the-fly based on user configuration.
2246End Sub
2247
2248'If the host application is Ultra Hal Assistant, then this sub will be
2249'run once a minute enabling plug-ins to do tasks such as checking for
2250'new emails or checking an appointment calendar.
2251Sub Minute_Timer(MinutesPast)
2252 Rem PLUGIN: MINUTE_TIMER
2253 'The preceding comment is actually a plug-in directive for
2254 'the Ultra Hal host application. It allows for code snippets
2255 'to be inserted here on-the-fly based on user configuration.
2256End Sub
2257
2258Rem PLUGIN: FUNCTIONS
2259'The preceding comment is actually a plug-in directive for
2260'the Ultra Hal host application. It allows for code snippets
2261'to be inserted here on-the-fly based on user configuration.