飞机飞过一系列腿。每条腿必须跟着适当的下一条腿。 NextLegTable
包含适当的(Leg -> Leg
)对。
因此,飞行中的每对腿必须在NextLegTable
中。我在下面的Fact
中实现了这个约束。
以下是我的实施说明:每对腿(leg
和leg'
),indexOf(leg) + 1 = indexOf(leg')
,必须位于NextLegTable
。显然这种方法是错误的,因为我没有实例。"
什么是正确的方法?如果有一条腿,我如何在序列中找到它的下一条腿?
sig Flight {
legs: seq Leg
}
sig Leg {}
one sig NextLegTable {
nextLeg: Leg -> Leg
}
fact Flight_legs_In_NexLegTable {
all f: Flight |
all leg, leg': Leg {
leg in f.legs.elems
leg' in f.legs.elems
plus[f.legs.idxOf[leg], 1] = f.legs.idxOf[leg']
(leg -> leg') in NextLegTable.nextLeg
}
}
pred Show (f: Flight) {#f.legs > 1}
run Show
答案 0 :(得分:1)
以下两行:
plus[f.legs.idxOf[leg], 1] = f.legs.idxOf[leg']
(leg -> leg') in NextLegTable.nextLeg
此解决方案目前正在尝试查找Legs
sig中还显示跟随另一个Flight
的{{1}}的所有Leg
的实例。但是,您还没有告诉它实际将这些映射放入表中。您需要说NextLegTable
跟随另一个Leg
后,将Leg
放入NextLegTable:
Leg -> Leg'
这告诉程序在满足第一个条件时将映射放入表中。