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