在Alloy中使用谓词

时间:2014-08-01 18:40:58

标签: function reusability alloy predicates

我正在尝试从另一个使用两个谓词(例如,methodsWiThSameParameters和methodsWiThSameReturn)(即checkOverriding)但是我收到以下错误:"没有命令要执行"。有线索吗? 我也尝试使用函数但没有成功,无论是由于语法还是函数都没有返回布尔值。

它们是Alloy中指定的java元模型的一部分,正如我在之前的一些问题中所评论的那样。

pred checkOverriding[]{
//check accessibility of methods involved in overriding
  no c1, c2: Class {
    c1=c2.^extend
    some m1, m2:Method |
          m1 in c1.methods && m2 in c2.methods && m1.id = m2.id 
          && methodsWiThSameParameters[m1, m2] && methodsWiThSameReturn[m1, m2] && 
               ( (m1.acc = protected && (m2.acc = private_ || #(m2.acc) = 0 )) ||
                 (m1.acc = public && (m2.acc != public || #(m2.acc) = 0 )) ||
                 (#(m1.acc) = 0 && m2.acc != private_ )
               )
      }
    }

pred methodsWiThSameParameters [first,second:Method]{
    m1.param=m2.param || (#(m1.param)=0 && #(m2.param)=0)  
}
pred methodsWiThSameReturn [first, second:Method]{
    m1.return=m2.return || (#(m1.return)=0 && #(m2.return)=0) 
}

谢谢你的答复,C.M.Sperberg-McQueen先生,但我认为我的问题不够明确。

我的谓词,比如checkOverriding,正在从这样的事实中调用:

fact chackJavaWellFormednessRules{
    checkOverriding[]
}

因此,我继续不理解错误:"没有命令可以执行"

1 个答案:

答案 0 :(得分:3)

您已定义谓词;它们具有纯粹的声明性语义,它们在模型的某些子集中是正确的,在互补子集中是假的。

如果您希望分析仪做任何事情,您需要给它一个指令;搜索谓词实例的指令是run。所以你想说点什么

run methodsWithSameParameters for 3

run methodsWithSameParameters for 5
run methodsWithSameReturn for 5

请注意,您可以在Alloy模型中使用多条指令;分析器可让您告诉它执行哪个。


[附录]

Alloy Analyzer将关键字runcheck(仅限他们)视为'命令'。根据您的描述,听起来好像您没有在模型中出现过这些关键字。

如果您只想查看Alloy模型的某些实例(以验证模型不是自相矛盾的),那么最简单的方法是在模型中添加以下内容:

pred show {}
run show for 3

或者,如果您已有命名谓词,则只需为该谓词添加run命令:

run checkOverriding 

但是如果模型中没有以runcheck开头的条款,则表示您没有“命令”'在模型中。

你说你已经定义了一个谓词(checkOverriding),然后在一个事实中指明该谓词总是被满足。这相当于说谓词checkOverriding总是正确的(并且可能通过使checkOverriding成为事实而不是谓词来完成),但它具有纯粹的声明性含义,并且它没有算作"命令"。如果希望Alloy查找谓词的实例,则必须使用run命令;如果你想让Alloy找到断言的反例,你必须使用check命令。