是否可以搜索从给定状态到另一个约束状态的谓词执行(谓词应用程序序列)的实例?
一个有点相关的问题:有没有办法将谓词作为参数传递给另一个谓词?
答案 0 :(得分:1)
你并不完全清楚自己在寻找什么,至少对于像我这样认为谓词是评估而不是执行的东西的读者来说
是否可以搜索谓词执行的实例 ...?
听起来好像在这里,你正在寻找杰克逊在软件抽象中讨论的第2.4节"执行痕迹"和其他地方(参见"追踪"在索引中)。
的基本思路是定义一个谓词,用于检查大致采用
形式的执行跟踪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有一些读者对他们来说并不明显。)
假设我们有两个谓词P
和Q
,每个谓词都采用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节。