查找 Alloy 谓词执行的实例
Finding instances of Alloy predicate executions
是否可以搜索从给定状态到另一个约束状态的谓词执行(谓词应用程序序列)的实例?
一个有点相关的问题:有没有办法将谓词作为参数传递给另一个谓词?
您并不完全清楚您在寻找什么,至少对于像我这样的 reader 来说,我认为谓词是 评估 的东西,而不是 执行.
Is it possible to search for instances of predicate executions ... ?
听起来好像您正在寻找 Jackson 的 Software Abstractions 第 2.4 节 "Execution traces" 和其他地方讨论的那种东西(参见 "trace"在索引中)。基本思路是
- 定义一个描述初始状态的谓词(Jackson 的示例称之为 init)
- 定义一组谓词,描述从一个状态到另一个状态的可能转换
- 对状态进行总排序
定义一个谓词来检查大致采用
形式的执行跟踪
pred traces {
init [first] /* 'first' is defined by util/ordering[State] */
all s : State - last
| let s' = next[s]
| Possible_Transition[s, s']
}
许多变化当然是可能的。
is there a way to pass a predicate as argument to another predicate?
否,是。
否,因为Alloy使用一阶逻辑;谓词的所有参数都是原子集,扩展定义。
是的,因为我们当然可以通过制作一个将 1:1 映射到一组谓词的签名来具体化谓词,并在任何时候想要传递谓词时传递该签名的原子。鉴于人们想要以这种方式具体化的谓词数量有限,这总是可能的。 (如果这一点和下面的解释对你来说非常明显,请原谅;我记得有一段时间它们对我来说不是非常明显,我希望 Stack Overflow 有一些 reader 对他们来说它们并不明显.)
假设我们有两个谓词 P
和 Q
,每个谓词都有一个类型为 Atom
的原子参数 a
。我们希望定义一个元谓词 M
,它接受一个原子 x
和一个谓词 Y
和 returns Y[x]
.[=23 的值=]
// 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 中的声明可能采用 all i : Implementation | correctly_implements_design[i] implies has_property_P[i]
的形式。但是实现是(稍微简化)输入和输出之间的关系。因此,任何关于实现的陈述都是二阶声明。因此,在概括给定设计的所有实现时,我们正在制作一阶参数(在 Alloy 模型中表示)来支持二阶声明。
如果您对使用 Alloy 对二阶命题进行论证有浓厚的兴趣,您将需要查阅 Jackson 书中的第 3.2.3、5.2.2 和 5.3 节。
是否可以搜索从给定状态到另一个约束状态的谓词执行(谓词应用程序序列)的实例?
一个有点相关的问题:有没有办法将谓词作为参数传递给另一个谓词?
您并不完全清楚您在寻找什么,至少对于像我这样的 reader 来说,我认为谓词是 评估 的东西,而不是 执行.
Is it possible to search for instances of predicate executions ... ?
听起来好像您正在寻找 Jackson 的 Software Abstractions 第 2.4 节 "Execution traces" 和其他地方讨论的那种东西(参见 "trace"在索引中)。基本思路是
- 定义一个描述初始状态的谓词(Jackson 的示例称之为 init)
- 定义一组谓词,描述从一个状态到另一个状态的可能转换
- 对状态进行总排序
定义一个谓词来检查大致采用
形式的执行跟踪pred traces { init [first] /* 'first' is defined by util/ordering[State] */ all s : State - last | let s' = next[s] | Possible_Transition[s, s'] }
许多变化当然是可能的。
is there a way to pass a predicate as argument to another predicate?
否,是。
否,因为Alloy使用一阶逻辑;谓词的所有参数都是原子集,扩展定义。
是的,因为我们当然可以通过制作一个将 1:1 映射到一组谓词的签名来具体化谓词,并在任何时候想要传递谓词时传递该签名的原子。鉴于人们想要以这种方式具体化的谓词数量有限,这总是可能的。 (如果这一点和下面的解释对你来说非常明显,请原谅;我记得有一段时间它们对我来说不是非常明显,我希望 Stack Overflow 有一些 reader 对他们来说它们并不明显.)
假设我们有两个谓词 P
和 Q
,每个谓词都有一个类型为 Atom
的原子参数 a
。我们希望定义一个元谓词 M
,它接受一个原子 x
和一个谓词 Y
和 returns Y[x]
.[=23 的值=]
// 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 中的声明可能采用 all i : Implementation | correctly_implements_design[i] implies has_property_P[i]
的形式。但是实现是(稍微简化)输入和输出之间的关系。因此,任何关于实现的陈述都是二阶声明。因此,在概括给定设计的所有实现时,我们正在制作一阶参数(在 Alloy 模型中表示)来支持二阶声明。
如果您对使用 Alloy 对二阶命题进行论证有浓厚的兴趣,您将需要查阅 Jackson 书中的第 3.2.3、5.2.2 和 5.3 节。