Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Using the clpb library [0]:

  solution([A1,A2,A3,A4,A5,A6]) :-
        sat(A1 =:= A2*A3*A4*A5*A6),
        sat(A2 =:= ~(A3+A4+A5+A6)),
        sat(A3 =:= A1*A2),
        sat(A4 =:= A1+A2+A3),
        sat(A5 =:= ~(A1+A2+A3+A4)),
        sat(A6 =:= ~(A1+A2+A3+A4+A5)).
[0] https://www.metalevel.at/prolog/puzzles


Alternatively using z3 [0]:

  (declare-const a1 Bool)
  (declare-const a2 Bool)
  (declare-const a3 Bool)
  (declare-const a4 Bool)
  (declare-const a5 Bool)
  (declare-const a6 Bool)

  (assert (= a1 (and a2 (and a3 (and a4 (and a5 a6))))))
  (assert (= a2 (not (or a3 (or a4 (or a5 a6))))))
  (assert (= a3 (and a1 a2)))
  (assert (= a4 (or a1 (or a2 a3))))
  (assert (= a5 (not (or a1 (or a2 (or a3 a4))))))
  (assert (= a6 (not (or a1 (or a2 (or a3 (or a4 a5)))))))
  (assert (or a1 (or a2 (or a3 (or a4 (or a5 a6))))))

  (check-sat)
  (get-model)
  (exit)
The model is satisfiable where only a5 is true, anyone can run it themselves and play with it [1].

Additionally forcing a5 to be false by adding the following to the list of assertions:

  (assert (not a5))
And the model becomes unsatisfiable.

Edit: Finally, to make sure there's not some possible solution where a5 is true as well as another assertion you could alternatively add this assertion:

  (assert (and a5 (or a1 (or a2 (or a3 (or a4 (or a6)))))))
And the model also becomes unsatisfiable. So 5 only seems to be the correct answer.

[0] https://github.com/Z3Prover/z3

[1] https://rise4fun.com/Z3/1DMW


I posted a solution using the python z3 library, which might be easier to use for people used to python, here: https://news.ycombinator.com/item?id=21545143


That solution was not correct, see https://news.ycombinator.com/item?id=21568151


Using no libraries!

    a1([f,f,_,_,_,_]).
    a1([f,t,f,_,_,_]).
    a1([f,t,t,f,_,_]).
    a1([f,t,t,t,f,_]).
    a1([f,t,t,t,t,f]).
    a1([t,t,t,t,t,t]).

    a2([_,f,t,_,_,_]).
    a2([_,f,f,t,_,_]).
    a2([_,f,f,f,t,_]).
    a2([_,f,f,f,f,t]).
    a2([_,t,f,f,f,f]).

    a3([f,_,f,_,_,_]).
    a3([t,f,f,_,_,_]).
    a3([t,t,t,_,_,_]).

    a4([t,_,_,t,_,_]).
    a4([f,t,_,t,_,_]).
    a4([f,f,t,t,_,_]).
    a4([f,f,f,f,_,_]).

    a5([t,_,_,_,f,_]).
    a5([f,t,_,_,f,_]).
    a5([f,f,t,_,f,_]).
    a5([f,f,f,t,f,_]).
    a5([f,f,f,f,t,_]).

    a6([t,_,_,_,_,f]).
    a6([f,t,_,_,_,f]).
    a6([f,f,t,_,_,f]).
    a6([f,f,f,t,_,f]).
    a6([f,f,f,f,t,f]).
    a6([f,f,f,f,f,t]).

    solution(X) :- a1(X), a2(X), a3(X), a4(X), a5(X), a6(X).


Imho this would be a nice answer for stack exchange as well.


The fact that it is consistent does not mean that it is correct...




Consider applying for YC's Fall 2026 batch! Applications are open till July 27.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: