www.pudn.com > ProSys.rar > rules.cpp


/*-------------------------------------------------------------------*\ 
|  人工智能 专家系统示例  参见付 DOC文档                              | 
|  Written by Redream                                 | 
|  Copyright ? 2004                                                   | 
\*-------------------------------------------------------------------*/ 
 
#include  
#include  
#include  
#include  
 
struct LRules { 
	char *strIfRule ; 
	char *strThenRul ; 
	int intDTrust ; 
	int intFlagLive ; 
	struct LRules * next ; 
} ; 
 
struct SFact { 
	char strIfRule[10] ; 
	struct SFact *next ; 
} ; 
 
class CIntelligence 
{ 
public : 
	int totalno ; 
	struct SFact *Factnew ; 
	struct SFact *Facthead ; 
	struct SFact *Facttmp ; 
 
	struct LRules * AllRulesHead ; 
	struct LRules * AllRulestmp ; 
 
public : 
	void Initrules() ; 
	void Display() ; 
	void Deduce() ; 
	void Setq() ; 
	void Use_then() ; 
	void Destroy() ; 
	void Translate( const char * src, char * rst) ;  
	//void Setq2( char *facts , UINT Flag1) ; 
	int Remember(const char *partofrule ) ; 
	int Try_rule() ; 
	int Step_forward() ; 
 
} ; 
//// 初始化数值.  
void CIntelligence::Initrules() 
{ 
	AllRulestmp = NULL ; 
 
	AllRulesHead = new LRules ;   //15 
	AllRulesHead->strIfRule = "F20,M4," ; 
	AllRulesHead->strThenRul = "H7" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
	 
	AllRulesHead = new LRules ;   //14 
	AllRulesHead->strIfRule = "F17,F18,F19,M4," ; 
	AllRulesHead->strThenRul = "H6" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //13 
	AllRulesHead->strIfRule = "F14,F16,F17,F18,M4," ; 
	AllRulesHead->strThenRul = "H5" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //12 
	AllRulesHead->strIfRule = "F15,M3," ; 
	AllRulesHead->strThenRul = "H4" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //11 
	AllRulesHead->strIfRule = "F13,F14,F16,M3," ; 
	AllRulesHead->strThenRul = "H3" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //10 
	AllRulesHead->strIfRule = "F12,F15,M1,M2," ; 
	AllRulesHead->strThenRul = "H2" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //9 
	AllRulesHead->strIfRule = "F12,F13,M1,M2," ; 
	AllRulesHead->strThenRul = "H1" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //8 
	AllRulesHead->strIfRule = "F8,M1," ; 
	AllRulesHead->strThenRul = "M3" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //7 
	AllRulesHead->strIfRule = "F7,M1," ; 
	AllRulesHead->strThenRul = "M3" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //6 
	AllRulesHead->strIfRule = "F4,F5,F6," ; 
	AllRulesHead->strThenRul = "M2" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //5 
	AllRulesHead->strIfRule = "F3," ; 
	AllRulesHead->strThenRul = "M2" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //4 
	AllRulesHead->strIfRule = "F10,F11," ; 
	AllRulesHead->strThenRul = "M4" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //3 
	AllRulesHead->strIfRule = "F9," ; 
	AllRulesHead->strThenRul = "M4" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //2 
	AllRulesHead->strIfRule = "F2," ; 
	AllRulesHead->strThenRul = "M1" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	AllRulesHead = new LRules ;   //1 
	AllRulesHead->strIfRule = "F1," ; 
	AllRulesHead->strThenRul = "M1" ; 
	AllRulesHead->next = AllRulestmp ; 
	AllRulestmp = AllRulesHead ; 
 
	while( AllRulestmp->next != NULL ) 
	{ 
	  AllRulestmp->intDTrust=0 ; 
	  AllRulestmp->intFlagLive=0 ; 
	  AllRulestmp = AllRulestmp->next ; 
	} 
 
	AllRulestmp->intDTrust=0 ; 
	AllRulestmp->intFlagLive=0 ; 
 
	AllRulestmp = AllRulesHead ; 
} 
 
