合金 - 找不到核心

时间:2015-03-25 23:49:34

标签: alloy

我有一个"没有找到实例"合金文件,并想调试它。文档说要转到选项并选择SAT Solver>造成不满意核心。然而,我没有看到,只有SAT4J。

我正在运行最新的Alloy 4.2,刚刚下载。当我运行时,有一条关于不支持JNI的说明。如果我需要下载不同的配置以查看不满核心,请告诉我该怎么做。否则,我该如何调试Alloy文件?

enter image description here

那是最新的稳定。我也尝试了最新的实验,并得到了相似(不完全相同)的结果。不过请注意这个警告:

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.

1 个答案:

答案 0 :(得分:0)

你只看到SAT4J?只是一个完整性检查:你点击选项菜单,然后在读取Solver:SAT4J的行上,对吗?

当你这样做时,你应该得到一个带有SAT求解器列表的子菜单;在我的系统上,它看起来像这样:

Screen shot of Alloy 4.2 Options / Solve menu

我希望这会有所帮助。如果它没有,我希望接下来要问的是构建About Alloy对话框的内容。 (为了比较:刚刚给出的屏幕截图是由2014-05-16的版本制作的。)

[后记]

阿。对。您的经验清楚地表明了the documentation中的评论意味着什么:

  

默认情况下,纯Java解算器" SAT4J"因为它运行在每个平台和操作系统上而被选中。如果您需要更快的性能,可以尝试使用MiniSat或ZChaff等原生求解器。

我从那里(现在)推断出除了SAT4J以外的解算器并不是所有(或者可能是其中任何一个)纯Java,而是需要一个本地接口(即用其他语言编写的代码接口)。如果JNI无法在您的平台上运行,正如您的警告消息所示,SAT4J可能是唯一可用的解算器。

也许开发团队的某个人可以发表评论。


因此,如果您无法切换到Unsat Core作为查找模型没有实例的原因的方法,那么您将被抛回其他方法。

一种方法很明显(虽然有点单调乏味):通过模型中的约束集进行二元搜索。

如果你知道我的意思,并且无法想出更好的方法,那么这么久就会好运。

如果您知道我的意思并且可以想出更好的方法,请告诉我们其他人它是什么。

如果你不知道我的意思,我想到的方法类似于一种广泛使用的技术,当你不知道它们在哪里时,它会在程序中找到语法错​​误。 (一个昏暗的记忆告诉我,我可能从阅读Jon Bentley的 Programming Pearls 中学到了这一点。也许。)这是一种方法。

  1. 以当前状态备份模型。当你开始怀疑这个或那个微小的细节是否发生了变化时,你以后会需要它。

  2. 将所有命名事实更改为命名谓词。 (如果证明有必要,也可以将所有签名事实,甚至其他约束更改为命名谓词。我只能在没有其他选择时执行此操作,因为它需要重写更多的模型而不是我想要。)

  3. 创建一个新的谓词,并将所有命名谓词进行AND运算。在下文中,我将调用此AllTogetherNow。它将有一个类似

    的形式
    pred AllTogetherNow {
      P1
      P2
      P3
      ...
      Pn
    }
    
  4. 此时,您的模型应该包含签名(带或不带签名事实)和命名谓词,没有事实。

    1. 检查以确保在AllTogetherNow不为真时可以实例化模型。

      如果无法实例化,并且您仍然拥有签名事实,则返回步骤2并将其中的部分或全部计算在内。修改AllTogetherNow以包括新制约的约束。

      如果无法实例化,并且您没有任何签名事实,则返回步骤2并将您签名的基数约束中隐含的约束分解出来。修改AllTogetherNow以包含新制约的约束。

    2. 检查AllTogetherNow是否可以实例化。

      如果可以实例化,那么原始模型和现在之间的某些内容已经发生了变化。改变的是原始模型中的错误。

    3. 注释掉当前生活在AllTogetherNow中的一半谓词,通过狡猾或随机选择。

    4. 检查AllTogetherNow是否可以实例化。

      如果不能,则AllTogetherNow中当前存在的谓词的某个子集包含矛盾。返回步骤6以注释掉更多谓词。

      如果现在可以实例化AllTogetherNow,那么您刚刚注释掉的谓词的某个子集就是模型无法像最初编写的那样实例化的原因。继续执行第8步。

    5. 取消注释当前在AllTogetherNow中注释掉的一半约束,无论是随机选择还是通过狡猾选择。返回第7步。

    6. 我的经验是,通过步骤6-8的一些循环通常有助于集中我的注意力,以至于我最终可以看到矛盾所在。我所经历的主要并发症(YMMV)是:(1)初始草案模型并不局限于单一矛盾,(2)矛盾可能源于谓词的不愉快组合。单独无害,(3)可能有不止一种方法来构建一个矛盾的组合(谓词,A,B,C和D都是罚款; A与B 一起是致命的C ...)。

      可能出现的一个心理困难是矛盾不是出现在“有趣的”中。模型的一部分,但试图为有趣的问题设置阶段。除了告诉自己任何意想不到的矛盾是自动有趣的,并且值得花时间,我不知道任何治愈方法。有时候我能够说服自己。