Как решить проблему лжецов / правдивых с помощью Z3Py и Z3 SMT-LIB

Пример проблемы:

Предположим, что лжецы всегда говорят неправду, а правдивые всегда говорят правду. Далее предположим, что Эми, Боб, Кэл, Дэн, Эрни и Фрэнсис - каждый либо лжец, либо рассказчик правды.

Amy says, “Bob is a liar.”
Bob says, “Cal is a liar.” 
Cal says, “Dan is a liar”
Dan says, “Erny is a liar”
Erny says, “Francis is a liar”
Francis says, “Amy, Bob, Cal, Dan and Erny are liars ”

Кто из этих людей говорит правду?

Решение:

Интерпретации:

A : Amy is a truth-teller (X[0])
B : Bob is a truth-teller (X[1])
C : Cal is a truth-teller (X[2])
D : Dan is a truth-teller (X[3])
E : Erny is a truth-teller (X[4])
F : Francis is truth-teller (X[5])

Код:

def add_constraints(s, model):
X = BoolVector('x', 6)
s.add(Implies(X[0], Not(X[1])),Implies(Not(X[1]),X[0]),
  Implies(X[1],Not(X[2])), Implies(Not(X[2]),X[1]),
  Implies(X[2],Not(X[3])), Implies(Not(X[3]),X[2]),
  Implies(X[3],Not(X[4])), Implies(Not(X[4]),X[3]),
  Implies(X[4],Not(X[5])), Implies(Not(X[5]),X[4]),
  Implies(X[5], And(Not(X[0]),Not(X[1]),Not(X[2]),Not(X[3]),Not(X[4]))), 
  Implies(And(Not(X[0]),Not(X[1]),Not(X[2]),Not(X[3]),Not(X[4])), X[5]))
  notAgain = []
  i = 0
  for val in model:
     notAgain.append(X[i] != model[X[i]])
  i = i + 1
  if len(notAgain) > 0:
    s.add(Or(notAgain))

  return s

 s = Solver()
 i = 0
 add_constraints(s, [])
 while s.check() == sat:
   print s.model()
  i = i + 1
  add_constraints(s, s.model())
  print i # solutions

Вывод:

[x1 = False,
 x5 = False,
 x0 = True,
 x3 = False,
 x4 = True,
 x2 = True]
 1

Интерпретация:

Amy is a truth-teller 
Bob is a liar
Cal is a truth-teller
Dan is a liar
Erny is a truth-teller
Francis is a liar

Запустите этот пример в Интернете здесь

Пожалуйста, дайте мне знать, что вы думаете, и возможно ли решить эту проблему с помощью Z3-SMT-LIB. Большое спасибо.


person Juan Ospina    schedule 17.06.2013    source источник
comment
Если вам нужна соответствующая кодировка SMT-Lib2, см. Заголовок stackoverflow.com/questions/14775122/   -  person Malte Schwerhoff    schedule 18.06.2013


Ответы (2)


SMT-LIB не имеет режима «проверка всех сбоев».
Формат описан на: http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.0-r12.09.09.pdf Вы может взаимодействовать с SMT-LIB, используя файловый канал для синтаксического анализа / печати, чтобы получить все ответы подходящим для вашей проблемы способом. Программные API, такие как Python API, намного более гибкие.

person Nikolaj Bjorner    schedule 22.06.2013

Использование Vampire и Prover 9:

 fof(axio1,axiom,(  (truthteller(amy))
        <=> (~ truthteller(bob) )      )).



fof(axio2,axiom,
    ( ( truthteller(bob)
        <=> (~ truthteller(cal)) )  )).


fof(axio3,axiom,
    ( ( truthteller(cal)
        <=> (~ truthteller(dan)) )  )).

fof(axio4,axiom,
    ( ( truthteller(dan)
        <=> (~ truthteller(erny)) )  )).


fof(axio5,axiom,
    ( ( truthteller(erny)
        <=> (~ truthteller(francis)) )  )).

fof(axio6,axiom,
    ( ( truthteller(francis)
        <=> ( (~ truthteller(amy)) & (~ truthteller(bob)) &  (~ truthteller(cal)) 
   & (~ truthteller(dan)) & (~ truthteller(erny))   )     )  )).


fof(goal1,conjecture,
    (~ truthteller(francis) )).

Мы получаем:

% END OF SYSTEM OUTPUT
% RESULT: SOT_LlryEw - Prover9---1109a says Theorem - CPU = 0.00 WC = 0.28  Given = 0 Generated = 18 Kept = 14
% OUTPUT: SOT_LlryEw - Prover9---1109a says Refutation - CPU = 0.00 WC = 0.28


% END OF SYSTEM OUTPUT
% RESULT: SOT_LlryEw - Vampire---4.2 says Theorem - CPU = 0.00 WC = 0.01 
% OUTPUT: SOT_LlryEw - Vampire---4.2 says Refutation - CPU = 0.00 WC = 0.01  

Такой вывод показывает, что «Фрэнсис - лжец».

person Juan Ospina    schedule 01.02.2018