📄 rulemaintenance.cpp
字号:
// RuleMaintenance.cpp : implementation file
//
#include "stdafx.h"
#include "minedabse.h"
#include "RuleMaintenance.h"
#include "ircleDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CMineDabseApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CRuleMaintenance dialog
CRuleMaintenance::CRuleMaintenance(CWnd* pParent /*=NULL*/)
: CDialog(CRuleMaintenance::IDD, pParent)
{
//{{AFX_DATA_INIT(CRuleMaintenance)
m_editAnd = _T("");
m_editOr = _T("");
factChain=new CFactChain();
ruleChain=new RuleChain();
//}}AFX_DATA_INIT
}
void CRuleMaintenance::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRuleMaintenance)
DDX_Control(pDX, IDC_EDITOR, m_editor);
DDX_Control(pDX, IDC_EDITAND, m_editand);
DDX_Control(pDX, IDC_RADIOAND, m_radioAnd);
DDX_Control(pDX, IDC_LISTRule, m_listRule);
DDX_Text(pDX, IDC_EDITAND, m_editAnd);
DDX_Text(pDX, IDC_EDITOR, m_editOr);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRuleMaintenance, CDialog)
//{{AFX_MSG_MAP(CRuleMaintenance)
ON_BN_CLICKED(IDC_RADIOOR, OnRadioor)
ON_BN_CLICKED(IDC_RADIOAND, OnRadioand)
ON_BN_CLICKED(IDC_BUTTONPRE, OnButtonpre)
ON_BN_CLICKED(IDC_BUTTONINSERT, OnButtoninsert)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRuleMaintenance message handlers
BOOL CRuleMaintenance::OnInitDialog()
{
CDialog::OnInitDialog();
preCount=0;
for(int i=0;i<10;i++)
{
strPre[i]="";
detectFlag[i]=0;
}
// TODO: Add extra initialization here
m_listRule.InsertColumn(0,"规则名称",LVCFMT_LEFT,90);
m_listRule.InsertColumn(1,"前提",LVCFMT_LEFT,55);
m_listRule.InsertColumn(2,"结论",LVCFMT_LEFT,55);
m_listRule.InsertColumn(3,"类型",LVCFMT_LEFT,60);
int nItem;
try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM rule",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
vRuleName=m_pRecordset->GetCollect("ruleName");
vPre = m_pRecordset->GetCollect("pre");
vCon = m_pRecordset->GetCollect("con");
vType = m_pRecordset->GetCollect("type");
nItem=m_listRule.InsertItem(0xffff,(_bstr_t)vRuleName);
m_listRule.SetItem(nItem,1,1,(_bstr_t)vPre,NULL,0,0,0);
m_listRule.SetItem(nItem,2,1,(_bstr_t)vCon,NULL,0,0,0);
m_listRule.SetItem(nItem,3,1,(_bstr_t)vType,NULL,0,0,0);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_listRule.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
}
catch(_com_error e)///捕捉异常
{
CString str=e.ErrorMessage();
str=str+"读取数据库失败!";
AfxMessageBox(str);///显示错误信息
}
CheckRadioButton(IDC_RADIOAND,IDC_RADIOOR,IDC_RADIOAND);
m_editAnd="";
m_editOr="";
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CRuleMaintenance::OnRadioor()
{
// TODO: Add your control notification handler code here
CheckRadioButton(IDC_RADIOAND,IDC_RADIOOR,IDC_RADIOOR);
m_editor.EnableWindow(true);
m_editand.EnableWindow(false);
}
void CRuleMaintenance::OnRadioand()
{
// TODO: Add your control notification handler code here
CheckRadioButton(IDC_RADIOAND,IDC_RADIOOR,IDC_RADIOAND);
m_editor.EnableWindow(false);
m_editand.EnableWindow(true);
}
void CRuleMaintenance::OnButtonpre()
{
// TODO: Add your control notification handler code here
//multiPreDlg.OnInitDialog();
int intRadio=GetCheckedRadioButton(IDC_RADIOAND,IDC_RADIOOR);
if (IDC_RADIOAND==intRadio){
multiPreDlg.DoModal();
showPre();
for(int i=preCount;i>0;i--){
m_editAnd+=" and "+strPre[i];
}
UpdateData(false);
}
else{
multiPreOr.DoModal();
}
}
void CRuleMaintenance::showPre(){
UpdateData(true);
strPre[preCount]=m_editAnd;
if (multiPreDlg.m_edit1.CompareNoCase("")!=0)
{
preCount++;
strPre[preCount]=multiPreDlg.m_edit1;
}
if (multiPreDlg.m_edit2.CompareNoCase("")!=0)
{
preCount++;
strPre[preCount]=multiPreDlg.m_edit2;
}
if (multiPreDlg.m_edit3.CompareNoCase("")!=0)
{
preCount++;
strPre[preCount]=multiPreDlg.m_edit3;
}
if (multiPreDlg.m_edit4.CompareNoCase("")!=0)
{
strPre[preCount]=multiPreDlg.m_edit4;
preCount++;
}
if (multiPreDlg.m_edit5.CompareNoCase("")!=0)
{
preCount++;
strPre[preCount]=multiPreDlg.m_edit5;
}
if (multiPreDlg.m_edit6.CompareNoCase("")!=0)
{
preCount++;
strPre[preCount]=multiPreDlg.m_edit6;
}
if (multiPreDlg.m_edit7.CompareNoCase("")!=0)
{
preCount++;
strPre[preCount]=multiPreDlg.m_edit7;
}
if (multiPreDlg.m_edit8.CompareNoCase("")!=0)
{
preCount++;
strPre[preCount]=multiPreDlg.m_edit8;
}
}
void CRuleMaintenance::OnButtoninsert()
{
// TODO: Add your control notification handler code here
//////////////////////////////////////
CString ruleName,rulePre,ruleCon;
// _variant_t vRuleName,vRulePre,vRuleCon;
showPre();
bool equalFlag=false;
try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM rule",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
ruleName=(char*)(_bstr_t)m_pRecordset->GetCollect("ruleName");
rulePre=(char*)(_bstr_t)m_pRecordset->GetCollect("pre");
ruleCon=(char*)(_bstr_t)m_pRecordset->GetCollect("con");
ruleChain->appendRule(ruleName,rulePre,ruleCon,false);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
}
catch(_com_error e)///捕捉异常
{
CString str=e.ErrorMessage();
str=str+"读取数据库失败!";
AfxMessageBox(str);///显示错误信息
}
int recordCount=0;
RuleNode* node=ruleChain->getFirstRule();
while (node!=NULL){
ruleName=node->name;
rulePre=node->premise;
ruleCon=node->conclusion;
recordCount++;
/// ///////////////
CString pre_str[10],rulePreTemp;//存放规则前提,
int findAndFlag,i=-1;
bool loopEnd=false;
rulePreTemp=rulePre;
findAndFlag=rulePreTemp.Find("and");
//if (findAndFlag>0){
while (!loopEnd){
if (findAndFlag!=-1){
// while(rulePre->GetLength()>0){
i++;
pre_str[i]=rulePreTemp.Left(findAndFlag);
pre_str[i].TrimLeft();
pre_str[i].TrimRight();
// rulePreTemp.TrimLeft();
rulePreTemp.Delete(0,findAndFlag+3);
//}
}
else {
i++;
pre_str[i]=rulePreTemp;
pre_str[i].TrimLeft();
pre_str[i].TrimRight();
loopEnd=true;
}
findAndFlag=rulePreTemp.Find("and");//分离多个前提,findAndFlag记录and的位置
}// while (!loopEnd)
/*}//if(findAndFlag>0)
else{
i++;
pre_str[i]=rulePreTemp;
pre_str[i].TrimLeft();
pre_str[i].TrimRight();
}*/
//////////////////////////////
int equalNum=-1;
if (preCount==i){///规则等价判断
for(int j=preCount;j>=0;j--){
for(int k=i;k>=0;k--){
if(0==detectFlag[i])
if (strPre[j].CompareNoCase(pre_str[k])==0){
detectFlag[k]=1;
equalNum++;
break;
}
}
}
if (equalNum==preCount)
{//输出等价
//CString messageStr,str="该规则和规则库中第%d条冲突!";
// messageStr.Format(str,recordCount);
PreEqualError preEqualError;
preEqualError.m_edit1.Format("%d",recordCount);
preEqualError.m_edit2.Format("%d",recordCount);
preEqualError.DoModal();
equalFlag=true;
break;
}
}// if (preCount==i )///规则等价判断
/////////////////////
factChain->appendFact(rulePre);
node=node->next;
}
CircleDlg circleDlg;
circleDlg.m_eidt1="6";
circleDlg.DoModal();
///////////////////////////////////////////////////////////////////
if (!equalFlag){//不等价,则判断有无循环
CString ruleCon1;
RuleNode* nodeRule=ruleChain->getFirstRule();
recordCount=0;
while (nodeRule!=NULL){
CString pre_str[10],rulePreTemp;//存放规则前提,
int findAndFlag,i=-1;
bool loopEnd=false;
rulePreTemp=nodeRule->premise;
ruleCon1=nodeRule->conclusion;
findAndFlag=rulePreTemp.Find("and");
while (!loopEnd){
if (findAndFlag!=-1){
// while(rulePre->GetLength()>0){
i++;
pre_str[i]=rulePreTemp.Left(findAndFlag);
pre_str[i].TrimLeft();
pre_str[i].TrimRight();
// rulePreTemp.TrimLeft();
rulePreTemp.Delete(0,findAndFlag+3);
//}
}
else {
i++;
pre_str[i]=rulePreTemp;
pre_str[i].TrimLeft();
pre_str[i].TrimRight();
loopEnd=true;
}
findAndFlag=rulePreTemp.Find("and");//分离多个前提,findAndFlag记录and的位置
}// while (!loopEnd)
//推理
int temp_int=i;
int matchResult=-1;//每次匹配初始化0
for(;i>=0;i--){
CFact* node=factChain->getHead();
while (node!=NULL){
// CString factName=node->name;
// fact=node->fact;
if(0==node->fact.Compare(pre_str[i])){
matchResult++;//匹配成功
break;
}
else{//找出下一个事实
node=node->next;
if(NULL==node)//没有匹配的事实
i=-2;//没有匹配规则的事实,匹配结束,i值取除-1的负数
}
}//while(node!=NULL)
}//for(;i>=0;i--)
if(matchResult==temp_int){//相等则表示匹配成功
//从事实列表中删出匹配成功的事实
for(;temp_int>=0;temp_int--){
CFact* node=factChain->getHead();
while (node!=NULL){
// CString factName=*node->name;
if(0==node->fact.CompareNoCase(pre_str[temp_int])){
factChain->deleteFact(node->fact);
break;
}
else{
//找出下一个事实
node=node->next;
if(NULL==node)//没有匹配的事实
break;
}
}//while
}//for(;temp_int>=0;temp_int--)
//把结论加入事实列表中
factChain->appendFact(ruleCon1);
}//if(matchResult==temp_int)
}///while (nodeRule!=NULL)
CircleDlg circleDlg;
circleDlg.m_eidt1="6";
circleDlg.DoModal();
}
////////////////
////////////////////////////////////////////////////////////////
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -