我发现很难理解跟踪和投影在合金中的工作方式。我无法得到理想的结果。
在下面的示例中,我尝试通过课程进行投影,看看学生是如何注册的,但似乎他们从来没有任何关系。
当我使用普通视图(没有投影)时,我得到了多个很好的解决方案..但我想知道如何使用跟踪(追溯)创建它们的方式(一步一步)。
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
答案 0 :(得分:0)
我不确定你想要完成什么。 我认为你的模型中缺少时间的概念。 你通常希望拥有一个改变这个时间概念的特定课程的名单。
似乎你绕过了这个"良好做法"通过直接订购课程概念,所以我想你想要第一个课程没有学生,第二个课程要有一个新的等等....(这没有多大意义,但是nvm)。
我想你失望的根源在于,当你对课程进行预测时,你会发现当你从课程走向课程时,课程名单中的学生人数会有所不同,而这种情况并没有发生。 / p>
原因是当你写一些s:Student |注册[c,c',s]你希望s是全新的,而它只意味着至少有一个。 我建议你写一些:s:Student |不在c.roster和注册[c,c',s]