繁体   English   中英

通过传递闭包以递归方式使用Alloy功能

[英]Using Alloy functions in a recursive way through transitive closures

我正在用Alloy做一个模型来表示Java语言的子集。 下面我们有这个模型的一些元素:

sig Method {
    id : one MethodId,
    param: lone Type,
    return: one Type,
    acc: lone Accessibility,    
    b: one Block
}

abstract sig Expression {}
abstract sig StatementExpression extends Expression {}

sig MethodInvocation extends StatementExpression{
    pExp: lone PrimaryExpression, 
    id_methodInvoked: one Method,
    param: lone Type
}

sig Block {
    statements: seq StatementExpression
}

pred noRecursiveMethodInvocationCall [] {
    no m:Method | m in ^getMethodInvokedInsideBody[m]
}

fun getMethodInvokedInsideBody [m: Method] : Method {
      (univ.(m.b.statements)).id_methodInvoked
}

问题是Block必须同时是StatementExpression的序列,同时应避免对同一方法的递归调用。 因此,我想到了上面的解决方案。

当我尝试生成相应的实例时,出现以下错误类型:

.
Name cannot be resolved; possible incorrect
function/predicate call; perhaps you used ( ) when you
should have used [ ]

This cannot be a correct call to fun
genericLawsMetaModel/javametamodel_withfield_final/getMethodInvokedInsideBody.
The parameters are
m:
{genericLawsMetaModel/javametamodel_withfield_final/Method}
so the arguments cannot be empty.

仍然关于这个问题,我也尝试更改谓词noRecursiveMethodInvocationCall的定义(从而消除了提到的功能):

pred noRecursiveMethodInvocationCall [] {
    no m:Method | m in ^( (univ.(m.b.statements)).id_methodInvoked )
}

但是,发生新的类型错误:

^ can be used only with a binary relation.
Instead, its possible type(s) are:
{genericLawsMetaModel/javametamodel_withfield_final/Method}

有什么线索吗? 我只是想避免对同一方法的递归调用。 提前致谢,

您正在滥用传递闭包运算符^ 后者仅适用于二进制关系,不适用于函数。

因此,我将MethodInvokedInsideBody声明为Method的字段,并按照您的方式在其上使用传递闭包。

希望能帮助到你 :)

编辑:

这是如何使用传递闭包运算符以实现您想要实现的目标的示例:

sig Method {
    id : one MethodId,
    param: lone Type,
    return: one Type,
    acc: lone Accessibility,    
    b: one Block
    methodsInvokedInsideBody: set Method
}

pred noRecursiveMethodInvocationCall{
    no m:Method | m in m.^methodsInvokedInsideBody
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM