合金痕迹和投影问题

时间:2015-06-10 15:05:45

标签: reverse-engineering projection alloy traceback

我发现很难理解跟踪投影合金中的工作方式。我无法得到理想的结果。

在下面的示例中,我尝试通过课程进行投影,看看学生是如何注册的,但似乎他们从来没有任何关系。

当我使用普通视图(没有投影)时,我得到了多个很好的解决方案..但我想知道如何使用跟踪(追溯)创建它们的方式(一步一步)。

open util/ordering[Course]
sig Student {}
sig Course {
    roster : set Student
}

pred Enroll (c, c' : Course, sNew : Student) {
    c'.roster = c.roster + sNew
}

pred init(c: Course) {
    no c.roster
}

fact traces {
    init[first]
    all c: Course - last | let c' = next[c] |
    some s: Student | Enroll[c, c', s]
}

pred show {}
run show for 5

1 个答案:

答案 0 :(得分:0)

我不确定你想要完成什么。 我认为你的模型中缺少时间的概念。 你通常希望拥有一个改变这个时间概念的特定课程的名单。

似乎你绕过了这个"良好做法"通过直接订购课程概念,所以我想你想要第一个课程没有学生,第二个课程要有一个新的等等....(这没有多大意义,但是nvm)。

我想你失望的根源在于,当你对课程进行预测时,你会发现当你从课程走向课程时,课程名单中的学生人数会有所不同,而这种情况并没有发生。 / p>

原因是当你写一些s:Student |注册[c,c',s]你希望s是全新的,而它只意味着至少有一个。 我建议你写一些:s:Student |不在c.roster和注册[c,c',s]