将高阶表达式转换为合金一阶逻辑

时间:2014-12-17 00:27:24

标签: logic alloy first-order-logic

我想在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表达式时以及当我们不能这样做时,是否有任何指导?

由于

2 个答案:

答案 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类型的元素更改QArrowQArrow,并更改{{ 1}}到univ->univ,意图是State ->State关系中的对。

event