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
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
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;
00089 continue;
00090 }
00091
00092 if ( ch >= 'a' && ch <= 'z' )
00093 {
00094 ch = ch - 'a' + 'A';
00095 }
00096
00097 if ( ch >= 'A' && ch <= 'Z' )
00098 {
00099 register char index = ch - 'A';
00100
00101 if ( data.logic.letters[ index ] > 0 )
00102 {
00103 if ( data.logic.negated[ index ] != neg )
00104 {
00105 data.status = C_true;
00106 break;
00107 }
00108 else
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
00189 if ( data.logic.letters[ i ] == src.data.logic.letters[ i ] && data.logic.letters[ i ] > 0 )
00190 {
00191
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;
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
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
00224 if ( opposite == 1 )
00225 {
00226
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
00244 char* ptr = (char*)(&data);
00245
00246 printf( "{" );
00247
00248
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