///////////////////////////////////////////////////////////////setq 
void CIntelligence::Setq() 
{ 
	char *facts = new char[10] ; 
	char jing = '#' ; 
	cout << "input IfRule:" << "\n" ; 
	cin >>facts ; 
	//Facthead= ( struct SFact * )malloc( sizeof(struct SFact) ) ; 
	Facthead = new ( SFact ) ;  
	Facthead->next = NULL ; 
	strcpy( Facthead->strIfRule, facts) ;  
	Facttmp = Facthead ; 
/**/ 
	while ( facts[0]!=jing ) 
		{ 
		delete facts ; 
		facts = new char[10] ; 
		cin >>facts ; 
		if ( facts[0] == jing )	 
		{ 
			break ;  
		} 
		//if ( facts=="#" ) break ; 
		Factnew = new ( SFact ) ; 
		Factnew->next = NULL ; 
 		strcpy( Factnew->strIfRule, facts ) ; 
		Facttmp->next = Factnew ; 
		Facttmp = Factnew ; 
		} 
 
	Facttmp = Facthead; 
	delete facts ; 
	facts = NULL ; 
} 
 
////////////////////////////////////////////////remember 
 
int CIntelligence::Remember(const char *pPartOfRule ) 
{ 
	Facttmp = Facthead ; 
 
	while (Facttmp->next){ 
 
		if ( !strcmp( Facttmp->strIfRule, pPartOfRule) ) 
		{//cout <<" have this " << partOfRule << "\n" ; 
			return 1 ; 
		} 
		else 
		{ 
			///////////////////// 
		} 
		Facttmp = Facttmp->next; 
	}   
 
	if ( !strcmp( Facttmp->strIfRule, pPartOfRule) ) 
	{//cout <<" have this " << partOfRule << "\n" ; 
		return 1 ; 
	} 
	else{ 
		///////////////////// 
	} 
return 0 ; 
} 
 
//////////////////////////////////////////////////////use then 
void CIntelligence::Use_then() 
{   /////cout <strIfRule << "\n"; 
 
	Facttmp = Facthead; 
	while ( Facttmp->next != NULL ){ 
		Facttmp = Facttmp->next ; 
	} 
 
	Factnew = new ( SFact ) ; 
	Factnew->next = NULL ; 
 	strcpy( Factnew->strIfRule, AllRulestmp->strThenRul ) ; 
 
	cout << AllRulestmp->strThenRul << "  Adding in Fact ! \n\n" ; 
 
	Facttmp->next = Factnew ; 
 	//strcpy( Factnew->strIfRule, "#" ) ; 
	Facttmp = Facthead; 
 
} 
 
//////////////////////////////////////////////    try_rule 
int CIntelligence::Try_rule( ) 
{ 
char strpart[10] ; 
int i, j, k ; 
int begini = 0 ; 
int endi = 0 ; 
i = 0  ; 
 
while ( i < int(strlen(AllRulestmp->strIfRule)) ) 
	{ 
	 if (AllRulestmp->strIfRule[i] == ',') 
		{ 
		endi = i-1 ; 
		k = 0 ; 
		for ( j = begini; j <= endi; j++ ) 
		{ 
			strpart[k] = AllRulestmp->strIfRule[j] ; 
			k++ ;  
		} 
			 
		strpart[k] = '\0' ; 
		begini = i+1 ; 
		//cout << strpart << " --- strpart \n" ; 
		if ( !Remember( strpart ) ) return 0 ; // 前件在Fact里没找到 
 
		} 
	 i++ ; 
	} 
 
// 前件在Fact里找到 处理后件 
 
if ( Remember( AllRulestmp->strThenRul ) )  { //找到 
	cout << "========= find out =========\n"  ; 
	cout << "Ifrule (" << AllRulestmp->strIfRule <<") Find All in Fact, Thenrule ( " << AllRulestmp->strThenRul << " ) Addin Already \n\n" ; 
	return 1; 
	} 
else{ //加入 
	cout << "========= find out ========\n"  ; 
	cout << "Ifrule (" << AllRulestmp->strIfRule <<") Find All in Fact, Thenrule ( " << AllRulestmp->strThenRul << " ) To be Addin \n" ; 
	Use_then() ; 
	return 2 ; 
	} 
} 
 
