什么是订购模块中的pred / totalOrder?

时间:2018-02-11 12:46:11

标签: alloy

[更新] 为了好玩,我在Alloy中实现了pred/totalOrder。这是:

sig elem {}

one sig Ord {
    First: elem,
    Next: elem -> elem
} {
    no a: elem | (a -> First) in Next   // First is the first atom in the list
    // Constrain Next to be ordered like Next in the ordering module
    (elem <: iden) & Next = (none -> none)   // Constrain Next to be irreflexive
    Next.Next & Next = none -> none  // Constrain Next to be intransitive 
    (Next & ~Next) = none -> none    // Constrain Next to be asymmetric
    Next + ~Next + (elem <: iden) != (elem -> elem)   // Constrain Next to be non-connected
    #(elem.Next) = #Next   // Constrain Next to be injective
    #(Next.elem) = #Next    // Constrain Next to be functional
    #Next = minus[#elem,1]  // Constraint Next to contain all atoms in elem
}

fun first: one elem { Ord.First }
fun next : elem->elem { Ord.Next }
fun last: one elem { elem - (next.elem) }
fun prevs [e: elem]: set elem { e.^(~(Ord.Next)) }
fun nexts [e: elem]: set elem { e.^(Ord.Next) }

pred Show {
    #elem > 2
}

run Show

订购模块有:

private one sig Ord {
   First: set elem,
   Next: elem -> elem
} {
   pred/totalOrder[elem,First,Next]
}

什么是pred/totalOrder?它在哪里定义?它有什么作用?我可以在我的Alloy模型中使用它吗?

什么是private?它在哪里定义?它有什么作用?我可以在我的Alloy模型中使用它吗?

2 个答案:

答案 0 :(得分:2)

我的猜测是它的含义在工具中是硬编码的,就像定义fun / sub和fun / add一样。

至于为什么我不清楚。也许是出于优化的缘故?

答案 1 :(得分:2)

关键字 private 会在调用模块时使签名不可见,并且可以在任何模型中使用。 pred / foo模型是内置的,不应在用户级模型中使用。