查找Alloy谓词执行的实例

时间:2016-06-09 12:21:19

标签: alloy

是否可以搜索从给定状态到另一个约束状态的谓词执行(谓词应用程序序列)的实例?

一个有点相关的问题:有没有办法将谓词作为参数传递给另一个谓词?

1 个答案:

答案 0 :(得分:1)

你并不完全清楚自己在寻找什么,至少对于像我这样认为谓词是评估而不是执行的东西的读者来说

  

是否可以搜索谓词执行的实例 ...?

听起来好像在这里,你正在寻找杰克逊在软件抽象中讨论的第2.4节"执行痕迹"和其他地方(参见"追踪"在索引中)。

的基本思路是
  • 定义描述初始状态的谓词(杰克逊的例子称之为 init
  • 定义一组描述从州到州的可能转换的谓词
  • 对州施加总排序
  • 定义一个谓词,用于检查大致采用

    形式的执行跟踪
    pred traces {
      init [first] /* 'first' is defined by util/ordering[State] */
      all s : State - last 
        | let s' = next[s]
        | Possible_Transition[s, s']
    }
    

当然可能有很多变化。

  

有没有办法将谓词作为参数传递给另一个谓词?

不,是的。

不,因为Alloy使用一阶逻辑;谓词的所有参数都是原子集,可以扩展定义。

是的,因为当然可以通过制作一个将1:1映射到一组谓词的签名,并在每个人想要传递谓词时传递该签名的原子来重新确定谓词。考虑到有人想要以这种方式实现的有限数量的谓词,这总是可行的。 (请原谅我,如果这一点和下面的解释对你来说是显而易见的;我记得有一段时间他们对我来说并不明显,我希望Stack Overflow有一些读者对他们来说并不明显。)

假设我们有两个谓词PQ,每个谓词都采用a类型的原子参数Atom。我们希望定义一个元谓词M,它接受​​一个原子x和一个谓词Y并返回Y[x]的值。

// First some scaffolding 
sig Atom {}
pred P [a : Atom] { ... // whatever you like }
pred Q [a : Atom] { ... // whatever ... }

// Now the heart of the matter
abstract sig reification {}
one sig p, q extends reification {}

pred M [x : Atom, Y : reification] {
  (Y = p) implies P[x]
  else (Y = q) implies Q[x]
  else x != x
}

根据您希望将谓词作为参数传递的原因,您可能会将此作为一种方式,或者作为您可能不想这样做的原因的演示。如果高阶谓词是您想要考虑的关键部分,那么像Alloy这样的一阶系统可能不是最好的匹配。

但与其他一阶系统一样,Alloy可以通过一些小心和努力来支持高阶参数。当我们应用Alloy来表明给定的设计具有属性P时,我们在最常见的情况下支持声称设计的所有正确实现也将具有属性P,声称在Alloy中可能采用{{1 }}。但实现是(略微简化)输入和输出之间的关系。所以关于实现的任何陈述都是二阶索赔。因此,在概括给定设计的所有实现时,我们正在制作一阶参数(以Alloy模型表示)以支持二阶索赔。

如果您对使用Alloy对二阶命题进行论证非常感兴趣,您可以参考Jackson的书中的第3.2.3,5.2.2和5.3节。