Alloy中的类型错误

时间:2014-05-17 05:18:39

标签: types alloy

我有一个Alloy规范来表示java编程语言的一个子集。下面我们有这个模型的一部分:

  abstract sig Type {}

  one sig void_ extends Type {}

  abstract sig PrimitiveType extends Type {}

  one sig Int_, Long_ extends PrimitiveType {}

  sig Method {
       id : one MethodId,
       param: lone Type,
       acc: lone Accessibility,
       return: one Type,
       b: one Body
    }{
     (return=void_) => ( 
        ( (b=ConstructorMethodInvocation) => (b.cmethodInvoked).return = void_) ||
        ( (b=MethodInvocation) => ((b.id_methodInvoked).return = void_) ) 
                       )
    }

    abstract sig Body {}

    sig MethodInvocation extends Body {
        id_methodInvoked : one Method,
        q: lone Qualifier
    }

    sig ConstructorMethodInvocation extends Body {
        id_Class : one Class,
        cmethodInvoked: one Method
    }{
        this.@cmethodInvoked.acc != private_
        this.@cmethodInvoked in ((this.@id_Class).*extend).methods
    }

在此代码中,Method签名中存在类型错误,即:

This cannot be a legal relational join where
left hand side is this . (this/Method <: b) .
(this/ConstructorMethodInvocation <: cmethodInvoked) (type =
{this/Method})
right hand side is this . (this/Method <: return) (type =
{this/Type})

我不明白为什么。

提前致谢,

1 个答案:

答案 0 :(得分:1)

问题是“返回”是隐含的范围,因此表示“this.return”的结果,即“return”已经是“Type”,而不是“Method”到“Type”的关系。

一种可能的解决方案是通过使用单独的“事实”部分来避免隐式范围,并明确量化所有“方法”:

fact {
  all m: Method | (m.return = void_ .....
}