home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.umcs.maine.edu
/
2015-02-07.ftp.umcs.maine.edu.tar
/
ftp.umcs.maine.edu
/
pub
/
thesis
/
zhongy
/
rule
/
rule_based.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-15
|
39KB
|
1,504 lines
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <string.h>
#include <ctype.h>
#include "rule.h"
int NumberofObjects;
/*ObjectType *FirstObject; */
int Length1;
char *List[20];
int option, option1;
int Finish,Finished,Explanation; /*True--1, False--0*/
ObjectNameType ObjectName;
ObjectValueType ObjectValue;
ObjectType *PreviousPtr, *ObjectPtr;
struct RuleType *PreviousRulePtr, *RulePtr;
RuleNameType RuleName;
int NumberofRules;
RuleType *FirstRule;
PremiseType *PremisePtr, *PreviousPremisePtr;
ConclusionType *ConclusionPtr;
RuleType *NewRule;
int Line;
char d;
char *str1, *Title;
/**************Function 1 **********************************************/
static void EraseScreen()
{
system("clear");
};
/**************Function 2 **********************************************/
/*
change C to C++
we put all paramater to the ()
*/
static void GenerateList(char *List[20],int *Length1,int ListNumber)
/*
used in C
int ListNumber;
char *List[20];
int *Length1;
*/
{
int j;
j=ListNumber;
switch (j) {
case 1:
List[1]="Objects";
List[2]="Rules";
List[3]="Facts";
List[4]="Backward chaining";
List[5]="Forward chaining";
List[6]="Save knowledge base";
List[7]="Load knowledge base from file";
List[8]="Select explanation";
List[9]="End";
*Length1=9;
break;
case 2:
List[1]="Add";
List[2]="Erase";
List[3]="List";
*Length1=3;
break;
case 3:
List[1]="Initialize";
List[2]="Give values";
List[3]="List";
*Length1=3;
break;
default:
break;
}
}
/**************Function 3**********************************************/
/*
Same thing
change from C to C++, we must change the position of paramater
*/
static void OptionList(char *List[20],int Number,int *Option)
/*
used in C
char *List[20];
int Number;
int *Option;
*/
{
int i;
EraseScreen();
for (i=1; i<=Number; i++)
printf(" %d %s \n",i,List[i]);
printf("\n\n");
printf("Select one option :");
do {
scanf("%d",Option);
if (((*Option) > Number) || ((*Option) <1))
printf("\n Invalid option, reenter the option: ");
} while (((*Option) > Number) || ((*Option) <1));
}
/****************Function 4******************************************/
void Trim(char *str1)
{
char c;
int len,i,counter;
char str2[MaxCharactersObjectName];
printf("\n Enter the Trim");
len=strlen(str1);
counter=-1;
for (i=0;i<len;i++) {
c=str1[i];
if (c==' ') c='\0';
if (isupper(c)) tolower(c);
if (c != '\0') {
counter++;
str2[counter]=c;
};
}
counter++;
str2[counter]='\0';
strncpy(str1,str2,strlen(str2));
}
/****************Function 5******************************************/
void GiveNameofObject(char *Name)
{
char str[MaxCharactersObjectName];
printf("\nGive name of the object(if no more enter quit):");
scanf("%s",str);
/* Trim(str); /*****Fun 4, not necessary ***************/
printf("Here comes the object:%s", str);
strncpy(Name,str,strlen(str));
}
/**************Function 6******************************************/
/*
Found--return point to ObjectType
Not Found--return NULL
*/
ObjectType *SearchObject(char *ObjectName)
{
int Found;
Found=0;
PreviousPtr=NULL;
ObjectPtr=FirstObject;
while ((ObjectPtr != NULL) && (Found == 0)) {
if (!strcmp(ObjectName,(*ObjectPtr).Name())) {
Found=1;
return(ObjectPtr);
}
else {
PreviousPtr=ObjectPtr;
ObjectPtr=(*ObjectPtr).Next();
};
};
return(NULL);
}
/************Function 7*******************************************/
ObjectType *CreateObject(char *ObjectName)
/*
used in C
char *ObjectName;
*/
{
ObjectType *Object_Ptr;
/*
Object_Ptr=malloc(sizeof(struct ObjectType));
*/
Object_Ptr=new ObjectType;
NumberofObjects++;
(*Object_Ptr).set_Name(ObjectName);
(*Object_Ptr).set_Value("Unknown");
(*Object_Ptr).set_Known(0);
(*Object_Ptr).set_Next(FirstObject);
(*Object_Ptr).set_Type(PROBLEM);
/*
used in C
strcpy(Object_Ptr.Name(),ObjectName);
strcpy(Object_Ptr.Value(),"Unknown");
Object_Ptr->Known=0;
Object_Ptr->Next=FirstObject;
*/
FirstObject=Object_Ptr;
/*
printf("\n first");
printf("\nObjectName is:%s",(*FirstObject).Name());
printf("\nObjectName is:%s",(*FirstObject).Value());
printf("\nKnown:%d, Next is:%d",(*FirstObject).Known(),(*FirstObject).Next());
*/
return(Object_Ptr);
}
ObjectType *CreateObject2(int type)
{
ObjectType *ObjPtr;
ObjectType *ObjectPtr;
char Hostname[50];
char Obj_name[50];
char Probname[50];
char Eventname[50];
long time_interval;
struct timeval t;
switch (type) {
case MIB_VALUE:
bzero(Hostname, sizeof(Hostname));
bzero(Obj_name, sizeof(Obj_name));
printf("\nEnter Hostname Name:");
scanf("%s",Hostname);
printf("\nEnter Objectname:");
scanf("%s",Obj_name);
printf("\nEnter time interval:");
scanf("%d", &time_interval);
ObjectPtr=SearchObject(strcat(Hostname,Obj_name));
if (ObjectPtr ==NULL) {
ObjPtr=new ObjectType;
(*ObjPtr).set_Type(MIB_VALUE);
(*ObjPtr).set_hostname(Hostname);
(*ObjPtr).set_objname(Obj_name);
(*ObjPtr).set_Name(strcat(Hostname,Obj_name));
t.tv_sec=time_interval;
(*ObjPtr).set_timeleft(t);
(*ObjPtr).set_timeinterval(t);
(*ObjPtr).set_Known(0);
}
else {
printf("\nObject already existed");
return(NULL);
};
break;
case MIB_VARIANCE:
bzero(Hostname, sizeof(Hostname));
bzero(Obj_name, sizeof(Obj_name));
printf("\nEnter Hostname Name:");
scanf("%s",Hostname);
printf("\nEnter Objectname:");
scanf("%s",Obj_name);
printf("\nEnter time interval:");
scanf("%d", &time_interval);
ObjectPtr=SearchObject(strcat(Hostname,Obj_name));
if (ObjectPtr ==NULL) {
ObjPtr=new ObjectType;
(*ObjPtr).set_Type(MIB_VARIANCE);
(*ObjPtr).set_hostname(Hostname);
(*ObjPtr).set_objname(Obj_name);
(*ObjPtr).set_Name(strcat(Hostname,Obj_name));
t.tv_sec=time_interval;
(*ObjPtr).set_timeleft(t);
(*ObjPtr).set_timeinterval(t);
(*ObjPtr).set_Known(0);
}
else {
printf("\nObject already existed");
return(NULL);
};
break;
case PROBLEM:
bzero(Probname,sizeof(Probname));
printf("\nEnter problem name:");
scanf("%s", Probname);
ObjectPtr=SearchObject(Probname);
if (ObjectPtr ==NULL) {
ObjPtr=new ObjectType;
(*ObjPtr).set_Type(PROBLEM);
(*ObjPtr).set_Known(0);
(*ObjPtr).set_Name(Probname);
}
else {
printf("\nObject already existed");
return(NULL);
};
break;
case EVENT:
bzero(Eventname,sizeof(Eventname));
printf("\nEnter event name:");
scanf("%s",Eventname);
ObjectPtr=SearchObject(Eventname);
if (ObjectPtr ==NULL) {
ObjPtr=new ObjectType;
(*ObjPtr).set_Type(EVENT);
(*ObjPtr).set_Known(0);
(*ObjPtr).set_Name(Eventname);
}
else {
printf("\nObject already existed");
return(NULL);
};
break;
default:
break;
}
(*ObjPtr).set_Next(FirstObject);
FirstObject=ObjPtr;
return(ObjPtr);
}
/**********Function 8*******************************************/
static void ControlScr()
{
char s[MaxCharactersObjectName];
Line=Line+1;
if (Line > Nlines) {
printf("\n----Type character 'c' to cancel and other key to continue:");
scanf("%s",s);
d=s[0];
EraseScreen();
Line=0;
}
}
/**********Function 9*******************************************/
void ListObjects()
{
char s[MaxCharactersObjectName];
ObjectType *ObjectPtr;
EraseScreen();
printf("\n *List of Objects*(type 0:MIB_VALUE,1:MIB_VARIANCE,2:PROBLEM,3:EVENT*\n");
printf("\n ***Type** **Name***\n");
ObjectPtr=FirstObject;
Line=2;
d='B';
while ((ObjectPtr != NULL)&&(d != 'c')) {
printf(" %d %s \n",(*ObjectPtr).Type(), (*ObjectPtr).Name());
ObjectPtr=(*ObjectPtr).Next();
ControlScr();
}
if ( d != 'c') {
printf("\n *****End of List****Hit 'q' <Enter> to exit:");
scanf("%s",s);
while ( strcmp(s,"q")) {
printf("\nHit 'q' <Enter> to exit:");
scanf("%s",s);
}
}
}
/********Function 10******************************************/
int GiveRuleName(char *Name)
{
char str[MaxCharactersObjectName];
printf("\n Enter Rule Name?:(y/n)");
scanf("%s",str);
if (!strncmp(str,"y",1)) {
printf(" Give name of the rule:");
scanf("%s",str);
/* Trim(str); /*****Fun 4, not necessary ***************/
printf("\n $$Begin to set up rule:%s", str);
strncpy(Name,str,strlen(str));
return(1);
}
else
return(0);
}
/*******Function 11****************************************/
/*
return value:
Point to Found Rule--Found, NULL--Not Found
*/
struct RuleType *SearchRule(char *RuleName)
{
int Found;
Found=0;
PreviousRulePtr=NULL;
RulePtr=FirstRule;
while ((RulePtr != NULL) && (Found == 0)) {
if (!strcmp(RuleName,(*RulePtr).Name())) {
Found=1;
return(RulePtr);
}
else {
PreviousRulePtr=RulePtr;
RulePtr=(*RulePtr).Next();
};
};
return(NULL);
}
/******Function 12********************************************/
/*
Reads a premise (object and value) and checks whether or not the object
is in the objects list. If not the object is created
return value: 1--sucess, 0--failure
*/
int GiveExpression()
{
char str[MaxCharactersObjectName];
char ObjectName[MaxCharactersObjectName];
printf("\n Enter the expression:(y/n) <Enter> ");
scanf("%s",str);
if ( !strncmp(str,"y",1)) {
printf(" Give object:");
scanf("%s",str);
strcpy(ObjectName,str);
ObjectPtr=SearchObject(ObjectName);
if (ObjectPtr == NULL) {
printf("\n$$This object does not exist, but it is created as problem");
ObjectPtr=CreateObject(ObjectName);
}
printf("\n Give value of the object:");
scanf("%s",str);
strcpy(ObjectValue,str);
return(1);
}
else {
return(0);
};
}
/******Function 13 *******************************************/
struct RuleType *CreateRule()
{
char *Name1;
int c;
int Premtype;
char PremObjName[50];
char Premvalue[50];
char ObjectName[50];
ObjectType *Object_Ptr;
int firstPrem;
int Int_value;
PremiseType *PremPtr;
/*
NewRule=malloc(sizeof(struct RuleType));
*/
NewRule=new RuleType;
NumberofRules++;
/*
C
strcpy(NewRule->Name,RuleName);
NewRule->Premise=NULL;
NewRule->Conclusion=NULL;
NewRule->Next=FirstRule;
*/
(*NewRule).set_Name(RuleName);
(*NewRule).set_Premise(NULL);
(*NewRule).set_Conclusion(NULL);
(*NewRule).set_Next(FirstRule);
/*
Enter the premise
*/
printf("\nEnter the type of Premtype:");
scanf("%d",&Premtype);
firstPrem=1;
while (Premtype != 9999) {
PremPtr=new PremiseType;
(*PremPtr).set_Operation(Premtype);
printf("\nEnter the object name of this premise:");
scanf("%s",PremObjName);
strcpy(ObjectName,PremObjName);
Object_Ptr=SearchObject(ObjectName);
if (Object_Ptr == NULL) {
printf("\n$$This object does not exist,but it is created as problem");
Object_Ptr=CreateObject(ObjectName);
}
(*PremPtr).set_Object(Object_Ptr);
switch (Premtype) {
case EQUAL_STR:
printf("\nEnter the Premise string value:");
scanf("%s",Premvalue);
(*PremPtr).set_Value(Premvalue);
break;
case EQUAL_INT:
case BIGGER:
case LESSER:
printf("\nEnter the Premise int value:");
scanf("%d",&Int_value);
(*PremPtr).set_Int(Int_value);
break;
default:
break;
};
if (firstPrem == 0) {
(*PremPtr).set_Next((*NewRule).Premise());
(*NewRule).set_Premise(PremPtr);
}
else {
firstPrem=0;
(*PremPtr).set_Next(NULL);
(*NewRule).set_Premise(PremPtr);
}
printf("\n Enter the type of Premtype(no more 9999):");
scanf("%d",&Premtype);
}
/*
Enter the conclusion
*/
do {
printf("\n Give conclusion of the rule:");
c=GiveExpression();
if (c ==0)
printf("\n No Conclusion Entered");
}
while (c==0);
/*
ConclusionPtr=malloc(sizeof(struct ConclusionType));
*/
ConclusionPtr=new ConclusionType;
/* C
NewRule->Conclusion=ConclusionPtr;
*/
(*NewRule).set_Conclusion(ConclusionPtr);
/* C
ConclusionPtr->Object=ObjectPtr;
strcpy(ConclusionPtr->Value,ObjectValue);
*/
(*ConclusionPtr).set_Object(ObjectPtr);
(*ConclusionPtr).set_Value(ObjectValue);
FirstRule=NewRule;
return(NewRule);
}
/**** Function 14***************************************************/
/*
search the Rulename, Found--1,founded, Found--0,not founded
if (Found)
Erases one rule from the list of rules and disposes the memory space
occupied by its premises, conclusion and the rule itself
*/
int EraseRule(char *RuleName)
{
int Found;
struct PremiseType *PtrP;
RulePtr=FirstRule;
PreviousRulePtr=NULL;
Found=0;
while ((RulePtr != NULL) && (Found == 0)) {
if ( !strcmp(RuleName,(*RulePtr).Name()))
Found=1;
else {
PreviousRulePtr=RulePtr;
RulePtr=(*RulePtr).Next();
}
}
if (Found ==1) {
PremisePtr=(*RulePtr).Premise();
while (PremisePtr != NULL) {
PtrP=(*PremisePtr).Next();
/*
free(PremisePtr);
*/
delete PremisePtr;
PremisePtr=PtrP;
}
/*
free((*RulePtr).Conclusion());
*/
delete (*RulePtr).Conclusion();
if (PreviousRulePtr == NULL)
FirstRule=(*RulePtr).Next();
else {
/*
C
PreviousRulePtr->Next=RulePtr->Next;
*/
(*PreviousRulePtr).set_Next((*RulePtr).Next());
/*
free(RulePtr);
*/
delete RulePtr;
NumberofRules=NumberofRules-1;
}
return(1);
}
else
return(0);
}
/************ Function 15**************************************************/
void ListRules()
{
char s[MaxCharactersObjectName];
struct ObjectType *ObjPtr;
EraseScreen();
printf("\n List of Rules ");
printf("\n______________________________________________________________");
RulePtr=FirstRule;
Line=2;
d='B';
while ((RulePtr != NULL) && (d != 'c')) {
printf("\n %s:",(*RulePtr).Name());
printf("\n IF");
PremisePtr=(*RulePtr).Premise();
while (PremisePtr != NULL) {
ObjPtr=(*PremisePtr).Object();
switch ((*PremisePtr).Op()) {
case EQUAL_STR:
printf("\n EQUAL_STR %s=%s",(*ObjPtr).Name(),(*PremisePtr).Value());
break;
case EQUAL_INT:
printf("\n INT %s = %d",(*ObjPtr).Name(),(*PremisePtr).INT_Value());
break;
case BIGGER:
printf("\n INT %s > %d",(*ObjPtr).Name(),(*PremisePtr).INT_Value());
break;
case LESSER:
printf("\n INT %s < %d",(*ObjPtr).Name(),(*PremisePtr).INT_Value());
break;
default:
break;
}
PremisePtr=(*PremisePtr).Next();
}
printf("\n THEN");
/*
C
printf("\n %s",(*RulePtr->Conclusion->Object).Name());
printf("=%s",RulePtr->Conclusion->Value);
*/
printf("\n %s", (*((*((*RulePtr).Conclusion())).Object())).Name() );
printf("=%s",(*(*RulePtr).Conclusion()).Value() );
ControlScr();
RulePtr=(*RulePtr).Next();
printf("\n");
}
if ( d != 'c') {
printf("\n *****End of Rule List****Hit 'q' <Enter> to exit:");
scanf("%s",s);
while ( strcmp(s,"q")) {
printf("\nHit 'q' <Enter> to exit:");
scanf("%s",s);
}
}
}
/*********** Function 16 ************************************************/
void InitializeObjects()
{
struct ObjectType *Object_Ptr;
Object_Ptr=FirstObject;
while (Object_Ptr != NULL ) {
(*Object_Ptr).set_Value("Unknown");
(*Object_Ptr).set_Known(0);
Object_Ptr=(*Object_Ptr).Next();
/*
used in C
strcpy(Object_Ptr->Value,"Unknown");
Object_Ptr->Known=0;
Object_Ptr=Object_Ptr=Object_Ptr->Next;
*/
}
}
/********* Function 17 ************************************************/
void GiveObjectValue()
{
char str[MaxCharactersObjectValue];
struct ObjectType *ObjPtr;
char Objectname[MaxCharactersObjectName];
printf("\nGive name of the object(if no more enter quit):");
scanf("%s",ObjectName);
while (strncmp(ObjectName,"quit",4)) {
ObjPtr=SearchObject(ObjectName);
if (ObjPtr != NULL ) {
printf("\nGive Value of Object (%s):",ObjectName);
scanf("%s",str);
(*ObjPtr).set_Value(str);
(*ObjPtr).set_Known(1);
}
else {
printf("\n The object (%s) does not exist",ObjectName);
}
printf("\nGive name of the object(if no more enter quit):");
scanf("%s",ObjectName);
}
}
/****** Functiopn 18 *********************************************/
void ListFacts()
{
char s[MaxCharactersObjectName];
EraseScreen();
printf("\n ******List of Objects Facts**********************\n");
ObjectPtr=FirstObject;
Line=2;
d='B';
while ((ObjectPtr != NULL)&&(d != 'c')) {
if ((*ObjectPtr).Known() == 1) {
printf("Objname=%s,value=%s\n",(*ObjectPtr).Name(),(*ObjectPtr).Value());
}
else
printf("Objname=%s,value=UNKNOWN\n",(*ObjectPtr).Name());
ObjectPtr=(*ObjectPtr).Next();
ControlScr();
}
if ( d != 'c') {
printf("\n *****End of List****Hit 'q' <Enter> to exit:");
scanf("%s",s);
while ( strcmp(s,"q")) {
printf("\nHit 'q' <Enter> to exit:");
scanf("%s",s);
}
}
}
/********* Function 19 ****************************************/
/*
return 1-- Yes
return 0-- No
*/
int IsObjectInRules(struct ObjectType *ObjPtr)
{
struct RuleType *Rule_Ptr;
struct PremiseType *Premise_Ptr;
int Found,Isin;
Isin=0;
Rule_Ptr=FirstRule;
while (Rule_Ptr != NULL ) {
Found=0;
Premise_Ptr=(*Rule_Ptr).Premise();
while ((Premise_Ptr != NULL) && (Found == 0)) {
if ((*Premise_Ptr).Object() == ObjPtr) {
Found=1;
Isin=1;
}
Premise_Ptr=(*Premise_Ptr).Next();
};
if ((*(*Rule_Ptr).Conclusion()).Object() == ObjPtr) {
Isin=1;
Found=1;
}
if (Found == 1)
printf("\n Object (%s) is in Rule (%s)",ObjPtr->Name,Rule_Ptr->Name);
Rule_Ptr=(*Rule_Ptr).Next();
}
return(Isin);
}
/********** Function 20 ****************************************/
void EraseObject()
{
char Objectname[MaxCharactersObjectName];
struct ObjectType *ObjPtr;
printf("\nGive name of the object(if no more enter quit):");
scanf("%s",ObjectName);
while (strncmp(ObjectName,"quit",4)) {
ObjPtr=SearchObject(ObjectName);
if (ObjPtr != NULL ) {
if (IsObjectInRules(ObjPtr) == 0 ) {
if (ObjPtr == FirstObject)
(*FirstObject).set_Next((*ObjPtr).Next());
else
(*PreviousPtr).set_Next((*ObjPtr).Next());
/*
free(ObjPtr);
*/
delete ObjPtr;
}
else
printf("\n The object (%s) can not be deleted",ObjectName);
}
else
printf("\n The object (%s) does not exist",ObjectName);
printf("\nGive name of the object(if no more enter quit):");
scanf("%s",ObjectName);
}
}
/*************** Function 21 ******************************************/
void ForwardChaining()
{
int Bad,Concludes;
struct RuleType *Rule_Ptr;
struct PremiseType *Premise_Ptr;
do {
/* printf("\n First run"); */
Concludes=0;
Rule_Ptr=FirstRule;
do {
/* printf("\n second run"); */
if ((*(*(*Rule_Ptr).Conclusion()).Object()).Known() == 0) {
Premise_Ptr=(*Rule_Ptr).Premise();
Bad=0;
while ((Premise_Ptr != NULL) && (Bad == 0)) {
/*test whether premise is OK or not****************************/
switch ((*Premise_Ptr).Op()) {
case EQUAL_STR:
if (strcmp((*(*Premise_Ptr).Object()).Value(),(*Premise_Ptr).Value()) != 0)
Bad=1;
break;
case EQUAL_INT:
if ((*Premise_Ptr).INT_Value() != (*(*Premise_Ptr).Object()).Diff() )
Bad=1;
if ( (*(*Premise_Ptr).Object()).Time_Left().tv_sec != (*(*Premise_Ptr).Object()).Time_Interval().tv_sec ) /*make sure it is the first time*/
Bad=1;
break;
case BIGGER:
if ((*Premise_Ptr).INT_Value() >= (*(*Premise_Ptr).Object()).Diff() )
Bad=1;
if ( (*(*Premise_Ptr).Object()).Time_Left().tv_sec != (*(*Premise_Ptr).Object()).Time_Interval().tv_sec ) /*make sure it is the first time*/
Bad=1;
break;
case LESSER:
if ((*Premise_Ptr).INT_Value() <= (*(*Premise_Ptr).Object()).Diff() )
Bad=1;
if ( (*(*Premise_Ptr).Object()).Time_Left().tv_sec != (*(*Premise_Ptr).Object()).Time_Interval().tv_sec ) /*make sure it is the first time*/
Bad=1;
break;
default:
break;
}
Premise_Ptr=(*Premise_Ptr).Next();
}
if (Bad == 0) {
/* printf("\n A conclusion here");
*/
Concludes=1;
(*(*(*Rule_Ptr).Conclusion()).Object()).set_Known(1);
(*(*(*Rule_Ptr).Conclusion()).Object()).set_Value((*(*Rule_Ptr).Conclusion()).Value());
if (Explanation == 1) {
/* printf("\n Conclusions: (%s)",(*(*(*Rule_Ptr).Conclusion()).Object()).Name());
*/
printf("=(%s)",(*(*Rule_Ptr).Conclusion()).Value());
printf(" based on rule (%s)",(*Rule_Ptr).Name());
}
else {
printf("\n Conclusions:(%s)",(*(*(*Rule_Ptr).Conclusion()).Object()).Name());
printf("=(%s)",(*(*Rule_Ptr).Conclusion()).Value());
}
}
}
Rule_Ptr=(*Rule_Ptr).Next();
} while (Rule_Ptr != NULL);
} while (Concludes == 1);
}
/******* Function 22 ***************************************************/
struct RuleType *FindRule(ObjectType *ObjPtr,struct RuleType *RulePtr)
{
int Found;
printf("\n in find function");
Found=False;
while ((RulePtr != NULL) && (Found == False)) {
if ((*(*RulePtr).Conclusion()).Object() == ObjPtr) {
Found=True;
return(RulePtr);
}
else
RulePtr=(*RulePtr).Next();
}
return(NULL);
}
/****** Function 23 *************************************************/
void BackwardChaining(ObjectType *ObjPtr)
{
struct PremiseType *PremisePtr1;
struct RuleType *RulePtr1;
int Bad,Known;
char str[MaxCharactersObjectName];
printf("\n in Backwardchaining");
if ((*ObjPtr).Known() == False) {
Known=False;
(*ObjPtr).set_Known(True);
RulePtr1=FindRule(ObjPtr,FirstRule);
while ((RulePtr1 != NULL) && (Known == False)) {
printf("\n first loop");
PremisePtr1 =(*RulePtr1).Premise();
Bad=False;
while ((PremisePtr1 != NULL) && (Bad == False)) {
printf("\nsecond loop");
BackwardChaining((*PremisePtr1).Object());
if (strcmp((*(*PremisePtr1).Object()).Value(),(*PremisePtr1).Value()) != 0)
Bad=True;
else
PremisePtr1=(*PremisePtr1).Next();
};
if (Bad == False) {
printf("\n third place");
(*ObjPtr).set_Value((*(*RulePtr1).Conclusion()).Value());
(*ObjPtr).set_Known(True);
Known=True;
if (Explanation == True) {
printf("\nConcludes:(%s)=(%s)",(*ObjPtr).Name(),(*ObjPtr).Value());
printf("based on rule (%s)",(*RulePtr1).Name());
}
}
RulePtr1=FindRule(ObjPtr,(*RulePtr1).Next());
}
if (Known == False) {
printf("\nGive value of the object (%s):",(*ObjPtr).Name());
scanf("%s",str);
/*
strcpy(ObjPtr->Value,str);
*/
(*ObjPtr).set_Value(str);
}
}
else
printf("\n object (%s)=(%s)",(*ObjPtr).Name(),(*ObjPtr).Value());
}
/*************Function 24***************************************************/
void Load_DB(void)
{
char Hostname[50];
char Obj_name[50];
char Probname[50];
char Eventname[50];
FILE *var_file;
long time_interval;
int typecode;
struct timeval t;
ObjectType *ObjPtr;
int i;
int firsttime;
int Current_Value;
char Rulname[50];
char PremObjName[50];
char Premvalue[50];
char ConcObjName[50];
char Concvalue[50];
char ObjectName[50];
ObjectType *ObjectPtr;
int firstrule,firstPrem;
RuleType *RulePtr;
int Premtype, Int_value;
PremiseType *PremPtr;
ConclusionType *ConcPtr;
/*
initialize database
*/
if ((var_file=fopen("VAR.TXT","r")) == NULL) {
printf("\n VAR.TXT can not be opened");
exit(0);
};
firsttime=1;
while (1) {
bzero(Hostname,sizeof(Hostname));
bzero(Obj_name,sizeof(Obj_name));
fscanf(var_file,"%d",&typecode);
if (typecode == 9999){
break;
}
switch (typecode) {
case MIB_VARIANCE:
fscanf(var_file,"%s",Hostname);
fscanf(var_file,"%s",Obj_name);
fscanf(var_file,"%d",&time_interval);
ObjPtr=new ObjectType;
(*ObjPtr).set_Type(MIB_VARIANCE);
(*ObjPtr).set_hostname(Hostname);
(*ObjPtr).set_objname(Obj_name);
(*ObjPtr).set_Name(strcat(Hostname,Obj_name));
t.tv_sec=time_interval;
(*ObjPtr).set_timeleft(t);
(*ObjPtr).set_timeinterval(t);
(*ObjPtr).set_Known(0);
break;
case MIB_VALUE:
fscanf(var_file,"%s",Hostname);
fscanf(var_file,"%s",Obj_name);
fscanf(var_file,"%d",&time_interval);
ObjPtr=new ObjectType;
(*ObjPtr).set_Type(MIB_VALUE);
(*ObjPtr).set_hostname(Hostname);
(*ObjPtr).set_objname(Obj_name);
(*ObjPtr).set_Name(strcat(Hostname,Obj_name));
t.tv_sec=time_interval;
(*ObjPtr).set_timeleft(t);
(*ObjPtr).set_timeinterval(t);
(*ObjPtr).set_Known(0);
break;
case PROBLEM:
bzero(Probname,sizeof(Probname));
fscanf(var_file,"%s",Probname);
ObjPtr=new ObjectType;
(*ObjPtr).set_Type(PROBLEM);
(*ObjPtr).set_Known(0);
(*ObjPtr).set_Name(Probname);
break;
case EVENT:
bzero(Eventname,sizeof(Eventname));
fscanf(var_file,"%s",Eventname);
ObjPtr=new ObjectType;
(*ObjPtr).set_Type(EVENT);
(*ObjPtr).set_Known(0);
(*ObjPtr).set_Name(Eventname);
break;
default:
break;
}
if (firsttime ==0 ) {
(*ObjPtr).set_Next(FirstObject);
FirstObject=ObjPtr;
}
else {
firsttime=0;
(*ObjPtr).set_Next(NULL);
FirstObject=ObjPtr;
}
}
/* initialize rule */
firstrule=1;
while (1) {
bzero(Rulname,sizeof(Rulname));
fscanf(var_file,"%s",Rulname);
if (!strcmp(Rulname,"END")) {
break;
}
RulePtr=new RuleType;
(*RulePtr).set_Name(Rulname);
/* set premise **********/
fscanf(var_file,"%d",&Premtype);
printf("\n Premtype is %d",Premtype);
firstPrem=1;
while (Premtype != 8888) {
PremPtr=new PremiseType;
(*PremPtr).set_Operation(Premtype);
fscanf(var_file,"%s",PremObjName);
strcpy(ObjectName,PremObjName);
ObjectPtr=SearchObject(ObjectName);
if (ObjectPtr == NULL) {
printf("\n$$This object does not exist, but it is created");
ObjectPtr=CreateObject(ObjectName);
}
(*PremPtr).set_Object(ObjectPtr);
switch (Premtype) {
case EQUAL_STR:
fscanf(var_file,"%s",Premvalue);
(*PremPtr).set_Value(Premvalue);
break;
case EQUAL_INT:
case BIGGER:
case LESSER:
fscanf(var_file,"%d",&Int_value);
(*PremPtr).set_Int(Int_value);
break;
default:
printf("\n file is in wrong format");
break;
};
if (firstPrem == 0) {
(*PremPtr).set_Next((*RulePtr).Premise());
(*RulePtr).set_Premise(PremPtr);
}
else {
firstPrem=0;
(*PremPtr).set_Next(NULL);
(*RulePtr).set_Premise(PremPtr);
}
fscanf(var_file,"%d",&Premtype);
}
/***set conclusion********************************************/
fscanf(var_file,"%s",ConcObjName);
strcpy(ObjectName,ConcObjName);
ObjectPtr=SearchObject(ObjectName);
if (ObjectPtr == NULL) {
printf("\n$$This object does not exist, but it is created");
ObjectPtr=CreateObject(ObjectName);
}
ConcPtr=new ConclusionType;
(*ConcPtr).set_Object(ObjectPtr);
fscanf(var_file,"%s",Concvalue);
(*ConcPtr).set_Value(Concvalue);
(*RulePtr).set_Conclusion(ConcPtr);
/**next Rule************************************************/
if (firstrule == 0) {
(*RulePtr).set_Next(FirstRule);
FirstRule=RulePtr;
}
else {
firstrule=0;
(*RulePtr).set_Next(NULL);
FirstRule=RulePtr;
}
}
close(var_file);
}
void Save_DB()
{
ObjectType *ObjectPtr;
RuleType *RulePtr;
PremiseType *PremPtr;
FILE *var_file;
if ((var_file=fopen("VAR.TXT","w")) == NULL) {
printf("\n VAR.TXT can not be opened");
exit(0);
};
/*
write object
*/
ObjectPtr=FirstObject;
while (ObjectPtr != NULL) {
fprintf(var_file,"%d ",(*ObjectPtr).Type());
switch((*ObjectPtr).Type()) {
case MIB_VARIANCE:
fprintf(var_file,"%s ",(*ObjectPtr).Hostname());
fprintf(var_file,"%s ",(*ObjectPtr).Obj_Name());
fprintf(var_file,"%d ",(*ObjectPtr).Time_Interval().tv_sec);
break;
case PROBLEM:
fprintf(var_file,"%s ",(*ObjectPtr).Name());
break;
case EVENT:
fprintf(var_file,"%s ",(*ObjectPtr).Name());
break;
case MIB_VALUE:
fprintf(var_file,"%s ",(*ObjectPtr).Hostname());
fprintf(var_file,"%s ",(*ObjectPtr).Obj_Name());
fprintf(var_file,"%d ",(*ObjectPtr).Time_Interval().tv_sec);
break;
default:
break;
}
fprintf(var_file,"\n");
ObjectPtr =(*ObjectPtr).Next();
}
fprintf(var_file,"9999\n");
/*
write rule
*/
RulePtr=FirstRule;
while (RulePtr != NULL) {
fprintf(var_file,"%s ",(*RulePtr).Name());
PremPtr=(*RulePtr).Premise();
while (PremPtr != NULL) {
fprintf(var_file,"%d ",(*PremPtr).Op());
fprintf(var_file,"%s ",(*(*PremPtr).Object()).Name());
switch ((*PremPtr).Op()) {
case EQUAL_STR:
fprintf(var_file,"%s ",(*PremPtr).Value());
break;
case EQUAL_INT:
case BIGGER:
case LESSER:
fprintf(var_file,"%d ",(*PremPtr).INT_Value());
break;
default:
break;
};
PremPtr=(*PremPtr).Next();
}
fprintf(var_file,"8888 ");
/* conclusion*/
fprintf(var_file,"%s ",(*(*(*RulePtr).Conclusion()).Object()).Name());
fprintf(var_file,"%s ",(*(*RulePtr).Conclusion()).Value());
fprintf(var_file,"\n");
RulePtr=(*RulePtr).Next();
}
fprintf(var_file,"END\n");
}
/* set all Event and Problem as unknow */
void Clear_DB()
{
ObjectType *ObjPtr;
ObjPtr=FirstObject;
while (ObjPtr != NULL ) {
switch ((*ObjPtr).Type()) {
case MIB_VARIANCE:
break;
case MIB_VALUE:
break;
case PROBLEM:
(*ObjPtr).set_Known(0);
(*ObjPtr).set_Value("");
break;
case EVENT:
(*ObjPtr).set_Known(0);
(*ObjPtr).set_Value("");
break;
default:
break;
}
ObjPtr=(*ObjPtr).Next();
};
}
void ITRDB()
{
int c;
int type;
char str[MaxCharactersObjectName];
char ObjName[MaxCharactersObjectName];
struct ObjectType *ObjPtr;
Explanation=True;
NumberofObjects=0;
NumberofRules=0;
FirstObject=NULL;
Finish=False;
EraseScreen();
do {
GenerateList(List,&Length1,1); /***** Fun 2 ********/
OptionList(List,Length1,&option); /****** Fun 3 ********/
switch (option) {
case 1:
GenerateList(List,&Length1,2); /******** Fun 2 **********/
OptionList(List,Length1,&option1); /******* Fun 3 *******/
switch (option1) {
case 1:
/* old version
GiveNameofObject(ObjectName);
while (strncmp(ObjectName,"quit",4)) {
ObjectPtr=SearchObject(ObjectName);
if (ObjectPtr ==NULL)
ObjectPtr=CreateObject(ObjectName);
GiveNameofObject(ObjectName);
};
*/
printf("\nGive type of the object(9999 end):");
scanf("%d", &type);
while (type != 9999) {
ObjectPtr=CreateObject2(type);
printf("\nGive type of the object(9999 end):");
scanf("%d", &type);
}
break;
case 2:
/****Erase an Object from the object list******/
EraseObject(); /*****Fun 20*******/
break;
case 3:
ListObjects(); /*** Fun 9****/
break;
default:
break;
};
break;
case 2:
GenerateList(List,&Length1,2); /**** Fun 2 *************/
OptionList(List,Length1,&option1); /**** Fun 3 *************/
switch (option1) {
case 1:
c=GiveRuleName(RuleName); /***** Fun 10 ***********/
while (c==1) {
if(SearchRule(RuleName) == NULL); /*Fun 11*/
RulePtr=CreateRule(); /*Fun 13*/
c=GiveRuleName(RuleName); /*Fun 10*/
}
break;
case 2:
c=GiveRuleName(RuleName);
while( c== 1) {
if ( EraseRule(RuleName))
printf("\n %s is erased",RuleName);
else
printf("\n No such Rule");
c=GiveRuleName(RuleName);
}
break;
case 3:
ListRules();
break;
default:
break;
}
break;
case 3:
GenerateList(List,&Length1,3);
OptionList(List,Length1,&option1);
switch (option1) {
case 1:
InitializeObjects(); /***Fun 16***/
break;
case 2:
GiveObjectValue(); /***Fun 17***/
break;
case 3:
ListFacts();
break;
default:
break;
}
break;
case 4:
do {
printf("\nGive name of the object(if no more enter quit):");
scanf("%s",ObjName);
printf("\n something");
ObjPtr=SearchObject(ObjName);
if (ObjPtr != NULL ) {
BackwardChaining(ObjPtr);
if (Explanation == False)
printf("\nConcludes: (%s)=(%s)",ObjPtr->Name,ObjPtr->Value);
}
else {
printf("\n This object does not exist");
}
printf("\n Done? (y/n)");
scanf("%s",str);
} while (strcmp(str,"y"));
break;
case 5:
do {
ForwardChaining();
printf("\n Done? (y/n)");
scanf("%s",str);
} while (strcmp(str,"y"));
break;
case 6:
Save_DB();
break;
case 7:
Load_DB();
break;
case 8:
printf("\n Explanation? (y/n)");
scanf("%s",str);
if (!strcmp(str,"y"))
Explanation=True;
else
Explanation=False;
break;
case 9:
Finish=1;
break;
default:
break;
};
} while (Finish == 0);
}