Сплав - Не удается найти ненасыщенное ядро

У меня есть файл Alloy "Экземпляр не найден", и я хотел бы его отладить. В документах говорится, что нужно перейти в «Параметры» и выбрать «SAT Solver»> «unsat-core». Но я этого не вижу, только SAT4J.

Я использую последний Alloy 4.2, только что скачанный. Когда я запускал его, было примечание о том, что JNI не поддерживается. Если мне нужно скачать другую конфигурацию, чтобы увидеть unsat core, подскажите, пожалуйста, как это сделать. В противном случае, как мне отлаживать файл Alloy?

введите здесь описание изображения

Это была последняя стабильная версия. Я также только что попробовал последний эксперимент и получил похожие (не идентичные) результаты. Однако обратите внимание на это предупреждение:

Alloy Analyzer 4.2_2015-02-22 (build date: 2015-02-22 18:21 EST)

Warning: JNI-based SAT solver does not work on this platform.
This is okay, since you can still use SAT4J as the solver.
For more information, please visit http://alloy.mit.edu/alloy4/
.

Warning: Alloy4 defaults to SAT4J since it is pure Java and very reliable.
For faster performance, go to Options menu and try another solver like MiniSat.
If these native solvers fail on your computer, remember to change back to SAT4J.

person SRobertJames    schedule 25.03.2015    source источник
comment
Чтобы включить JNI, вам понадобится собственная библиотека, добавленная в ваш LD_LIBRARY_PATH.   -  person Elliott Frisch    schedule 28.03.2015
comment
@ElliottFrisch Спасибо. Не могли бы вы уточнить? Какую нативную библиотеку вы имеете в виду? Что эквивалентно LD_LIBRARY_PATH в Windows для использования в JRE?   -  person SRobertJames    schedule 29.03.2015
comment
Нативная библиотека, которую поддерживает программа. То, что JNI позволяет делать Java, вызывает собственные библиотеки. Полагаю, вы ищете unsat.   -  person Elliott Frisch    schedule 29.03.2015


Ответы (1)


Вы видите только SAT4J? Просто проверка работоспособности: вы нажимаете на меню «Параметры», а затем на строку с надписью «Решатель: SAT4J», верно?

Когда вы это сделаете, вы должны получить подменю со списком решателей SAT; в моей системе это выглядит примерно так:

Снимок экрана с параметрами Alloy 4.2 / меню

Надеюсь, это поможет. Если это не так, я ожидаю, что следующее, что нужно спросить, это то, что показывает диалоговое окно About Alloy. (Для сравнения: только что приведенный скриншот был произведен билдом 2014-05-16.)

[Постскриптум]

Ах. Верно. Ваш опыт ясно показывает, что подразумевается под примечанием в документации. :

По умолчанию выбран чисто Java-решатель "SAT4J", поскольку он работает на любой платформе и в любой операционной системе. Если вам требуется более высокая производительность, вы можете попробовать один из собственных решателей, например MiniSat или ZChaff.

Из этого (сейчас) я делаю вывод, что решатели, отличные от SAT4J, не все (или, возможно, некоторые из них) являются чистой Java, а требуют собственного интерфейса (т.е. интерфейса для кода, написанного на других языках). Если JNI не работает на вашей платформе, как указано в предупреждающем сообщении, SAT4J может быть единственным доступным решателем.

Возможно, кто-то из команды разработчиков сможет прокомментировать.


Поэтому, если вы не можете переключиться на Unsat Core, чтобы выяснить, почему в вашей модели нет экземпляров, вы вынуждены использовать другие методы.

Один метод очевиден (хотя и довольно утомителен): бинарный поиск по набору ограничений в модели.

Если вы понимаете, о чем я, и не можете придумать лучшего подхода, то пока и удачи.

Если вы понимаете, что я имею в виду, и можете придумать лучший подход, расскажите остальным, что это такое.

Если вы не понимаете, что я имею в виду, метод, который я имею в виду, напоминает широко используемый метод поиска синтаксических ошибок в программе, когда вы понятия не имеете, где они находятся. (Смутная память подсказывает мне, что я, возможно, узнал об этом, читая книгу Джона Бентли Programming Pearls. Возможно.) Вот один из способов сделать это.

  1. Сделайте резервную копию модели в ее текущем состоянии. Он понадобится вам позже, когда вы начнете задаваться вопросом, изменилась ли та или иная крошечная деталь или нет.

  2. Измените все ваши именованные факты на именованные предикаты. (Если окажется необходимым, также измените все свои подписные факты и даже другие ограничения на именованные предикаты. Я делаю это только тогда, когда у меня нет альтернативы, так как это требует переписывания большей части модели, чем я. хотел бы.)

  3. Создайте новый предикат И объедините все ваши именованные предикаты. В дальнейшем я буду называть это AllTogetherNow. Он будет иметь форму что-то вроде

    pred AllTogetherNow {
      P1
      P2
      P3
      ...
      Pn
    }
    

На этом этапе ваша модель должна состоять из сигнатур (с фактами сигнатуры или без них) и именованных предикатов, а не из фактов.

  1. Убедитесь, что модель может быть создана, когда AllTogetherNow не соответствует действительности.

    Если его невозможно создать, а у вас все еще есть сигнатурные факты, вернитесь к шагу 2 и вынесите некоторые или все из них. Пересмотрите AllTogetherNow, чтобы включить новые факторизованные ограничения.

    Если его невозможно создать и у вас нет никаких фактов подписи, вернитесь к шагу 2 и вынесите ограничения, неявные в ограничениях количества элементов для ваших подписей. Пересмотрите AllTogetherNow, чтобы включить новые факторизованные ограничения.

  2. Проверьте, можно ли создать экземпляр AllTogetherNow.

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

  3. Закомментируйте половину предикатов, находящихся в настоящее время в AllTogetherNow, выбранных либо хитростью, либо случайным образом.

  4. Проверьте, можно ли создать экземпляр AllTogetherNow.

    Если это невозможно, то какое-то подмножество предикатов, действующих в настоящее время в AllTogetherNow, содержит противоречие. Вернитесь к шагу 6, чтобы закомментировать еще несколько предикатов.

    Если теперь можно создать экземпляр AllTogetherNow, то некоторое подмножество предикатов, которые вы только что закомментировали, является причиной того, что модель не может быть создана в том виде, в каком она была написана изначально. Перейдите к шагу 8.

  5. Раскомментируйте половину ограничений, закомментированных в настоящее время в AllTogetherNow, выбранных либо случайно, либо хитростью. Вернитесь к шагу 7.

Мой опыт показывает, что несколько циклов по шагам 6-8 обычно помогают сосредоточить мое внимание достаточно, чтобы я мог в конечном итоге увидеть, в чем заключается противоречие. Основные трудности, с которыми я столкнулся (YMMV), заключаются в том, что (1) первоначальный набросок модели не ограничивается одним противоречием, (2) противоречия могут возникать из-за неудачных комбинаций предикатов, которые по отдельности безвредны, и (3) существует может быть более чем один способ создать противоречивую комбинацию (предикаты A, B, C и D хороши каждый; A фатален в сочетании с B или C...).

Одна психологическая трудность, которая может возникнуть, заключается в том, что противоречия возникают не в «интересной» части модели, а в попытке подготовить почву для интересных вопросов. Я не знаю другого лекарства от этого, кроме как сказать себе, что любое неожиданное противоречие автоматически интересно и стоит того, чтобы на него потратить время. Иногда мне удается себя уговорить.

person C. M. Sperberg-McQueen    schedule 26.03.2015