//////////////////////////////////////////  step forward  
int CIntelligence::Step_forward() 
{int tmptryrule ; 
	while (AllRulestmp->next){ 
		tmptryrule = Try_rule() ; 
		if ( tmptryrule==2 ){ 
			return 1 ; 
			} 
		if ( tmptryrule == 0 || tmptryrule == 1 ){ 
			AllRulestmp = AllRulestmp->next; 
			totalno++ ; 
			cout << "Checking rule " << totalno << endl ; 
			} 
 
	}  
		 
	tmptryrule = Try_rule() ; 
	if ( tmptryrule == 2 ){ 
		return 1 ; 
		} 
	if ( tmptryrule == 0 || tmptryrule == 1 ) 
	{ 
		//AllRulestmp=AllRulestmp->next; 
		//totalno++ ; 
		//if ( AllRulestmp->next ) cout << "Checking rule " << totalno << endl ; 
	} 
 
return 0 ; 
} 
 
///////////////////////////////////////////// deduce 
void CIntelligence::Deduce() 
{ 
 
totalno = 1 ; 
AllRulestmp = AllRulesHead ; 
 
 
cout << "Begin from Rule1 \n" ; 
 
while ( Step_forward() ) { 
	if ( AllRulestmp->strThenRul[0]=='H' ) { 
		break ; 
	} 
	AllRulestmp = AllRulesHead ; 
	totalno = 1 ; 
	cout << "Return to Rule1 \n" ; 
	} 
} 
 
void CIntelligence::Translate( const char * src, char * rst ) 
{ 
if ( !strcmp(src,"H1") ) strcpy (rst,"It 's panther (Bao)") ; 
if ( !strcmp(src,"H2") ) strcpy (rst,"It 's tiger (Hu)") ; 
if ( !strcmp(src,"H3") ) strcpy (rst,"It 's giraffe (changjinglu)") ; 
if ( !strcmp(src,"H4") ) strcpy (rst,"It 's zebra (Banma)") ; 
if ( !strcmp(src,"H5") ) strcpy (rst,"It 's ostrich (Tuoniao)") ; 
if ( !strcmp(src,"H6") ) strcpy (rst,"It 's penguin (Qi'e) ") ; 
if ( !strcmp(src,"H7") ) strcpy (rst,"It 's quakerbird (Xintianweng)") ; 
 
} 
 
////////////////////////////////////////////////////////////////display 
void CIntelligence::Display() 
{ 
	char * charTmp = new char[50] ;  
	while( Facthead->next ) 
	{ 
		//cout << Facthead->strIfRule << "\n" ; 
		// 
		if ( Facthead->strIfRule[0] == 'H' ) break ; 
 
		// 
		Facthead =Facthead->next; 
	}  
	if (Facthead->strIfRule[0] == 'H' ) { 
		cout <<"\n\nThe Fanal Resoult is : "<< Facthead->strIfRule << "\n\n" ; 
		Translate ( Facthead->strIfRule, charTmp ) ; 
		cout << charTmp <<"\n\n" ; 
	} 
	else { 
		cout <<"It have no RESOULT ! \n" << endl ; 
	} 
 
	delete charTmp ; 
	charTmp = NULL ; 
 
} 
 
///////////////////////////destroy pointers 
void CIntelligence::Destroy() 
{ 
	///////////////delete about SFact 
	if ( ( Facthead == NULL ) || ( AllRulesHead == NULL ) ) return ; 
	Factnew = Facthead ; 
	Facttmp = Facthead ; 
	while ( Facttmp->next != NULL ){ 
		Facthead = Facttmp ; 
		Facttmp = Facttmp->next ; 
		delete Facthead ; 
		Facthead = NULL ; 
	}	 
	if ( Facttmp != NULL ) 
	{ 
		delete Facttmp ; 
	} 
	Facttmp = NULL ; 
	Factnew = NULL ; 
	///////////////delete about LRules 
		 
	AllRulestmp = AllRulesHead ; 
	while ( AllRulestmp->next != NULL ){ 
		AllRulesHead = AllRulestmp ; 
		AllRulestmp = AllRulestmp->next ; 
		delete AllRulesHead ; 
		AllRulesHead = NULL ; 
	} 
	if ( AllRulestmp != NULL  ) 
	{ 
		delete AllRulestmp ; 
	} 
	AllRulestmp = NULL ; 
	AllRulesHead = NULL ; 
	 
 
} 
 
//////////////////////////////////////////////  main test 
void main() 
{ 
	CIntelligence Asample ; 
	Asample.Initrules() ; 
	Asample.Setq() ;  
	Asample.Deduce() ; 
	Asample.Display() ; 
	Asample.Destroy() ; 
	Asample.Destroy() ; 
	/* END */ 
}