📄 aiexpert.cpp
字号:
}
ASSERT(aimMt.GetPre() == NULL);
if (own == FactTrue)
return FactTrue;
//after 1999,6,1
if (own == FactUnknow)
{
POSITION p;
AiRule* pData;
for (p=m_ruleList.GetHeadPosition();p!=NULL;)
{
pData = ((AiRule*)(m_ruleList.GetNext(p)));
if ( pData->GetMt().GetId() == aimMt.GetId() )
{
AiMt mt;
AiWffs* wff =& pData->GetWffs();
mt.SetId(wff->GetId());
mt.SetPre(wff->GetPre());
mt.SetSign(wff->GetSign());
//*father = new AiTree;
//(*father)->SetId(aimMt.GetId());
//(*father)->SetSign(aimMt.GetSign());
//(*father)->SetMention(GetAssertMention(aimMt.GetId(),aimMt.GetSign()) );
AiTree* son;
int w = SearchInsideForTree(mt,&son) ;
if (w == FactTrue)
//此处返回FactFalse表示推理未成立
{
AddFact(pData->GetMt());
// for tree
if (GetFact(aimMt) == FactTrue){
(*father)->SetRch(son);
return FactTrue;
}
else{
ASSERT(GetFact(aimMt) == FactFalse);
(*father)->SetRch(son);
return FactFalse;
}
}
else if (w == FactFalse || w == FactUnknow){
//每次搜索恢复知识
for (int i=0;i<m_numAssert;i++) {
if (m_factBS[i].GetValue() == FactTrue
|| m_factBA[i].GetValue() == FactTrue)
m_fact[i].SetTrue();
else if (m_factBS[i].GetValue() == FactFalse
|| m_factBA[i].GetValue() == FactFalse)
m_fact[i].SetFalse();
else{
ASSERT(m_fact[i].GetValue() == FactUnknow
|| m_factBA[i].GetValue() == FactUnknow);
m_fact[i].SetUnknow();
}
}
////每次搜 索恢复知识;END
}
}
}
//ASSERT(0);
}
ASSERT(own == FactUnknow);
return FactUnknow;
}
CString AiExpert::GetAbbreviationMention(int id)
{
return m_mention[id].GetAbbreviation();
}
void AiExpert::SetAbbreviationMention(int id,CString abb)
{
m_mention[id].SetAbbreviation(abb);
}
int AiExpert::GetNumRule()
{
return m_ruleList.GetCount();
}
CString AiExpert::GetStringOfRuleAll(AiRule * rule)
{
ASSERT(rule != NULL);
CString str;
CString tail;
if (rule->GetMt().GetSign() == NeedVersa)
tail = "!";
tail += GetAbbreviationMention(rule->GetMt().GetId());
tail = "=>"+tail;
AiMt mt;
mt.SetId(rule->GetWffs().GetId());
mt.SetSign(rule->GetWffs().GetSign());
mt.SetPre(rule->GetWffs().GetPre());
str = GetStringOfWffs(&mt);
str +=tail;
return str;
}
CString AiExpert::GetStringOfWffs(AiMt * mt)
{
CString pre;
if (mt->GetPre() != NULL)
{
pre = GetStringOfWffs(mt->GetPre());
pre += "&";
if (mt->GetSign() == NeedVersa)
pre += "!";
pre += GetAbbreviationMention(mt->GetId());
return pre;
}
if (mt->GetSign() == NeedVersa)
pre += "!";
pre += GetAbbreviationMention(mt->GetId());
return pre;
}
CString AiExpert::GetRuleString(int index)
{//得到第index条规则的字符全名,index从0开始
POSITION p;
int i=0;
AiRule* pRule;
for (p=m_ruleList.GetHeadPosition();p!=NULL && i<index;i++)
pRule = (AiRule*)m_ruleList.GetNext(p);
pRule = (AiRule*)m_ruleList.GetNext(p);
return GetStringOfRuleAll(pRule);
}
void AiExpert::SetFactUnknow(int id)
{
if (CheckAndAskAssign(id,FactUnknow) != IDYES)
return ;
m_fact[id].SetUnknow();
}
void AiExpert::DeleteRule(int index)
{
//index is of 0-based
if (index>m_ruleList.GetCount())
return;
POSITION pos1,pos2;
AiRule* rule;
int i=0;
for( pos1 = m_ruleList.GetHeadPosition(); ( pos2 = pos1 ) != NULL;i++ )
{
if( i == index ){
rule =(AiRule*) m_ruleList.GetAt( pos2 ); // Save the old pointer for
//deletion.
m_ruleList.RemoveAt( pos2 );
delete rule; // Deletion avoids memory leak.
return;
}
else{
m_ruleList.GetNext( pos1 );
}
}
/*for( pos2 = m_ruleList.GetHeadPosition(); pos2 != NULL && i<index; i++)
m_ruleList.GetNext( pos2 );
rule = (AiRule*)m_ruleList.GetAt( pos2 );
m_ruleList.RemoveAt( pos2 );
delete rule;
*/
}
CObList* AiExpert::GetExpertGoalObList()
{
return &m_goalList;
}
AiMt* AiExpert::GetGoalAsMt(int index)
{
POSITION p;
CString str;
if (m_goalList.GetCount()<index)
return NULL;
AiMt* pMt;
int i=0;
for (p=m_goalList.GetHeadPosition();p!=NULL && i<index;i++){
pMt = (AiMt*)m_goalList.GetNext(p);
}
pMt = (AiMt*)m_goalList.GetNext(p);
return pMt;
}
int AiExpert::GetNumGoal()
{
return m_goalList.GetCount();
}
void AiExpert::DeleteGoal(int index)
{
if (index>m_goalList.GetCount())
return;
POSITION p;
AiMt* goal;
int i=0;
for (p=m_goalList.GetHeadPosition();p!=NULL && i<index;i++)
m_goalList.GetNext(p);
goal = (AiMt*)m_goalList.GetAt(p);
m_goalList.RemoveAt(p);
delete goal;
}
void AiExpert::SetMtNeedNotAsk(AiMt mt)
{
int id;
id = mt.GetId();
ASSERT(id>=0&& id<MaxNum);
m_NeedNotAsk[id] = 1;
}
void AiExpert::SetMtNeedNotAsk(int index)
{
ASSERT(index>=0&& index<MaxNum);
m_NeedNotAsk[index] = 1;
}
void AiExpert::SetMtNeedAsk(AiMt mt)
{
int id;
id = mt.GetId();
ASSERT(id>=0&& id<MaxNum);
m_NeedNotAsk[id] = 0;
}
void AiExpert::SetMtNeedAsk(int index)
{
ASSERT(index>=0&& index<MaxNum);
m_NeedNotAsk[index] = 0;
}
int AiExpert::GetMtNeedNotAsk(int id)
{
ASSERT(id>=0 && id<MaxNum);
return m_NeedNotAsk[id];
}
int AiExpert::GetMtNeedNotAsk(AiMt mt)
{
ASSERT(mt.GetId()>=0 && mt.GetId()<MaxNum);
return m_NeedNotAsk[mt.GetId()];
}
void AiExpert::ShowTreeCtrlAnswer()
{
if (m_TreeCtrl ==NULL)
return;
int s =CheckResultState();
if (s == ResultSingleIncertitude
|| s == ResultMultiAllNotOk)
return;
SearchForTree();
SetTreeCtrlNewStyle(TVS_HASBUTTONS, TRUE);
SetTreeCtrlNewStyle(TVS_HASLINES, TRUE);
SetTreeCtrlNewStyle(TVS_LINESATROOT, TRUE);
m_TreeCtrl->DeleteAllItems();
//
AiTree* root = new AiTree;
root->SetMention("结论");
AiTree* t10 = new AiTree;
t10->SetMention("目标1");
root->SetRch(t10);
AiTree* t11 = new AiTree;
t11->SetMention("目标2");
t10->SetLch(t11);
AiTree* t12 = new AiTree;
t12->SetMention("目标3");
t11->SetLch(t12);
AiTree* t20 = new AiTree;
t20->SetMention("目标1的原因1");
t10->SetRch(t20);
AiTree* t21 = new AiTree;
t21->SetMention("目标1的原因2");
t20->SetLch(t21);
//
AiTree* t23 = new AiTree;
t23->SetMention("目标1的原因3");
t21->SetLch(t23);
AiTree* t30 = new AiTree;
t30->SetMention("目标1的原因1的原因");
t20->SetRch(t30);
AiTree* t31 = new AiTree;
t31->SetMention("目标1的原因1的原因");
t21->SetRch(t30);
AiTree* t22 = new AiTree;
t22->SetMention("目标2的原因");
t11->SetRch(t22);
///
AddBinaryTreeToTreeCtrl(m_SearchTree,m_TreeCtrl);
//AddBinaryTreeToTreeCtrl(root,m_TreeCtrl);
delete m_SearchTree;
m_SearchTree = NULL;
}
void AiExpert::AddBinaryTreeToTreeCtrl(AiTree * root, CTreeCtrl * treeCtrl)
{
treeCtrl->DeleteAllItems();//
TV_INSERTSTRUCT TreeCtrlItem;
TreeCtrlItem.hParent=TVI_ROOT;
TreeCtrlItem.hInsertAfter=TVI_LAST;
TreeCtrlItem.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
AiTree* temp;
temp = root;
HTREEITEM hTreeItem1;
while (temp!=NULL)
{
char str[500];
strcpy(str,temp->GetMention());
TreeCtrlItem.item.pszText=str;
TreeCtrlItem.item.lParam=0;
TreeCtrlItem.item.iImage=0;
TreeCtrlItem.item.iSelectedImage=0+3;
hTreeItem1=m_TreeCtrl->InsertItem(&TreeCtrlItem);
AiTree* t;
t = temp->GetRch();
InsideAddBinaryTreeToTreeCtrl(t,hTreeItem1);
temp = temp->GetLch();
}
m_TreeCtrl->Expand(hTreeItem1,TVE_EXPAND);
}
void AiExpert::InsideAddBinaryTreeToTreeCtrl(AiTree * t, HTREEITEM hTreeItem)
{
if (t == NULL)
return;
AiTree* temp;
temp = t;
HTREEITEM hTreeItem1;
TV_INSERTSTRUCT TreeCtrlItem;
TreeCtrlItem.hParent=hTreeItem;
TreeCtrlItem.hInsertAfter=TVI_LAST;
TreeCtrlItem.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
while (temp!=NULL)
{
char str[500] = "";
strcpy(str,temp->GetMention());
TreeCtrlItem.item.pszText=str;
TreeCtrlItem.item.lParam=temp->GetId();
if (temp->GetRch()!= NULL){
TreeCtrlItem.item.iImage=1;
TreeCtrlItem.item.iSelectedImage=1+3;
}
else{
TreeCtrlItem.item.iImage=2;
TreeCtrlItem.item.iSelectedImage=2+3;
}
hTreeItem1=m_TreeCtrl->InsertItem(&TreeCtrlItem);
AiTree* tt;
tt = temp->GetRch();
InsideAddBinaryTreeToTreeCtrl(tt,hTreeItem1);
temp = temp->GetLch();
}
}
void AiExpert::SetTreeCtrlNewStyle(long lStyleMask, BOOL bSetBits)
{
long lStyleOld;
lStyleOld = GetWindowLong(m_TreeCtrl->m_hWnd, GWL_STYLE);
lStyleOld &= ~lStyleMask;
if (bSetBits)
lStyleOld |= lStyleMask;
SetWindowLong(m_TreeCtrl->m_hWnd, GWL_STYLE, lStyleOld);
//SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
}
int AiExpert::GetFact(int id)
{
return m_fact[id].GetValue();
}
BOOL AiExpert::GetMtCanUnknow(int id)
{
ASSERT(id>=0 && id<MaxNum);
return m_mtCanUnknow[id];
}
BOOL AiExpert::GetMtCanUnknow(AiMt mt)
{
return m_mtCanUnknow[mt.GetId()];
}
void AiExpert::SetAskFactTrue(int id)
{
if (CheckAndAskAssign(id,FactTrue) != IDYES)
return ;
m_fact[id].SetTrue();
m_factBA[id].SetTrue();
}
void AiExpert::SetAskFactFalse(int id)
{
if (CheckAndAskAssign(id,FactTrue) != IDYES)
return ;
m_fact[id].SetFalse();
m_factBA[id].SetFalse();
}
void AiExpert::SetMtCanUnknow(int id)
{
m_mtCanUnknow[id] = true;
}
void AiExpert::SetMtCannotUnknow(int id)
{
m_mtCanUnknow[id] = false;
}
void AiExpert::SetMention(int id, CString Qstr, CString Tstr, CString Fstr)
{
ASSERT( id>=0 && id<MaxNum);
m_mention[id].SetQuestionMention(Qstr);
m_mention[id].SetTrueMention(Tstr);
m_mention[id].SetFalseMention(Fstr);
char temp[4];
itoa(id,temp,10);
char str[10];
strcpy(str,"#");
strcat(str,temp);
m_mention[id].SetAbbreviation(str);
}
void AiExpert::SetMention(int id, CString Astr, CString Qstr, CString Tstr, CString Fstr)
{
ASSERT( id>=0 && id<MaxNum);
m_mention[id].SetQuestionMention(Qstr);
m_mention[id].SetTrueMention(Tstr);
m_mention[id].SetFalseMention(Fstr);
m_mention[id].SetAbbreviation(Astr);
}
CString AiExpert::GetAssertQuestionMention(int id)
{
return m_mention[id].GetQuestionMention();
}
CString AiExpert::GetMtQuestionMention(AiMt mt)
{
return m_mention[mt.GetId()].GetQuestionMention();
}
void AiExpert::SetAssertQuestionMention(int id, CString Qstr)
{
ASSERT(id>=0 && id<MaxNum);
m_mention[id].SetQuestionMention(Qstr);
}
BOOL AiExpert::CheckAssertTorF(int id)
{
int t = m_fact[id].GetValue();
if (t == FactTrue)
return TRUE;
else
return FALSE;
}
int AiExpert::GetRuleMtId(int index)
{
if (index<0 || index>GetNumRule())
return -1;
POSITION p;
int i=0;
AiRule* pRule;
for (p=m_ruleList.GetHeadPosition();p!=NULL && i<index;i++)
pRule = (AiRule*)m_ruleList.GetNext(p);
pRule = (AiRule*)m_ruleList.GetNext(p);
AiMt ruleMt = pRule->GetMt();
return ruleMt.GetId();
}
int AiExpert::GetGoalMtId(int index)
{
POSITION p;
CString str;
if (m_goalList.GetCount()<index)
return -1;
AiMt* pMt;
int i=0;
for (p=m_goalList.GetHeadPosition();p!=NULL && i<index;i++){
pMt = (AiMt*)m_goalList.GetNext(p);
}
pMt = (AiMt*)m_goalList.GetNext(p);
return pMt->GetId();
}
void AiExpert::SetAssertValueWithoutCheck(int id, int value)
{
if (id<0 || id>MaxNum)
ASSERT(0);
switch(value)
{
case FactTrue:
m_fact[id].SetTrue();
break;
case FactFalse:
m_fact[id].SetFalse();
break;
case FactUnknow:
m_fact[id].SetUnknow();
break;
default:
ASSERT(0);
}
}
int AiExpert::SelfCheck()
{
//模拟地毯式搜索的全部可能,进行知识的安全性检测
//返回true安全,false有错误。
//此函数好象无实际使用价值
const int maxnum = GetNumAssert();
int* Leave = new int[maxnum];
int* LeaveT = new int[maxnum];
int* OldValue = new int[maxnum];
for (int i=0;i<maxnum;i++){
OldValue[i] = GetFact(i);
LeaveT[i] = 1;
}
//取得叶子节点
int numRule = GetNumRule();
for (i=0;i<numRule;i++){
int j = GetRuleMtId(i);
LeaveT[j] = 0;
}
int numGoal = GetNumGoal();
for (i=0;i<numGoal;i++){
int j = GetRuleMtId(i);
LeaveT[j] = 0;
}
for (i=0;i<maxnum;i++){
if (GetFact(i) != FactUnknow)
LeaveT[i] = 0;
}
for (i=0;i<maxnum;i++){
if (m_NeedNotAsk[i])
LeaveT[i] = 0;
}
int index=0;
for (i=0;i<maxnum;i++){
if (LeaveT[i] == 1){
Leave[index] = i;
index++;
}
}
delete LeaveT;
//开始地毯式搜索
for (i=0;i<index;i++){
SetAssertValueWithoutCheck(i,FactUnknow);
}
if (InsideSelfCheck(Leave,index,0) == false){
for (i=0;i<maxnum;i++){
SetAssertValueWithoutCheck(i,OldValue[i]);
}
delete Leave;
delete OldValue;
return false;
}
//恢复数据
for (i=0;i<maxnum;i++){
SetAssertValueWithoutCheck(i,OldValue[i]);
}
delete Leave;
delete OldValue;
::MessageBox(NULL,"知识通过自检,没有发现矛盾!","自检完成",MB_OK
| MB_ICONEXCLAMATION |MB_SETFOREGROUND | MB_TOPMOST );
return true;
}
int AiExpert::InsideSelfCheck(int * Leave, int Total, int Present)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -