[更新] 为了好玩,我在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模型中使用它吗?
答案 0 :(得分:2)
我的猜测是它的含义在工具中是硬编码的,就像定义fun / sub和fun / add一样。
至于为什么我不清楚。也许是出于优化的缘故?
答案 1 :(得分:2)
关键字 private 会在调用模块时使签名不可见,并且可以在任何模型中使用。 pred / foo模型是内置的,不应在用户级模型中使用。