我想对 HTTP 交互进行建模,即一系列 HTTPRequest/HTTPResponse,并且我试图将其建模为转换系统。我使用以下方法在类 State 上定义了一个排序:
open util/ordering[State]
其中状态只是一组消息:
sig State {
msgSet: set Message
}
每对 (HTTPRequest->HTTPResponse) 和 (HTTPResponse->HTTPRequest) 在我的转换系统中都表示为一条规则。这些规则在 Alloy 中表示为谓词,可以让一个状态从一种状态移动到另一种状态。
例如,这是在收到特定 HTTPRequest 后生成 HTTPResponse 的规则:
pred rsp1 [s, s': State] {
one msg: Request, msg':Response | (
// Preconditions (previous Request)
msg.method=get &&
msg.address.url=sample_com &&
// Postconditions (next Response)
msg'.status=OK_200 &&
// previous Request has to be in previous state
msg in s.msgSet &&
// Response generated is added to next state
s'.msgSet = s.msgSet + msg'
}
不幸的是,创建的模型似乎太复杂了:我们有十几个规则(比上面的更复杂,但遵循相同的模式)并且执行速度非常慢。
编辑:特别是,CNF 生成非常慢,而求解需要相当长的时间。
您对如何模拟类似的过渡系统有什么建议吗?
非常感谢!