Alloy 合金分析仪:如何定义;“运行”;直到条件成立?
我有一个模型来指定任务和任务之间的关系。事实上,我有不同的关系,但为了更简单,我们假设只有一种关系。更简单的代码如下所示:Alloy 合金分析仪:如何定义;“运行”;直到条件成立?,alloy,Alloy,我有一个模型来指定任务和任务之间的关系。事实上,我有不同的关系,但为了更简单,我们假设只有一种关系。更简单的代码如下所示: open util/ordering[Time] sig Time {} abstract sig State {} lone sig Enabled extends State {} lone sig Disabled extends State {} sig Task { state : State one -> Time } sig Relati
open util/ordering[Time]
sig Time {}
abstract sig State {}
lone sig Enabled extends State {}
lone sig Disabled extends State {}
sig Task {
state : State one -> Time
}
sig Relation {
relation : Task one -> Task,
}
fact noLoop {
no a : Task | a not in a.^(Relation.relation)
}
fact trace {
init[first[]]
all t : Time - last[] |
let t' = t.next[] |
some a : Task |
execute[a, t, t']
}
pred init [t : Time] {
Task.state.t = Enabled
}
pred execute[exec : Task, t, t' : Time] {
exec.state.t = Enabled
let
disabledTasks =
exec
+ {a : Task | let r = Relation | a in exec.(r.relation)}
+ {a : Task | a.state.t = Disabled},
otherTasks = {a : Task | a not in disabledTasks}
|
disabledTasks.state.t' = Disabled
and
otherTasks.state.t' = Enabled
}
最初,所有任务都处于启用状态。执行时,任务和所有相关任务都将进入禁用状态
我知道我可以找到模型运行的实例,例如:
run execute for 6
这将仅显示具有6个时间步的实例。有时,在第6个时间步结束时,将启用任务。我想知道是否有一种方法可以让Alloy Analyzer运行execute谓词,直到所有任务都被禁用。实际上,我想展示的是,这个模型总是可以实现所有任务都被禁用的状态(即使我需要定义一个有限的范围)
感谢所有的帮助。运行的唯一参数是要运行的谓词的名称和作用域 所以不,这不能用你描述的方式来做。然而,问题不在于
run
对两个参数的语法限制;问题是,与你不同,Alloy没有内在的时间概念,因此“直到”在向Alloy描述事物时不是一个有用的概念
另一方面,如果您希望运行模拟直到达到某种状态,您所要做的就是在命名谓词中描述该状态,然后运行该谓词。因此:定义一个表示“所有任务都被禁用”的谓词;称之为all_done
。然后定义谓词
pred interesting {
execute and all_done
}
run interesting for ...
祝你好运。我也接受对我的模型的改进建议。