Finish xor tests

This commit is contained in:
David Greenspan
2014-12-24 12:20:17 -08:00
parent 6755bdaed3
commit aad244be7a
2 changed files with 72 additions and 10 deletions

View File

@@ -491,6 +491,13 @@ var group = function (array, N) {
};
Logic._defineFormula(Logic.XorFormula, 'xor', {
_grouped: function () {
return new Logic.XorFormula(
_.map(group(this.operands, 3), function (group) {
return (group.length === 1 ?
group[0] : new Logic.XorFormula(group));
}));
},
_genTrue: function (makeClause) {
var args = this.operands;
var not = Logic.not;
@@ -509,10 +516,7 @@ Logic._defineFormula(Logic.XorFormula, 'xor', {
makeClause(not(A), B, not(C)), // -A v B v -C
makeClause(not(A), not(B), C)]; // -A v -B v C
} else {
return (new Logic.XorFormula(
_.map(group(args, 3), function (group) {
return new Logic.XorFormula(group);
})))._genTrue(makeClause);
return this._grouped()._genTrue(makeClause);
}
},
_genFalse: function (makeClause) {
@@ -533,10 +537,7 @@ Logic._defineFormula(Logic.XorFormula, 'xor', {
makeClause(A, not(B), C), // A v -B v C
makeClause(A, B, not(C))]; // A v B v -C
} else {
return (new Logic.XorFormula(
_.map(group(args, 3), function (group) {
return new Logic.XorFormula(group);
})))._genFalse(makeClause);
return this._grouped()._genFalse(makeClause);
}
}
});

View File

@@ -297,7 +297,68 @@ Tinytest.add("logic-solver - Logic.xor", function (test) {
["A v -B", "-A v B"],
function (s) {
s.require(Logic.xor(["A", []], ["B"], [])); },
["A v B", "-A v -B"]
// XXX test 3 and 4 args
["A v B", "-A v -B"],
function (s) {
s.require(Logic.xor("A", "B", "C")); },
["A v B v C", "A v -B v -C", "-A v B v -C", "-A v -B v C"],
function (s) {
s.forbid(Logic.xor("A", "B", "C")); },
["-A v -B v -C", "-A v B v C", "A v -B v C", "A v B v -C"],
function (s) {
s.require(Logic.xor("A", "B", "C", "D")); },
["A v B v C v -$xor1",
"A v -B v -C v -$xor1",
"-A v B v -C v -$xor1",
"-A v -B v C v -$xor1",
"$xor1 v D",
"-A v -B v -C v $xor1",
"-A v B v C v $xor1",
"A v -B v C v $xor1",
"A v B v -C v $xor1",
"-$xor1 v -D"],
function (s) {
s.forbid(Logic.xor("A", "B", "C", "D")); },
["A v B v C v -$xor1",
"A v -B v -C v -$xor1",
"-A v B v -C v -$xor1",
"-A v -B v C v -$xor1",
"$xor1 v -D",
"-A v -B v -C v $xor1",
"-A v B v C v $xor1",
"A v -B v C v $xor1",
"A v B v -C v $xor1",
"-$xor1 v D"],
function (s) {
s.require(Logic.xor("A", "B", "C", "D", "E")); },
["A v B v C v -$xor1",
"A v -B v -C v -$xor1",
"-A v B v -C v -$xor1",
"-A v -B v C v -$xor1",
"D v E v -$xor2",
"-D v -E v -$xor2",
"$xor1 v $xor2",
"-A v -B v -C v $xor1",
"-A v B v C v $xor1",
"A v -B v C v $xor1",
"A v B v -C v $xor1",
"D v -E v $xor2",
"-D v E v $xor2",
"-$xor1 v -$xor2"],
function (s) {
s.forbid(Logic.xor("A", "B", "C", "D", "E")); },
["A v B v C v -$xor1",
"A v -B v -C v -$xor1",
"-A v B v -C v -$xor1",
"-A v -B v C v -$xor1",
"D v -E v $xor2",
"-D v E v $xor2",
"$xor1 v -$xor2",
"-A v -B v -C v $xor1",
"-A v B v C v $xor1",
"A v -B v C v $xor1",
"A v B v -C v $xor1",
"D v E v -$xor2",
"-D v -E v -$xor2",
"-$xor1 v $xor2"]
]);
});