我正在尝试从另一个使用两个谓词(例如,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[]
}
因此,我继续不理解错误:"没有命令可以执行"
答案 0 :(得分:3)
您已定义谓词;它们具有纯粹的声明性语义,它们在模型的某些子集中是正确的,在互补子集中是假的。
如果您希望分析仪做任何事情,您需要给它一个指令;搜索谓词实例的指令是run
。所以你想说点什么
run methodsWithSameParameters for 3
或
run methodsWithSameParameters for 5
run methodsWithSameReturn for 5
请注意,您可以在Alloy模型中使用多条指令;分析器可让您告诉它执行哪个。
[附录]
Alloy Analyzer将关键字run
和check
(仅限他们)视为'命令'。根据您的描述,听起来好像您没有在模型中出现过这些关键字。
如果您只想查看Alloy模型的某些实例(以验证模型不是自相矛盾的),那么最简单的方法是在模型中添加以下内容:
pred show {}
run show for 3
或者,如果您已有命名谓词,则只需为该谓词添加run
命令:
run checkOverriding
但是如果模型中没有以run
或check
开头的条款,则表示您没有“命令”'在模型中。
你说你已经定义了一个谓词(checkOverriding
),然后在一个事实中指明该谓词总是被满足。这相当于说谓词checkOverriding
总是正确的(并且可能通过使checkOverriding
成为事实而不是谓词来完成),但它具有纯粹的声明性含义,并且它没有算作"命令"。如果希望Alloy查找谓词的实例,则必须使用run
命令;如果你想让Alloy找到断言的反例,你必须使用check
命令。