如何获取 seq(序列)中的下一项?

How to get the next item in a seq (sequence)?

一架飞机飞过一系列的腿。每条腿之后都必须有适当的下一条腿。 NextLegTable 包含适当的 (Leg -> Leg) 对。

因此,飞行中的每对腿都必须在 NextLegTable 中。我在下面 Fact 中实现了这个约束。

这里是我的实现的描述:每对腿(legleg'),使得 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。