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

Clause Class Reference

#include <clause.hpp>

List of all members.

Public Methods

 Clause ()
 Clause (const char *str0)
virtual ~Clause ()
 Clause (clause_t src)
const Clause & operator= (const Clause &src)
 Clause (const Clause &src)
const Clause & Clause::operator= (clause_t src)
void print ()
void assign (const char *str0)
void decompose ()
void compose ()
clause_t compare (const Clause &src)

Private Attributes

clause_t data


Constructor & Destructor Documentation

Clause::Clause  
 

Definition at line 6 of file clause.cpp.

00007 {
00008   memset( &data, 0, sizeof( clause_t ) );
00009 }

Clause::Clause const char *    str0
 

Definition at line 33 of file clause.cpp.

00034 {
00035   // Clear clause buffer
00036   memset( &data, 0, sizeof( clause_t ) );
00037 
00038   assign( str0 );
00039   decompose();
00040 }

Clause::~Clause   [virtual]
 

Definition at line 63 of file clause.cpp.

00064 {
00065 }

Clause::Clause clause_t    src
 

Definition at line 11 of file clause.cpp.

00012 {
00013   memcpy( &data, &src, sizeof( clause_t ) );
00014 }

Clause::Clause const Clause &    src
 

Definition at line 16 of file clause.cpp.

00017 {
00018   memcpy( &data, &src.data, sizeof( clause_t ) );
00019 }


Member Function Documentation

const Clause& Clause::Clause::operator= clause_t    src
 

void Clause::assign const char *    str0
 

Definition at line 50 of file clause.cpp.

Referenced by Clause(), and compose().

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 }

clause_t Clause::compare const Clause &    src
 

Definition at line 176 of file clause.cpp.

Referenced by main().

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 }

void Clause::compose  
 

Definition at line 122 of file clause.cpp.

Referenced by print().

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 }

void Clause::decompose  
 

Definition at line 67 of file clause.cpp.

Referenced by Clause().

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 }

const Clause & Clause::operator= const Clause &    src
 

Definition at line 21 of file clause.cpp.

00022 {
00023   memcpy( &data, &src.data, sizeof( clause_t ) );
00024   return *this;
00025 }

void Clause::print  
 

Definition at line 42 of file clause.cpp.

Referenced by main().

00043 {
00044   if ( data.string != NULL ) compose();
00045 
00046   printf( "Clause=[%s]\n", data.string );
00047   fflush( stdout );
00048 }


Member Data Documentation

clause_t Clause::data [private]
 

Definition at line 42 of file clause.hpp.

Referenced by Clause(), compare(), and operator=().


The documentation for this class was generated from the following files:
Generated on Sun Oct 14 18:48:29 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001