z3.prove намного быстрее, чем решатель и проверка

Я использую последний основной код z3 от Codeplex, помеченный как v4.3.1.

Мне нужна такая функция, как prove, которая имеет полезное возвращаемое значение и не печатает. Итак, я написал то, что казалось очевидным:

def prove2(claim):
    s = Solver()
    s.add(Not(claim))
    if s.check() == unsat:
        return True, []
    return False, s.model()

Однако этот код работает значительно медленнее, чем функция prove по умолчанию.

Код для prove (упрощенный) в src/api/python/z3.py:

def prove(claim, **keywords):
    s = Solver()
    s.set(**keywords)
    s.add(Not(claim))
    if keywords.get('show', False):
        print s
    r = s.check()
    if r == unsat:
        print "proved"
    elif r == unknown:
        print "failed to prove"
        print s.model()
    else:
        print "counterexample"
        print s.model()

Когда я добавляю s.set() в свой код, он работает быстро и находит тот же контрпример.

Что здесь происходит?

  • Этот пустой вызов s.set() каким-то образом очищает какую-то опцию, которая в целом плоха?
  • .. плохо для моего конкретного теста?
  • Что-то другое?

Я пытался выяснить, какие параметры решателя по умолчанию, но str(s) repr(s), s.__dict__ и google не очень помогли.

Любой совет приветствуется!


person Dan Halperin    schedule 25.07.2014    source источник
comment
Это интересное наблюдение. В настоящее время нет удобного способа отключить параметры решателя от объекта Solver. Не могли бы вы посмотреть, что находится в **keywords во время выполнения?   -  person Christoph Wintersteiger    schedule 01.08.2014
comment
Привет @ChristophWintersteiger, так как я звоню prove(claim), я знаю, что **keywords — это пустой словарь.   -  person Dan Halperin    schedule 01.08.2014
comment
Интересный. Что именно вы понимаете под резко медленнее? У вас есть небольшой тест, который вызывает такое поведение?   -  person Christoph Wintersteiger    schedule 03.08.2014
comment
@ChristophWintersteiger У меня был пример 9 дней назад;) но я просто раскомментировал пустой вызов set() и снова запустил свою программу, и все было в порядке. Может быть, я попал в плохое состояние RNG в одном случае, я думаю...?   -  person Dan Halperin    schedule 04.08.2014
comment
Интересный! Хорошо, что все работает.   -  person Christoph Wintersteiger    schedule 04.08.2014


Ответы (1)


Лучше всего предположить, что параметры по умолчанию плохо сработали для моего конкретного случая, возможно, из-за случайной разницы чисел или какого-то другого недетерминированного внутреннего состояния.

person Dan Halperin    schedule 02.01.2015