如何获取 seq(序列)中的下一项?
How to get the next item in a seq (sequence)?
一架飞机飞过一系列的腿。每条腿之后都必须有适当的下一条腿。 NextLegTable
包含适当的 (Leg -> Leg
) 对。
因此,飞行中的每对腿都必须在 NextLegTable
中。我在下面 Fact
中实现了这个约束。
这里是我的实现的描述:每对腿(leg
和 leg'
),使得 indexOf(leg) + 1 = indexOf(leg')
,必须在 NextLegTable
中。显然这种方法是错误的,因为我得到 "no instances."
什么是正确的做法?给定一条腿,我如何找到序列中的下一条腿?
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
这些是要查看的两行:
plus[f.legs.idxOf[leg], 1] = f.legs.idxOf[leg']
(leg -> leg') in NextLegTable.nextLeg
此解决方案目前正试图找到一个实例,其中 Flight
中跟在另一个 Leg
之后的所有 Legs
也都显示在 NextLegTable
信号中。但是,您还没有告诉它实际将这些映射放入 table。你需要说当一个 Leg
跟随另一个 Leg
时,将 Leg -> Leg'
放入 NextLegTable:
(plus[f.legs.idxOf[leg], 1] = f.legs.idxOf[leg']) =>
(leg -> leg') in NextLegTable.nextLeg
这告诉程序只要满足第一个条件就将映射放入 table。
一架飞机飞过一系列的腿。每条腿之后都必须有适当的下一条腿。 NextLegTable
包含适当的 (Leg -> Leg
) 对。
因此,飞行中的每对腿都必须在 NextLegTable
中。我在下面 Fact
中实现了这个约束。
这里是我的实现的描述:每对腿(leg
和 leg'
),使得 indexOf(leg) + 1 = indexOf(leg')
,必须在 NextLegTable
中。显然这种方法是错误的,因为我得到 "no instances."
什么是正确的做法?给定一条腿,我如何找到序列中的下一条腿?
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
这些是要查看的两行:
plus[f.legs.idxOf[leg], 1] = f.legs.idxOf[leg']
(leg -> leg') in NextLegTable.nextLeg
此解决方案目前正试图找到一个实例,其中 Flight
中跟在另一个 Leg
之后的所有 Legs
也都显示在 NextLegTable
信号中。但是,您还没有告诉它实际将这些映射放入 table。你需要说当一个 Leg
跟随另一个 Leg
时,将 Leg -> Leg'
放入 NextLegTable:
(plus[f.legs.idxOf[leg], 1] = f.legs.idxOf[leg']) =>
(leg -> leg') in NextLegTable.nextLeg
这告诉程序只要满足第一个条件就将映射放入 table。