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

时间:2017-04-09 19:43:40

标签: alloy

飞机飞过一系列腿。每条腿必须跟着适当的下一条腿。 NextLegTable包含适当的(Leg -> Leg)对。

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

以下是我的实施说明:每对腿(legleg'),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

1 个答案:

答案 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'

这告诉程序在满足第一个条件时将映射放入表中。