PRISM 属性依赖
简介
在PRISM概率模型检测工具中,属性依赖(Property Dependencies)指的是属性表达式如何引用模型中的变量、常量或其他属性。理解属性依赖是编写正确规范的关键,它直接影响模型检查的准确性和效率。本节将详细介绍PRISM属性依赖的语法规则、常见模式及实际应用。
基本语法结构
PRISM属性规范使用PCTL(概率计算树逻辑)或CSL(连续随机逻辑)语言编写。属性依赖主要通过以下方式体现:
- 引用状态变量:直接使用模型定义的变量名。
- 常量依赖:通过
const
定义的常量。 - 公式复用:通过
formula
定义的子表达式。
示例:简单属性依赖
prism
// 模型变量定义
const int N = 3;
formula all_servers_busy = (s1 + s2 + s3) = N;
// 属性依赖示例:P=? [ F all_servers_busy ]
备注
变量名和公式名区分大小写,且必须与模型定义完全一致。
属性依赖的类型
1. 直接变量引用
直接引用模型中的变量或常量:
prism
// 模型片段
module Example
x : [0..2] init 0;
endmodule
// 属性:检查x最终达到最大值
P=? [ F x=2 ]
2. 公式链式依赖
通过formula
构建多层依赖关系:
prism
formula step1 = x > 0;
formula step2 = step1 & y < 5;
P=? [ F step2 ]
3. 时间依赖属性
在时间界限内引用变量:
prism
P>=0.9 [ U<=10 x=1 ] // 10个时间单位内x保持为1的概率
实际案例:云服务器负载均衡
假设一个云服务器系统包含3个节点,每个节点有忙/闲两种状态。我们想验证“至少两个节点同时忙碌”的概率。
模型定义
prism
const int N = 3;
module Node
[req] !busy -> 0.5 : (busy'=true);
[req] busy -> 1.0 : (busy'=false);
endmodule
// 定义3个节点实例
node1 : Node; node2 : Node; node3 : Node;
// 属性依赖公式
formula two_busy = (node1.busy + node2.busy + node3.busy) >= 2;
属性规范
prism
// 稳态概率
S=? [ two_busy ]
// 瞬时概率(在100个时间步内)
P=? [ F<=100 two_busy ]
常见错误与调试
-
未定义变量:
prismP=? [ F z=1 ] // 错误!z未在模型中定义
-
循环依赖:
prismformula a = b + 1;
formula b = a - 1; // 错误!循环依赖 -
类型不匹配:
prismformula x = true;
P=? [ F x=1 ] // 错误!布尔值不能与数值比较
警告
使用PRISM GUI的“模拟验证”功能可逐步检查属性依赖是否合理。
总结
- 属性依赖是连接模型与规范的核心机制。
- 通过
formula
可实现复杂逻辑的模块化。 - 避免循环依赖和未定义引用是调试关键。
延伸练习
- 修改云服务器案例,添加“至少一个节点空闲”的属性。
- 尝试用
label
替代formula
定义状态条件,比较两者差异。
附加资源
- PRISM手册:Properties章节
- 《Principles of Model Checking》第10章(PCTL/CSL规范)