Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/etc/ai/clause.cpp

Go to the documentation of this file.
00001 #ifndef __J2K__CLAUSE_CPP__
00002 #define __J2K__CLAUSE_CPP__
00003 
00004 #include <j2k/etc/ai/clause.hpp>
00005 
00006 Clause::Clause()
00007 {
00008   memset( &data, 0, sizeof( clause_t ) );
00009 }
00010 
00011 Clause::Clause( clause_t src )
00012 {
00013   memcpy( &data, &src, sizeof( clause_t ) );
00014 }
00015 
00016 Clause::Clause( const Clause& src )
00017 {
00018   memcpy( &data, &src.data, sizeof( clause_t ) );
00019 }
00020 
00021 const Clause& Clause::operator=( const Clause& src )
00022 {
00023   memcpy( &data, &src.data, sizeof( clause_t ) );
00024   return *this;
00025 }
00026 
00027 const Clause& Clause::operator=( clause_t src )
00028 {
00029   memcpy( &data, &src, sizeof( clause_t ) );
00030   return *this;
00031 }
00032 
00033 Clause::Clause( const char* str0 )
00034 {
00035   // Clear clause buffer
00036   memset( &data, 0, sizeof( clause_t ) );
00037 
00038   assign( str0 );
00039   decompose();
00040 }
00041 
00042 void Clause::print()
00043 {
00044   if ( data.string != NULL ) compose();
00045 
00046   printf( "Clause=[%s]\n", data.string );
00047   fflush( stdout );
00048 }
00049 
00050 void Clause::assign( const char* str0 )
00051 {
00052   if ( str0 == NULL )
00053   {
00054     memset( &data.string, 0, 160 );
00055     data.len    = 1;
00056   }
00057 
00058   data.len    = strlen( str0 );
00059   memset( &data.string, 0, 160 );
00060   memcpy( &data.string, str0, data.len );
00061 }
00062 
00063 Clause::~Clause()
00064 {
00065 }
00066 
00067 void Clause::decompose()
00068 {
00069   if ( data.string == NULL ) return;
00070 
00071   // Clear logic buffer 
00072   memset( &data.logic, 0, sizeof( logic_t ) );
00073 
00074   register size_t i   = 0;
00075   register char   neg = 0;
00076   for( ; i < data.len; i++ )
00077   {
00078     register char ch = data.string[ i ];
00079 
00080     if ( ch == 'v' ) 
00081     { 
00082       neg = 0; 
00083       continue; 
00084     }
00085 
00086     if ( ch == '~' )
00087     {
00088       neg = 1 - neg; // Negate the neg variable
00089       continue;
00090     }
00091 
00092     if ( ch >= 'a' && ch <= 'z' ) // to Upper Case
00093     { 
00094       ch = ch - 'a' + 'A'; 
00095     }
00096 
00097     if ( ch >= 'A' && ch <= 'Z' ) // store
00098     {
00099       register char index = ch - 'A';
00100  
00101       if ( data.logic.letters[ index ] > 0 ) // Variable already parsed.
00102       {
00103         if ( data.logic.negated[ index ] != neg )
00104         {
00105           data.status = C_true;  // P v ~P = TRUE
00106      break;
00107         }
00108         else // P v P = P  Noop
00109         {
00110         }
00111       }
00112       else
00113       {
00114         data.logic.letters[ index ] = 1;
00115         data.logic.negated[ index ] = neg;
00116         data.logic.variables[ data.logic.nbVariables++ ] = ch;
00117       }
00118     }
00119   }
00120 }
00121 
00122 void Clause::compose()  
00123 {
00124   if ( data.status != C_undefined )
00125   {
00126     if ( data.status == C_true )
00127     {
00128       printf( "True" );
00129       assign( "True" );
00130       return;
00131     }
00132     else if ( data.status == C_false )
00133     {
00134       printf( "False" );
00135       assign( "False" );
00136       return;
00137     }
00138     else if ( data.status == C_nil )
00139     {
00140       printf( "Nil" ); 
00141       assign( "Nil" ); 
00142       return;
00143     }
00144   }
00145 
00146   char buffer[ 160 ];
00147   memset( buffer, 0, 160 );
00148 
00149   register int pos = 0;
00150   register int i = 0;
00151 
00152   printf( "compose \n" );
00153 
00154   for( ; i < data.logic.nbVariables; i++ )
00155   {
00156     if ( pos > 0 )
00157     {
00158       buffer[ pos++ ] = ' ';
00159       buffer[ pos++ ] = 'v';
00160       buffer[ pos++ ] = ' ';
00161     }
00162 
00163     register char ch = data.logic.variables[ i ];
00164     if ( data.logic.negated[ ch - 'A' ] == 1 )
00165     {
00166       buffer[ pos++ ] = '~';
00167     }
00168     buffer[ pos++ ] = ch;  
00169   }
00170 
00171   buffer[ pos++ ] = '\0';
00172 
00173   assign( buffer );  
00174 }
00175 
00176 clause_t Clause::compare( const Clause& src )
00177 {  
00178   clause_t temp;
00179 
00180   memset( &temp, 0, sizeof( clause_t ) );
00181 
00182   register int i = 0;
00183   register int opposite = 0;
00184 
00185   for( ; i < 26; i++ )
00186   {
00187     register char ch = (char)( i + 'A' );
00188     // Same letter
00189     if ( data.logic.letters[ i ] == src.data.logic.letters[ i ] && data.logic.letters[ i ] > 0 )
00190     {
00191       // Different by sign  P  vs  ~P
00192       if ( data.logic.negated[ i ] != src.data.logic.negated[ i ] )
00193       {
00194         printf( "Same [%c] but different sign \n", ch );
00195         opposite++;
00196       }
00197       else
00198       {
00199         printf( "Same [%c] with same sign \n", ch );
00200         temp.logic.letters[ i ] = data.logic.letters[ i ];
00201         temp.logic.negated[ i ] = data.logic.negated[ i ];
00202         temp.logic.variables[ temp.logic.nbVariables++ ] = ch;
00203       }
00204     }
00205     else if ( ( data.logic.letters[ i ] | src.data.logic.letters[ i ] ) > 0 )
00206     {
00207       printf( "Different letter [%c] \n", ch );
00208       temp.logic.letters[ i ] = 1; // Different so one of them exist
00209       temp.logic.negated[ i ] = data.logic.negated[ i ] | src.data.logic.negated[ i ];     
00210       temp.logic.variables[ temp.logic.nbVariables++ ] = ch;
00211     }
00212 
00213     // Different by at least two letters
00214     if ( opposite > 1 )
00215     {
00216       memset( &temp, 0, sizeof( clause_t ) );
00217       temp.status = C_invalid;
00218       printf( "Opposite by more than 1 \n" );
00219       return temp;
00220     }
00221   }
00222 
00223     // Different by exactly one letter
00224     if ( opposite == 1 )
00225     {
00226       // Undefined but valid.
00227       printf( "Opposite by 1 \n" );
00228       return temp; 
00229     }
00230     else
00231     {
00232       printf( "Opposite not by 1 \n" );
00233       memset( &temp, 0, sizeof( clause_t ) );
00234       temp.status = C_invalid;
00235       return temp;
00236     }
00237 }
00238 
00239 void dump( clause_t data )
00240 {
00241   register int i = 0;
00242 
00243   // Convert struct to bytes 
00244   char* ptr = (char*)(&data);
00245 
00246   printf( "{" );
00247 
00248   // Printing bytes by ASCII value.
00249   for( ; i < sizeof( clause_t ); i++ )
00250   {
00251     printf( "%d,", (int)ptr[i] );    
00252   }
00253 
00254   printf( "} \n" );
00255 
00256   printf( "P=[%d] \n", data.logic.letters[ 'P' - 'A' ] );
00257 }
00258 
00259 /////
00260 
00261 int main()
00262 {
00263   Clause p( "P v Q v T v W v ~A" );
00264   Clause q( "~Q v A V W v Z " );
00265 
00266   p.print();
00267   q.print();
00268 
00269   clause_t tmp = p.compare( q );
00270 
00271   printf( "Status=[%d] \n", (int)tmp.status );
00272 
00273   dump( tmp );
00274 
00275   Clause t( tmp );
00276 
00277   t.print();
00278 
00279   return 0;
00280 }
00281 
00282 #endif

Generated on Sun Oct 14 18:46:30 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001