5 // Created by 西田 耀 on 13/01/28.
\r
6 // Copyright (c) 2013年 Hikaru Nishida. All rights reserved.
\r
17 //Define static values
\r
20 AI_WorkingSet WorkingSet;
\r
22 int main(int argc, const char * argv[])
\r
26 CHNLIB_String *input, *temp;
\r
27 CHNLIB_UIPArray *separated;
\r
30 CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]);
\r
32 CHNLIB_Debug("Hello, World.", CHNLIB_DEBUG_ARGUMENTS);
\r
34 AI_System_InitializeSystemWorkingSet();
\r
36 AI_System_LoadMemory(AI_CONFIG_FILE_NAME);
\r
40 input = CHNLIB_ReadLine(stdin);
\r
42 if(CHNLIB_String_CompareStringWithCString(input, "::")){
\r
45 separated = CHNLIB_UIPArray_Initialize();
\r
46 CHNLIB_UIPArray_GetSeparatedStringByUIPArray(&separated, WorkingSet.SystemWordList0, input);
\r
48 temp = CHNLIB_UIPArray_GetPointerByIndex(separated, 2);
\r
50 if(CHNLIB_String_CompareStringWithCString(temp, "info")){
\r
51 printf("AI internal information:\n");
\r
52 } else if(CHNLIB_String_CompareStringWithCString(temp, "exit")){
\r
54 } else if(CHNLIB_String_CompareStringWithCString(temp, "wordlist")){
\r
55 i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);
\r
56 for(i = 0; i < i_max; i++){
\r
57 printf("word%3d:%s\n", i, CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i)));
\r
64 CHNLIB_UIPArray_FreeSelectedAll(&separated);
\r
69 separated = CHNLIB_UIPArray_Initialize();
\r
70 separated = AI_Think_SlideLookUpWordByHistory(input);
\r
71 i_max = CHNLIB_UIPArray_GetNumberOfDatas(separated);
\r
72 printf("Index(Decimal),CountOfContain(Decimal), String\n");
\r
73 for(i = 0; i < i_max; i++){
\r
74 printf("%d,%d,%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(separated, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, i)));
\r
76 CHNLIB_UIPArray_FreeAll(&separated);
\r
77 CHNLIB_UIPArray_AppendLast(&WorkingSet.InputHistory, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory), input);
\r
84 CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input)
\r
86 //入力文字列と履歴文字列を照らし合わせ、単語の候補を抜き出す。
\r
87 CHNLIB_UIPArray *candidatewordlist;
\r
91 int candidatelength, templength;
\r
92 const char *cstr_input, *cstr_history;
\r
94 candidatewordlist = CHNLIB_UIPArray_Initialize();
\r
96 i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory);
\r
98 cstr_input = CHNLIB_String_GetReferencePointerOfCString(input);
\r
99 k_max = CHNLIB_CString_GetLength(cstr_input);
\r
101 for(k = 0; k < k_max; k++){
\r
103 //UTF-8のマルチバイト部分でないことを確認
\r
104 if(CHNLIB_UTF8_GetCharacterType(cstr_input[k]) != 0){
\r
106 candidatelength = 0;
\r
107 for(i = 0; i < i_max; i++){
\r
108 cstr_history = CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i));
\r
109 j_max = CHNLIB_CString_GetLength(cstr_history);
\r
110 for(j = 0; j < j_max; j++){
\r
111 templength = CHNLIB_CString_CompareString_LeftHand(&cstr_history[j], &cstr_input[k]);
\r
112 if(templength > candidatelength && templength != (k_max - k)){
\r
114 //これまで見つかった単語よりも長く、かつ
\r
115 //入力文字列の検索部分の全長ではない場合、
\r
117 candidatelength = templength;
\r
121 if(candidatelength > 0){
\r
122 //AI_Memory_AddRootWordData(CHNLIB_String_ExtractByLength(input, k, candidatelength));
\r
123 CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&candidatewordlist, 0, CHNLIB_String_ExtractByLength(input, k, candidatelength), &AI_Memory_AddRootWordData_IsDuplicated);
\r
128 //各候補単語が入力文字列にいくつ含まれているかをdata32に保存する。
\r
129 i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist);
\r
130 for(i = 0; i < i_max; i++){
\r
131 CHNLIB_UIPArray_SetData32ByIndex(candidatewordlist, i, CHNLIB_String_GetCountOfContain(input, CHNLIB_UIPArray_GetPointerByIndex(candidatewordlist, i)));
\r
134 return candidatewordlist;
\r
137 void AI_Memory_AddRootWordData(CHNLIB_String *tag)
\r
139 //WorkingSet.RootWordListに文字列を追加する。
\r
140 //重複がある場合は警告を出し、追加しない。
\r
143 i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);
\r
144 for(i = 0; i < i_max; i++){
\r
145 if(CHNLIB_String_CompareString_Strict(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i), tag)){
\r
146 CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(tag));
\r
151 CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i_max, tag);
\r
153 CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList), tag, &AI_Memory_AddRootWordData_IsDuplicated);
\r
158 int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag)
\r
160 //CHNLIB_UIPArray_AppendLast_ProtectFromDuplicationに渡す関数ポインタ。
\r
161 if(CHNLIB_StructureHeader_GetTypeID(listtag) != CHNLIB_STRUCT_ID_String){
\r
164 if(CHNLIB_String_CompareString_Strict(listtag, newtag)){
\r
165 CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(newtag));
\r
171 void AI_System_InitializeSystemWorkingSet(void)
\r
173 //WorkingSetを初期化する。
\r
174 WorkingSet.SystemWordList0 = CHNLIB_UIPArray_Initialize();
\r
175 CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(":"));
\r
176 CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(","));
\r
178 WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();
\r
183 void AI_System_LoadMemory(const char configfilename[])
\r
185 //指定されたファイル名のテキストファイルから設定を読み出す。
\r
187 CHNLIB_String *line, *currentfilename;
\r
190 fp = fopen(configfilename, "rb");
\r
191 currentfilename = CHNLIB_ReadLine(fp);
\r
194 fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb");
\r
196 WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();
\r
198 line = CHNLIB_ReadLine(fp);
\r
202 CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line);
\r
203 //CHNLIB_String_Free(line);リストに登録している実体なので解放の必要なし!
\r
206 CHNLIB_String_Free(currentfilename);
\r
208 //CHNLIB_Debug_PrintStructureData(WorkingSet.RootWordList, 0);
\r