迭代合金关系

时间:2013-10-29 11:27:51

标签: iteration relation alloy

我有以下签名:

open util/ordering [Graph] as chain

sig Graph { elements : set Node}
sig Node {}
sig Connexion {path : Node  ->  Node}
fact { all c : Connexion | #dom[c.path] = 1}
fact { no c : Connexion | dom[c.path] in ran[c.path]}

其中路径是源节点与一个或多个汇聚节点之间的连接。 连接只有一个源,而接收器中没有源。 这些零件属于更复杂的合金模型。

这是我的问题: 当我想用以下方法迭代路径时:

all p : C1.path | one c : C2 | C2.path = this/associatedPath[p]

其中C1和C2是2个不同的连接集,关联路径是一个返回映射路径到参数路径的函数。

关键是当我只在一个单独的模型中尝试这个部分时,它可以工作。 但是当我尝试更大的模型时,它会让我回头:

Analysis cannot be performed since it requires higher-order
quantification that could not be skolemized.

当一次重复关系时,有什么事情不做吗? 我也尝试将量词全部更改为一些,但每次我引用一个元组时,求解器都会返回此错误。 有没有办法手动搞砸它? 我有什么理由不能操纵表达中的关系吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

你说:“路径是源节点与一个或多个汇聚节点之间的联系”。你的意思是“联系是一条道路......”?无论哪种方式,也许您的Connexion签名可以重写

sig Connexion {from: Node, to: set Node}

这将大大降低复杂性。它可能无法消除问题。为了解决这个问题,你应该对Connexion进行量化:

all c: Connexion | ...