#ifndef OPS_H
#define OPS_H
-enum LogicOp {AND, OR, NOT, XOR, IMPLIES};
+enum LogicOp {L_AND, L_OR, L_NOT, L_XOR, L_IMPLIES};
typedef enum LogicOp LogicOp;
enum ArithOp {ADD, SUB};
void deleteConstraint(Constraint *);
void printConstraint(Constraint * c);
void dumpConstraint(Constraint * c, IncrementalSolver *solver);
-uint getVarConstraint(Constraint * c) {ASSERT(c->type==VAR); return c->numoperandsorvar;}
+inline uint getVarConstraint(Constraint * c) {ASSERT(c->type==VAR); return c->numoperandsorvar;}
VectorConstraint * simplify(Constraint * c);
-CType getType(Constraint * c) {return c->type;}
-bool isFalse(Constraint * c) {return c->type==FALSE;}
-bool isTrue(Constraint * c) {return c->type==TRUE;}
+inline CType getType(Constraint * c) {return c->type;}
+inline bool isFalse(Constraint * c) {return c->type==FALSE;}
+inline bool isTrue(Constraint * c) {return c->type==TRUE;}
void internalfreeConstraint(Constraint * c);
void freerecConstraint(Constraint * c);
Constraint * cloneConstraint(Constraint * c);
-void setNegConstraint(Constraint * This, Constraint *c) {This->neg=c;}
+inline void setNegConstraint(Constraint * This, Constraint *c) {This->neg=c;}
Constraint *negateConstraint(Constraint * c);
extern Constraint ctrue;
#include "satencoder.h"
#include "structs.h"
#include "csolver.h"
+#include "boolean.h"
+#include "constraint.h"
SATEncoder * allocSATEncoder() {
SATEncoder *This=ourmalloc(sizeof (SATEncoder));
}
}
-void encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint) {
+Constraint * encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint) {
+ switch(constraint->btype) {
+ case ORDERCONST:
+ return encodeOrderSATEncoder(This, (BooleanOrder *) constraint);
+ case BOOLEANVAR:
+ return encodeVarSATEncoder(This, (BooleanVar *) constraint);
+ case LOGICOP:
+ return encodeLogicSATEncoder(This, (BooleanLogic *) constraint);
+ case COMPARE:
+ return encodeCompareSATEncoder(This, (BooleanComp *) constraint);
+ }
+}
+
+Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
+ return NULL;
+}
+
+Constraint * encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint) {
+ return NULL;
+}
+
+Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint) {
+ Constraint *left=encodeConstraintSATEncoder(This, constraint->left);
+ Constraint *right=NULL;
+ if (constraint->right!=NULL)
+ right=encodeConstraintSATEncoder(This, constraint->right);
+ switch(constraint->op) {
+ case L_AND:
+ return allocConstraint(AND, left, right);
+ case L_OR:
+ return allocConstraint(OR, left, right);
+ case L_NOT:
+ return negateConstraint(allocConstraint(OR, left, NULL));
+ case L_XOR: {
+ Constraint * nleft=negateConstraint(cloneConstraint(left));
+ Constraint * nright=negateConstraint(cloneConstraint(right));
+ return allocConstraint(OR,
+ allocConstraint(AND, left, nright),
+ allocConstraint(AND, nleft, right));
+ }
+ case L_IMPLIES:
+ return allocConstraint(IMPLIES, left, right);
+ }
+ return NULL;
+}
+Constraint * encodeCompareSATEncoder(SATEncoder *This, BooleanComp * constraint) {
+ return NULL;
}
SATEncoder * allocSATEncoder();
void deleteSATEncoder(SATEncoder *This);
void encodeAllSATEncoder(SATEncoder *This, CSolver *csolver);
-void encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint);
+Constraint * encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint);
+Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint);
+Constraint * encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint);
+Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint);
+Constraint * encodeCompareSATEncoder(SATEncoder *This, BooleanComp * constraint);
+
#endif
#include "orderencoding.h"
-OrderEncoding * allocOrderEncoding() {
+OrderEncoding * allocOrderEncoding(OrderEncodingType type, Order *order) {
OrderEncoding *This=ourmalloc(sizeof(OrderEncoding));
+ This->type=type;
+ This->order=order;
return This;
}
#define ORDERENCODING_H
#include "classlist.h"
-struct OrderEncoding {
+enum OrderEncodingType {
+ PAIRWISE
+};
+typedef enum OrderEncodingType OrderEncodingType;
+
+struct OrderEncoding {
+ OrderEncodingType type;
+ Order *order;
};
-OrderEncoding * allocOrderEncoding();
+OrderEncoding * allocOrderEncoding(OrderEncodingType type, Order *order);
void deleteOrderEncoding(OrderEncoding *This);
#endif