我想在Alloy中的一个集合和一个关系之间写一个双射。
例如,在下面的代码中,我想将ref定义为QArrow和event之间的双射。因此,我写了 bij 这一事实。但是合金抱怨说,因为我认为我量化了关系,这使得 bij 事实中的两个表达式都是一个更高阶的逻辑表达式:
sig State {event : set State}
sig QArrow {ref: univ ->univ}
fact bij {
all q:QArrow | one a: univ->univ | Q[a] and q.ref=a
all a: univ->univ | one q:QArrow | Q[a] and q.ref=a
}
pred Q (a: univ->univ){
a in event
}
如何将这些表达式转换为一阶逻辑表达式?
另外,一般来说,当我们可以将HOL表达式转换为FOL表达式时以及当我们不能这样做时,是否有任何指导?
由于
答案 0 :(得分:0)
这是这个问题的解决方案(我在数学符号交换here中用数学符号发布了问题并得到了解决方案)我将它转换为Alloy。
sig State {event : State}
sig QArrow{ref: State -> State}
fact {
all q:univ | (q in QArrow implies (some s1,s2:univ | ( (s1->s2 in event)
and (q.ref=s1->s2) and some s3,s4:univ | (( (s3->s4 in event) and (q.ref=s3->s4) )
implies (s1->s2)=(s3->s4) )))) // ref is a function
all q1,q2,s1,s2:univ | (( (q1 in QArrow) and (q2 in QArrow) and
(s1->s2 in event) and (q1.ref=s1->s2) and (q2.ref=s1->s2) ) implies q1=q2) // ref is injective
all s1,s2:univ | (some q:univ | ( ( s1->s2 in event) implies
((q in QArrow) and (q.ref=s1->s2)) )) // ref is surjective
}
在上面的代码中,事实强加 ref 是 QArrow 和关系事件之间的双射函数。
答案 1 :(得分:0)
也可以将量化变量的域限制在相应的范围内:(对于univ
类型的元素更改QArrow
到QArrow
,并更改{{ 1}}到univ->univ
,意图是State ->State
关系中的对。
event