Multiple choice
johndcook.com
johndcook.com
from z3 import *
def all(vars):
result = BoolVal(True)
for var in vars:
result = And(result, var)
return result
def any(vars):
result = BoolVal(False)
for var in vars:
result = Or(result, var)
return result
def none(vars):
return Not(any(vars))
def oneof(vars):
result = any(vars)
for i, a in enumerate(vars):
for b in vars[i + 1:]:
result = And(result, Not(And(a, b)))
return result
vars = [Bool(c) for c in "abcdef"]
def above(i):
return vars[:i]
def below(i):
return vars[i + 1:]
s = Solver()
s.add(vars[0] == all(below(0)))
s.add(vars[1] == none(below(1)))
s.add(vars[2] == all(above(2)))
s.add(vars[3] == oneof(above(3)))
s.add(vars[4] == none(above(4)))
s.add(vars[5] == none(above(5)))
s.check()
print(s.model())
For what it's worth, the answer is E. :) step 1 : write it out by hand in PBL [alpha]
step 2 : convert it to CNF format using [beta]
step 3 : hand-reformat it tediously to produce [gamma]
step 4 : plug machine readable CNF into [delta]
step 5 : receive a feasible solution! [epsilon]
[alpha] Main_Exp : ((a <=> (b & c & d & e & f)) & (b <=> (~c & ~d & ~e & ~f)) & (c <=> (a & b)) & (d <=> (a | b | c)) & (e <=> (~a & ~b & ~c & ~d)) & (f <=> (~a & ~b & ~c & ~d & ~e)))
[beta] http://formal.cs.utah.edu:8080/pbl/PBL.php... find replace, find replace, ...
[gamma]
c multiple choice
p cnf 6 29
-1 2 0
-1 3 0
-1 4 0
-1 5 0
-1 6 0
-2 -3 -4 -5 -6 1 0
-2 -3 0
-2 -4 0
-2 -5 0
-2 -6 0
3 4 5 6 2 0
-3 1 0
-3 2 0
-1 -2 3 0
-4 1 2 3 0
-1 4 0
-2 4 0
-3 4 0
-5 -1 0
-5 -2 0
-5 -3 0
-5 -4 0
1 2 3 4 5 0
-6 -1 0
-6 -2 0
-6 -3 0
-6 -4 0
-6 -5 0
1 2 3 4 5 6 0
[delta] http://www.msoos.org/2013/09/minisat-in-your-browser/[epsilon]
This is MiniSat 2.0 beta
============================[ Problem Statistics ]=============================
| |
| Number of variables: 6 |
| Number of clauses: 29 |
| Parsing time: 0.00 s |
============================[ Search Statistics ]==============================
| Conflicts | ORIGINAL | LEARNT | Progress |
| | Vars Clauses Literals | Limit Clauses Lit/Cl | |
===============================================================================
| 0 | 6 29 75 | 9 0 nan | 0.000 % |
===============================================================================
Verified 29 original clauses.
restarts : 1
conflicts : 2 (2 /sec)
decisions : 5 (0.00 % random) (5 /sec)
propagations : 10 (10 /sec)
conflict literals : 5 (28.57 % deleted)
CPU time : 1 s
SATISFIABLE
v -1 -2 -3 -4 5 -6 0
5 is true, aka e.edit: I think I am someone who interprets "one of the above" as "at least one of the above but possibly more" not "exactly one of the above". not that the interpretation makes a difference for this problem.
* A and B can't both be true, which means that C is false.
* If C is false, A must be false.
* B and D have a paradoxical relationship, given the others - if B were true, D would be true, which would make B false, so B must be false.
* D is false, given A, B, C are false.
* E is true, given A, B, C, D are false.
* F is false because E is true (typo corrected as per comment)
F is false because E is true.
a) b contradicts it.
b) cde encompass all the choices, so you can't have none of those.
c) a contradicts b.
d) abc have already been rejected.
e) works.
f) e already works.
with result (https://github.com/dbunker/SABR/blob/master/test/Real/Multip...). Fifth position being E.
A bit on the verbose side, but might be preferable to some since it explicitly enumerates all the possibilities for each rule.
They're a bit like the word-problem version of working out sudoku (vs. guessing at it, which is a different game).
e != f, because they produce different results. You could say e() == f(), each having the previous answer choices as arguments and each requiring them to be false. But since e() evaluates to true, f() can't be true.